1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
From: Gregoire Henry <Gregoire.Henry@pps.jussieu.fr>
Date: Thu, 26 Nov 2009 18:00:50 +0100
Subject: enforce callback invocation from main thread
ensure that all callbacks are executed from the main thread
(patch from O'Jacare)
---
lib/jnistubs.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/lib/jnistubs.c b/lib/jnistubs.c
index 5d6b92e..e1659f8 100644
--- a/lib/jnistubs.c
+++ b/lib/jnistubs.c
@@ -14,6 +14,24 @@ static JNIEnv * jenv;
#define Val_jboolean(b) ((b) == JNI_FALSE ? Val_false : Val_true)
#define Jboolean_val(v) (Val_bool(v) ? JNI_TRUE : JNI_FALSE)
+/********** Threading *************/
+
+static JNIEnv * g_jenv;
+
+void init_threading() {
+ g_jenv = jenv;
+}
+
+void camljava_check_main_thread() {
+ if(jenv != g_jenv) {
+ fprintf(stderr, "CamlJava: callbacks from threads other than main are not allowed: ABORT.\n");
+ fflush(stderr);
+ // raise a Java exception would be better
+ exit(2);
+ }
+ return;
+}
+
/************ Wrapping of Java objects as Caml values *************/
#define JObject(v) (*((jobject *) Data_custom_val(v)))
@@ -680,6 +698,7 @@ value camljava_Init(value vclasspath)
retcode = JNI_CreateJavaVM(&jvm, (void **) &jenv, &vm_args);
stat_free(classpath);
if (retcode < 0) failwith("Java.init");
+ init_threading(); // by O'Jacare
return Val_unit;
}
@@ -781,6 +800,9 @@ static value camljava_callback(JNIEnv * env,
savedenv = jenv;
jenv = env;
+
+ camljava_check_main_thread(); // by O'Jacare
+
if (!caml_classes_initialized) {
if (init_caml_classes(env) == -1) return -1;
caml_classes_initialized = 1;
|