mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
re PR libgcj/7587 (direct threaded interpreter not thread-safe)
2004-07-13 Bryce McKinlay <mckinlay@redhat.com> PR libgcj/7587 * interpret.cc (compile_mutex): New. (_Jv_InitInterpreter): New. Initialize compile_mutex. (run): Lock compile_mutex before calling compile() if compilation is required. * prims.cc (_Jv_CreateJavaVM): Call _Jv_InitInterpreter(). * include/java-interp.h (_Jv_InitInterpreter): Declare. From-SVN: r84644
This commit is contained in:
committed by
Bryce McKinlay
parent
b6fa4f6e16
commit
6187fd28ad
@@ -54,6 +54,21 @@ static void throw_null_pointer_exception ()
|
||||
__attribute__ ((__noreturn__));
|
||||
#endif
|
||||
|
||||
#ifdef DIRECT_THREADED
|
||||
// Lock to ensure that methods are not compiled concurrently.
|
||||
// We could use a finer-grained lock here, however it is not safe to use
|
||||
// the Class monitor as user code in another thread could hold it.
|
||||
static _Jv_Mutex_t compile_mutex;
|
||||
|
||||
void
|
||||
_Jv_InitInterpreter()
|
||||
{
|
||||
_Jv_MutexInit (&compile_mutex);
|
||||
}
|
||||
#else
|
||||
void _Jv_InitInterpreter() {}
|
||||
#endif
|
||||
|
||||
extern "C" double __ieee754_fmod (double,double);
|
||||
|
||||
// This represents a single slot in the "compiled" form of the
|
||||
@@ -1032,9 +1047,14 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args)
|
||||
#define PCVAL(unionval) unionval.p
|
||||
#define AMPAMP(label) &&label
|
||||
|
||||
// Compile if we must.
|
||||
// Compile if we must. NOTE: Double-check locking.
|
||||
if (prepared == NULL)
|
||||
compile (insn_target);
|
||||
{
|
||||
_Jv_MutexLock (&compile_mutex);
|
||||
if (prepared == NULL)
|
||||
compile (insn_target);
|
||||
_Jv_MutexUnlock (&compile_mutex);
|
||||
}
|
||||
pc = (insn_slot *) prepared;
|
||||
|
||||
#else
|
||||
|
||||
Reference in New Issue
Block a user