calling exit from a thread other than the main thread returns the wrong value to caller — at Initial Version
|Reported by:||andrewbachmann||Owned by:||nobody|
|Keywords:||main thread exit team||Cc:|
In OpenJDK, ::exit(<value>) is called from a thread other than the main thread. In this case, Haiku doesn't return <value> as the result of the program. Instead it returned 149. It is also printing "Kill Thread" but I am unclear if that is a result of my attempts to work around this issue.
AnEvilYak on IRC suggested looking at src/system/kernel/team.cpp method _user_exit_team and I believe the fix is to add the line "thread = thread->team->main_thread;" before the exit status is assigned.
Alternatively, assign the exit status and reason to both the main thread and calling thread, if that works.
Here's how to work around the bug:
- wrap all calls to ::exit with a method that stores the exit value
- use atexit() to hook up an exit handler that first signals the main thread, and then suspends itself
- create a signal handler that kill_threads the other threads, and after they have all died, performs exit_thread() with the stored exit value
BeOS had this bug too although the fix was slightly different in that I called ::exit again in the signal handler instead of exit_thread. That version does not work on haiku. (hangs instead)