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