File: 0004-enforce-callback-invocation-from-main-thread.patch

package info (click to toggle)
camljava 0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 572 kB
  • ctags: 892
  • sloc: ansic: 839; ml: 336; java: 302; makefile: 89
file content (57 lines) | stat: -rw-r--r-- 1,633 bytes parent folder | download | duplicates (2)
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;