aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorSascha Brawer <brawer@dandelis.ch>2003-10-21 15:25:46 +0200
committerMichael Koch <mkoch@gcc.gnu.org>2003-10-21 13:25:46 +0000
commit75a5a481c2048242ed62c7355381160aa1369616 (patch)
treea5cbe718127a2194f3229dcdf80e56a45134e51a /libjava
parent63d8374488ca66d8349be60abe4659032a15125b (diff)
downloadgcc-75a5a481c2048242ed62c7355381160aa1369616.zip
gcc-75a5a481c2048242ed62c7355381160aa1369616.tar.gz
gcc-75a5a481c2048242ed62c7355381160aa1369616.tar.bz2
Fix for bug #2944, reported by David Holmes <dholmes@dltech.com.au>
2003-10-21 Sascha Brawer <brawer@dandelis.ch> Fix for bug #2944, reported by David Holmes <dholmes@dltech.com.au> * java/util/logging/ErrorManager.java (everUsed): Made volatile. (error): Synchronize on instance, not class. From-SVN: r72750
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog6
-rw-r--r--libjava/java/util/logging/ErrorManager.java21
2 files changed, 24 insertions, 3 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 67dc182..aa3f79e 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,9 @@
+2003-10-21 Sascha Brawer <brawer@dandelis.ch>
+
+ Fix for bug #2944, reported by David Holmes <dholmes@dltech.com.au>
+ * java/util/logging/ErrorManager.java (everUsed): Made volatile.
+ (error): Synchronize on instance, not class.
+
2003-10-21 Mark Wielaard <mark@klomp.org>
Reported by M.Negovanovic
diff --git a/libjava/java/util/logging/ErrorManager.java b/libjava/java/util/logging/ErrorManager.java
index cc36bf6..7381a52 100644
--- a/libjava/java/util/logging/ErrorManager.java
+++ b/libjava/java/util/logging/ErrorManager.java
@@ -2,7 +2,7 @@
-- a class for dealing with errors that a Handler encounters
during logging
-Copyright (C) 2002 Free Software Foundation, Inc.
+Copyright (C) 2002, 2003 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -100,7 +100,16 @@ public class ErrorManager
public static final int FORMAT_FAILURE = 5;
- private boolean everUsed = false;
+ /**
+ * Indicates whether the {@link #error} method of this ErrorManager
+ * has ever been used.
+ *
+ * Declared volatile in order to correctly support the
+ * double-checked locking idiom (once the revised Java Memory Model
+ * gets adopted); see Classpath bug #2944.
+ */
+ private volatile boolean everUsed = false;
+
public ErrorManager()
{
@@ -125,13 +134,19 @@ public class ErrorManager
if (everUsed)
return;
- synchronized (ErrorManager.class)
+ synchronized (this)
{
/* The double check is intentional. If the first check was
* omitted, the monitor would have to be entered every time
* error() method was called. If the second check was
* omitted, the code below could be executed by multiple
* threads simultaneously.
+ *
+ * This is the 'double-checked locking' idiom, which is broken
+ * with the current version of the Java memory model. However,
+ * we assume that JVMs will have adopted a revised version of
+ * the Java Memory Model by the time GNU Classpath gains
+ * widespread acceptance. See Classpath bug #2944.
*/
if (everUsed)
return;