From 425c6f97a967a72e3b0cc2557be41f0ad1c26c34 Mon Sep 17 00:00:00 2001 From: Stefan Ring Date: Mon, 28 Nov 2011 21:21:32 +0100 Subject: [PATCH] PR162: Make class init protection aware of multiple threads. * src/vm/initialize.cpp: Store the initializing thread into a new field for discrimination of recursive calls versus concurrent calls. * src/vm/class.cpp, src/vm/class.hpp: Added the new field, adapted test macros. --- src/vm/class.cpp | 11 ++++++++++- src/vm/class.hpp | 10 ++++++++-- src/vm/initialize.cpp | 4 +++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/vm/class.cpp b/src/vm/class.cpp index 066bcfdcf..8491efa88 100644 --- a/src/vm/class.cpp +++ b/src/vm/class.cpp @@ -1,6 +1,6 @@ /* src/vm/class.cpp - class related functions - Copyright (C) 1996-2005, 2006, 2007, 2008, 2010 + Copyright (C) 1996-2011 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -2211,6 +2211,15 @@ int32_t class_get_modifiers(classinfo *c, bool ignoreInnerClassesAttrib) } +/** + * Helper function for the CLASS_IS_OR_ALMOST_INITIALIZED macro. + */ +bool class_initializing_thread_is_self(classinfo *c) +{ + threadobject *t = thread_get_current(); + return t == c->initializing_thread; +} + /* class_get_signature ********************************************************* Return the signature of the given class. For array and primitive diff --git a/src/vm/class.hpp b/src/vm/class.hpp index 85f05618c..5b0c41c2e 100644 --- a/src/vm/class.hpp +++ b/src/vm/class.hpp @@ -1,6 +1,6 @@ /* src/vm/class.hpp - class related functions header - Copyright (C) 1996-2005, 2006, 2007, 2008 + Copyright (C) 1996-2011 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -67,7 +67,7 @@ typedef struct extra_classref extra_classref; /* some macros ****************************************************************/ #define CLASS_IS_OR_ALMOST_INITIALIZED(c) \ - (((c)->state & CLASS_INITIALIZING) || ((c)->state & CLASS_INITIALIZED)) + (((c)->state & CLASS_INITIALIZED) || ((c)->state & CLASS_INITIALIZING && class_initializing_thread_is_self((c)))) /* classinfo ******************************************************************/ @@ -90,6 +90,8 @@ typedef struct { #endif } dummy_java_lang_Class; +struct threadobject; + struct classinfo { /* class structure */ dummy_java_lang_Class object; @@ -124,6 +126,7 @@ struct classinfo { /* class structure */ /* (interfaces) */ s4 instancesize; /* size of an instance of this class */ + struct threadobject *initializing_thread; vftbl_t *vftbl; /* pointer to virtual function table */ methodinfo *finalizer; /* finalizer method */ @@ -424,6 +427,8 @@ java_handle_t *class_get_name(classinfo *c); utf *class_get_signature(classinfo *c); #endif +bool class_initializing_thread_is_self(classinfo *c); + /* some debugging functions */ #if !defined(NDEBUG) @@ -457,5 +462,6 @@ void class_showconstantpool(classinfo *c); * indent-tabs-mode: t * c-basic-offset: 4 * tab-width: 4 + * vim:noexpandtab:sw=4:ts=4: * End: */ diff --git a/src/vm/initialize.cpp b/src/vm/initialize.cpp index f602073ac..643580776 100644 --- a/src/vm/initialize.cpp +++ b/src/vm/initialize.cpp @@ -1,6 +1,6 @@ /* src/vm/initialize.cpp - static class initializer functions - Copyright (C) 1996-2005, 2006, 2007, 2008, 2009 + Copyright (C) 1996-2011 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -136,6 +136,7 @@ bool initialize_class(classinfo *c) /* this initalizing run begins NOW */ + c->initializing_thread = thread_get_current(); c->state |= CLASS_INITIALIZING; /* call the internal function */ @@ -280,5 +281,6 @@ static bool initialize_class_intern(classinfo *c) * indent-tabs-mode: t * c-basic-offset: 4 * tab-width: 4 + * vim:noexpandtab:sw=4:ts=4: * End: */ -- 2.25.1