re PR libgcj/7587 (direct threaded interpreter not thread-safe)
authorBryce McKinlay <mckinlay@redhat.com>
Tue, 13 Jul 2004 21:03:03 +0000 (21:03 +0000)
committerBryce McKinlay <bryce@gcc.gnu.org>
Tue, 13 Jul 2004 21:03:03 +0000 (22:03 +0100)
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

libjava/ChangeLog
libjava/include/java-interp.h
libjava/interpret.cc
libjava/prims.cc

index 3c0b041b0ec05fd500011438f44cec227825bad9..476795a111de7ea0fe55e628040a19ddf1c94736 100644 (file)
@@ -1,3 +1,13 @@
+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>
 
        PR libgcj/15713
index c57c146dacbbcd429574d652772daffe85fa3ffc..12bc21f24360869b708ec17bde6462fbb60eacb7 100644 (file)
@@ -35,6 +35,7 @@ _Jv_IsInterpretedClass (jclass c)
 
 struct _Jv_ResolvedMethod;
 
+void _Jv_InitInterpreter ();
 void _Jv_DefineClass (jclass, jbyteArray, jint, jint);
 
 void _Jv_InitField (jobject, jclass, int);
index 7ec83a23c44d14e2a6bdb5a2e992c6deafba5fe6..40c7cbaac5a8ddc889e4215d756b464310ab1b52 100644 (file)
@@ -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
index 7aac58497aaa4f00e616e1bac5622917eec6d094..19bce1e62a059d891842b03d280dbd498c7b614d 100644 (file)
@@ -25,6 +25,7 @@ details.  */
 #include <jvm.h>
 #include <java-signal.h>
 #include <java-threads.h>
+#include <java-interp.h>
 
 #ifdef ENABLE_JVMPI
 #include <jvmpi.h>
@@ -953,6 +954,10 @@ _Jv_CreateJavaVM (void* /*vm_args*/)
   _Jv_InitThreads ();
   _Jv_InitGC ();
   _Jv_InitializeSyncMutex ();
+  
+#ifdef INTERPRETER
+  _Jv_InitInterpreter ();
+#endif  
 
 #ifdef HANDLE_SEGV
   INIT_SEGV;