PATCH: Threads and SIGINT
Bryce McKinlay
bryce@albatross.co.nz
Wed Dec 22 22:32:00 GMT 1999
Here's a new patch for threads and SIGINT handling. This is a somewhat refined
version of the threads patch that I have previously posted.
Basically it:
- fixes miscellaneous bugs related to join() and interrupt().
- allows interrupt() to interrupt threads that are in wait(), on Linux, using
the interrupt signal. This technique is unfortunately non portable (doesn't work
on Solaris) so there's a few #ifdefs in there. But it allows us to pass all the
threads stress tests I've come across so far.
- fixes libgcj to exit cleanly and correctly on ^C by removing explicit SIGINT
handling and fixing an associated deadlock in boehm-gc.
I have tested these fairly extensively.
I'm going to be away for a week or two over Christmas/New Year and I'd really
like to get this stuff checked in before I go. Tom: can you look at this ASAP,
please?
Regarding the Solaris thread problems reported by Joerg Brunsmann: I have
reproduced this on my Solaris x86 installation, and I'm convinced that these
problems are in fact due to a bug in Solaris rather than anything wrong with our
code. Solaris 7 (and I presume some 2.6 installations as well, since Joerg
reports that he is using 2.6) have a broken recursive mutex implementation,
resulting in calls to pthread_cond_wait never returning because it cannot
reacquire the mutex.
More information about the Solaris bug here:
http://x23.deja.com/getdoc.xp?AN=559993012&CONTEXT=945928882.1764425735&hitnum=1
"There is an (escalated) Solaris 7 bug report about this problem:
Bugid: 4288299
Category: library
Subcategory: libthread
Synopsis: Recursive mutexes are not properly released
The bug report discusses the deadlock problem with
PTHREAD_MUTEX_RECURSIVE, but the same problem exists with
PTHREAD_MUTEX_ERRORCHECK."
In order to fix this I think we need to force the use of default, non-recursive
mutexes on Solaris. I think this could be done with something like "#if defined
(SOLARIS && HAVE_PTHREAD_MUTEX_SETTYPE) #undef HAVE_PTHREAD_MUTEX_SETTYPE" at
the top of posix-threads.h, but perhaps there is a better way.
1999-12-22 Bryce McKinlay <bryce@albatross.co.nz>
* java/lang/natObject.cc (notify): Throw message with
IllegalMonitorStateException.
(notifyAll): Ditto.
(wait): Ditto.
* java/lang/Thread.java (isInterrupted): Don't clear interrupt_flag.
(isInterrupted_): New function, which does clear interrupt_flag.
(interrupt): Use `isInterrupted_'.
* java/lang/natThread.cc (interrupt): Don't call _Jv_CondNotify on
Linux.
(join): Set `prev' in joiner loop.
Change various calls to `isInterrupted' to use `isInterrupted_'.
* posix-threads.cc (_Jv_CondWait): Allways use pthread_cond_timedwait
on linux. Set result to 0 on an interrupt. Test interrupted status
of jthread object directly.
FLAG_INTERRUPTED: removed.
(_Jv_ThreadStart): Throw OutOfMemoryError if pthread_create fails.
(_Jv_ThreadInterrupt): Don't set FLAG_INTERRUPTED.
(_Jv_InitThreads): Don't block SIGINT.
(_Jv_ThreadWait): Don't configure SIGINT handler.
(_Jv_ThreadInitData): Set `jthread'.
* include/posix-threads.h (_Jv_Thread_t): jthread: new field.
1999-12-22 Bryce McKinlay <bryce@albatross.co.nz>
* linux_threads.c: Don't block SIGINT, SIGQUIT, SIGTERM in the
NO_SIGNALS case.
More information about the Java-patches
mailing list