From 1c662558a1113238a624245a45382d3df90ccf13 Mon Sep 17 00:00:00 2001 From: mkoch Date: Tue, 21 Oct 2003 13:25:46 +0000 Subject: 2003-10-21 Sascha Brawer Fix for bug #2944, reported by David Holmes * java/util/logging/ErrorManager.java (everUsed): Made volatile. (error): Synchronize on instance, not class. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72750 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/ChangeLog | 6 ++++++ libjava/java/util/logging/ErrorManager.java | 21 ++++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) (limited to 'libjava') diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 67dc182232e..aa3f79ec8c3 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,9 @@ +2003-10-21 Sascha Brawer + + Fix for bug #2944, reported by David Holmes + * java/util/logging/ErrorManager.java (everUsed): Made volatile. + (error): Synchronize on instance, not class. + 2003-10-21 Mark Wielaard Reported by M.Negovanovic diff --git a/libjava/java/util/logging/ErrorManager.java b/libjava/java/util/logging/ErrorManager.java index cc36bf6301c..7381a5227ac 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; -- cgit v1.2.1