Commit 6187fd28 by Bryce McKinlay Committed by Bryce McKinlay

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
parent b6fa4f6e
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.
2004-07-12 Bryce McKinlay <mckinlay@redhat.com> 2004-07-12 Bryce McKinlay <mckinlay@redhat.com>
PR libgcj/15713 PR libgcj/15713
......
...@@ -35,6 +35,7 @@ _Jv_IsInterpretedClass (jclass c) ...@@ -35,6 +35,7 @@ _Jv_IsInterpretedClass (jclass c)
struct _Jv_ResolvedMethod; struct _Jv_ResolvedMethod;
void _Jv_InitInterpreter ();
void _Jv_DefineClass (jclass, jbyteArray, jint, jint); void _Jv_DefineClass (jclass, jbyteArray, jint, jint);
void _Jv_InitField (jobject, jclass, int); void _Jv_InitField (jobject, jclass, int);
......
...@@ -54,6 +54,21 @@ static void throw_null_pointer_exception () ...@@ -54,6 +54,21 @@ static void throw_null_pointer_exception ()
__attribute__ ((__noreturn__)); __attribute__ ((__noreturn__));
#endif #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); extern "C" double __ieee754_fmod (double,double);
// This represents a single slot in the "compiled" form of the // This represents a single slot in the "compiled" form of the
...@@ -1032,9 +1047,14 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args) ...@@ -1032,9 +1047,14 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args)
#define PCVAL(unionval) unionval.p #define PCVAL(unionval) unionval.p
#define AMPAMP(label) &&label #define AMPAMP(label) &&label
// Compile if we must. // Compile if we must. NOTE: Double-check locking.
if (prepared == NULL) if (prepared == NULL)
compile (insn_target); {
_Jv_MutexLock (&compile_mutex);
if (prepared == NULL)
compile (insn_target);
_Jv_MutexUnlock (&compile_mutex);
}
pc = (insn_slot *) prepared; pc = (insn_slot *) prepared;
#else #else
......
...@@ -25,6 +25,7 @@ details. */ ...@@ -25,6 +25,7 @@ details. */
#include <jvm.h> #include <jvm.h>
#include <java-signal.h> #include <java-signal.h>
#include <java-threads.h> #include <java-threads.h>
#include <java-interp.h>
#ifdef ENABLE_JVMPI #ifdef ENABLE_JVMPI
#include <jvmpi.h> #include <jvmpi.h>
...@@ -953,6 +954,10 @@ _Jv_CreateJavaVM (void* /*vm_args*/) ...@@ -953,6 +954,10 @@ _Jv_CreateJavaVM (void* /*vm_args*/)
_Jv_InitThreads (); _Jv_InitThreads ();
_Jv_InitGC (); _Jv_InitGC ();
_Jv_InitializeSyncMutex (); _Jv_InitializeSyncMutex ();
#ifdef INTERPRETER
_Jv_InitInterpreter ();
#endif
#ifdef HANDLE_SEGV #ifdef HANDLE_SEGV
INIT_SEGV; INIT_SEGV;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment