diff options
author | Sascha Brawer <brawer@dandelis.ch> | 2003-10-21 15:25:46 +0200 |
---|---|---|
committer | Michael Koch <mkoch@gcc.gnu.org> | 2003-10-21 13:25:46 +0000 |
commit | 75a5a481c2048242ed62c7355381160aa1369616 (patch) | |
tree | a5cbe718127a2194f3229dcdf80e56a45134e51a /libjava/java | |
parent | 63d8374488ca66d8349be60abe4659032a15125b (diff) | |
download | gcc-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/java')
-rw-r--r-- | libjava/java/util/logging/ErrorManager.java | 21 |
1 files changed, 18 insertions, 3 deletions
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; |