+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
struct _Jv_ResolvedMethod;
+void _Jv_InitInterpreter ();
void _Jv_DefineClass (jclass, jbyteArray, jint, jint);
void _Jv_InitField (jobject, jclass, int);
__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
#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
#include <jvm.h>
#include <java-signal.h>
#include <java-threads.h>
+#include <java-interp.h>
#ifdef ENABLE_JVMPI
#include <jvmpi.h>
_Jv_InitThreads ();
_Jv_InitGC ();
_Jv_InitializeSyncMutex ();
+
+#ifdef INTERPRETER
+ _Jv_InitInterpreter ();
+#endif
#ifdef HANDLE_SEGV
INIT_SEGV;