Hi Daniel,

Thanks for the report. I don't know how I've managed to pass my test previously however I have now a patch for this which fix the behaviour of JNI_DestroyJavaVM (and consequently fix the problem you reported). However this patch is only for unix-pthreads at the moment. I'll write something for unix-jthreads asap and commit it.

Cheers,

Guilhem.

Daniel Bonniot wrote:
Guilhem Lavaux wrote:

Hi Daniel,

I had a few minutes free and checked it in the CVS. Now whenever there is an uncaught exception happened kaffe-bin will return with 1 instead of 0.

Cheers,

Guilhem.


Guilhem, thanks a lot for looking into this. However, I tried with the latest Debian package, which includes your change, and it does not seem to make any difference in this case. Here is the testcase, and transcript while running with JDK and kaffe.

$ cat Field.java
class Field {
  public static void main(String[] args)
  {
    throw new Error();
  }
}
$ javac Field.java
$ java Field && echo OOOOPS
Exception in thread "main" java.lang.Error
        at Field.main(Field.java:4)
$ kaffe Field && echo OOOOPS
java.lang.Error
   at Field.main (Field.java:4)
OOOOPS
$ kaffe -fullversion
...
  ChangeLog head   : 2005-02-15  Guilhem Lavaux  <[EMAIL PROTECTED]>


Cheers,

Daniel

PS: I checked, and unless I made a mistake, it did not look like it was the kaffe shell script losing the exit code.

_______________________________________________
kaffe mailing list
kaffe@kaffe.org
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe


Index: kaffe/kaffevm/systems/unix-pthreads/thread-impl.c
===================================================================
RCS file: /cvs/kaffe/kaffe/kaffe/kaffevm/systems/unix-pthreads/thread-impl.c,v
retrieving revision 1.73
diff -u -r1.73 thread-impl.c
--- kaffe/kaffevm/systems/unix-pthreads/thread-impl.c   20 Feb 2005 00:55:48 
-0000      1.73
+++ kaffe/kaffevm/systems/unix-pthreads/thread-impl.c   26 Feb 2005 15:51:34 
-0000
@@ -1004,9 +1004,10 @@
    */
 }
 
-/*
+/**
  * Function to be called (by threads.c firstStartThread) when the thread leaves
- * the user thread function
+ * the user thread function. If the calling thread is the main thread then it
+ * suspend the thread until all other threads has exited.
  */
 void
 jthread_exit ( void )
@@ -1044,7 +1045,9 @@
          }
 
          for ( t=activeThreads; t != NULL; t = t->next ){
-               if ( t != cur ) {
+               /* We must not kill the current thread and the main thread
+                */
+               if ( t != cur && t != firstThread) {
                  /* Mark the thread as to be killed. */
                  t->status = THREAD_KILL;
                  /* Send an interrupt event to the remote thread.
@@ -1066,27 +1069,32 @@
 #endif
 
          if ( (cur != firstThread) && (firstThread->active == 0) ) {
-               /* if the firstThread has already been frozen, it's not in the 
cache list */
-               pthread_cancel( firstThread->tid);
+               /* if the firstThread has already been frozen,
+                * it's not in the cache list. We must wake it up because
+                * this thread is the last one alive and it is exiting. */
                repsem_post (&firstThread->sem);
          }
 
-         unprotectThreadList(cur);
-         pthread_exit( NULL);
+         /* This is not the main thread so we may kill it. */
+         if (cur != firstThread)
+         {
+           unprotectThreadList(cur);
+           pthread_exit( NULL);
 
-         /* we shouldn't get here, this is a last safeguard */
-         EXIT(0);
+           /* we shouldn't get here, this is a last safeguard */
+           EXIT(0);
+         }
        }
        unprotectThreadList(cur);
   }
 
-  if ( cur == firstThread ) {
-       /*
-        * We don't cache this one, but we have to remove it from the active 
list. Note
-        * that the firstThread always has to be the last entry in the 
activeThreads list
-        * (we just add new entries at the head)
-        */
-       protectThreadList(cur);
+  /*
+   * We don't cache this one, but we have to remove it from the active list. 
Note
+   * that the firstThread always has to be the last entry in the activeThreads 
list
+   * (we just add new entries at the head)
+   */
+  protectThreadList(cur);
+  if ( cur == firstThread && nonDaemons != 0) {
 
        /* if we would be the head, we would have been the last, too (and 
already exited) */
        assert( cur != activeThreads);
@@ -1097,22 +1105,15 @@
 
        unprotectThreadList(cur);
 
-       /*
-        * Put us into a permanent freeze to avoid shut down of the whole 
process (it's
-        * not clear if this is common pthread behavior or just a implementation
-        * linux-threads "feature")
+       /* Put the main thread in a frozen state waiting for the other
+        * real threads to terminate. The main thread gets the control back
+        * after that.
         */
        repsem_wait( &cur->sem);
-
-       /* We put here a safe-guard in case the pthread_cancel has not managed
-        * to do its job and that repsem_wait awakes.
-        */
-       pthread_exit(NULL);
   }
-  else {
+  else if (cur != firstThread) {
        /* flag that we soon will get a new cache entry (would be annoying to
         * create a new thread in the meantime) */
-       protectThreadList(cur);
        pendingExits++;
        unprotectThreadList(cur);
   }
_______________________________________________
kaffe mailing list
kaffe@kaffe.org
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to