Your patch is a good start.  There may be a few issues not addressed by this
patch:

1. Java_tcl_lang_Interp_create() may need a separate C mutex to prevent more
than one thread from creating the JVM when used in the threaded version of
Tcl.  I don't think know the effect of trying to call JavaSetupJava() from
more than one thread at the same time.

2. Bugs in the Notifier class are not addressed.  "update" or "vwait"
command will cause infinite loop.  Events are not removed properly from the
event list.  "vwait" can deadlock due to synchronization.

The above problems need to be fixed in order for TclBlend to pass most of
the Tcl regression tests.

-- Jiang Wu
   [EMAIL PROTECTED]

-----Original Message-----
From: Mo DeJong [mailto:[EMAIL PROTECTED]]
Sent: Thursday, June 15, 2000 6:45 AM
To: [EMAIL PROTECTED]
Subject: [Tcl Java] New patch for loading of TclBlend from Java


Hi all.

I have a new patch that adds support for loading of
TclBlend into a Java, it is a little less complex
than the solution Jiang proposed.


Here is the source file I am using.

% cat LoadTclBlend.java 
import tcl.lang.*;

public class LoadTclBlend {
  public static void main(String[] args) throws Exception {
    Interp i = new Interp();
    i.setVar("i", "1", 0);
    i.eval("puts \"i is $i\"");

    i.eval("package require java");
    i.eval("set str [java::new String \"I am a Java String\"]");
    i.eval("puts [$str toString]");
  }
}

Here are the results with IBM JDK 1.3.

% java LoadTclBlend
i is 1
I am a Java String


Here is the patch I used:


Index: src/native/java.h
===================================================================
RCS file: /home/cvs/external/tcljava/src/native/java.h,v
retrieving revision 1.6
diff -u -r1.6 java.h
--- java.h      2000/06/15 09:47:06     1.6
+++ java.h      2000/06/15 13:37:18
@@ -133,7 +133,9 @@
     jmethodID invokeTimer;
 } JavaInfo;
 
+/* These are defined in javaCmd.c */
 extern JavaInfo java;
+extern JNIEnv *currentEnv;
 
 /*
  * The following macros are used to enter and leave the global
Index: src/native/javaCmd.c
===================================================================
RCS file: /home/cvs/external/tcljava/src/native/javaCmd.c,v
retrieving revision 1.9
diff -u -r1.9 javaCmd.c
--- javaCmd.c   2000/06/15 09:47:06     1.9
+++ javaCmd.c   2000/06/15 13:37:18
@@ -62,7 +62,7 @@
  * will contain the environment for the default thread.
  */
 
-static JNIEnv *currentEnv = NULL; /* JNI pointer for current thread. */
+JNIEnv *currentEnv = NULL; /* JNI pointer for current thread. */
 
 /*
  * The following variable contains the pointer to the current Java VM,
Index: src/native/javaInterp.c
===================================================================
RCS file: /home/cvs/external/tcljava/src/native/javaInterp.c,v
retrieving revision 1.6
diff -u -r1.6 javaInterp.c
--- javaInterp.c        2000/06/15 09:47:07     1.6
+++ javaInterp.c        2000/06/15 13:37:19
@@ -101,8 +101,11 @@
     jlong lvalue;
     Tcl_Interp *interp;
     JNIEnv *oldEnv;
+    int loadedFromJava = (currentEnv == NULL); /* true if Tcl Blend was 
loaded into Java */
 
-    PUSH_JAVA_ENV();
+    if (! loadedFromJava) {
+        PUSH_JAVA_ENV();
+    }
 
     interp = Tcl_CreateInterp();
     if (JavaSetupJava(env, interp) != TCL_OK) {
@@ -116,7 +119,9 @@
        *(Tcl_Interp**)&lvalue = interp;
     }
 
-    POP_JAVA_ENV();
+    if (! loadedFromJava) {
+        POP_JAVA_ENV();
+    }
     return lvalue;
 }


What do you think? We still need to solve some other deadlocking
problems, but at least it loads without a SIGSEGV now :)

Mo Dejong
Red Hat Inc.

----------------------------------------------------------------
The TclJava mailing list is sponsored by Scriptics Corporation.
To subscribe:    send mail to [EMAIL PROTECTED]  
                 with the word SUBSCRIBE as the subject.
To unsubscribe:  send mail to [EMAIL PROTECTED] 
                 with the word UNSUBSCRIBE as the subject.
To send to the list, send email to '[EMAIL PROTECTED]'. 
An archive is available at http://www.mail-archive.com/tcljava@scriptics.com

----------------------------------------------------------------
The TclJava mailing list is sponsored by Scriptics Corporation.
To subscribe:    send mail to [EMAIL PROTECTED]  
                 with the word SUBSCRIBE as the subject.
To unsubscribe:  send mail to [EMAIL PROTECTED] 
                 with the word UNSUBSCRIBE as the subject.
To send to the list, send email to '[EMAIL PROTECTED]'. 
An archive is available at http://www.mail-archive.com/tcljava@scriptics.com

Reply via email to