#5713: calling exit from a thread other than the main thread returns the wrong value to caller -----------------------------------+---------------------------------------- Reporter: andrewbachmann | Owner: nobody Type: bug | Status: new Priority: normal | Milestone: R1 Component: - General | Version: R1/alpha1 Keywords: main thread exit team | Blockedby: Platform: All | Blocking: -----------------------------------+---------------------------------------- Description changed by andrewbachmann: Old description: > 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: > > 1. wrap all calls to ::exit with a method that stores the exit value > 2. use atexit() to hook up an exit handler that first signals the main > thread, and then suspends itself > 3. create a signal handler that kill_threads the other threads, and after > they have all died, performs exit_thread() with the stored exit value > > <whew!> > > 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) New description: 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: 1. wrap ALL calls to ::exit with a method that stores the exit value 2. use atexit() to hook up an exit handler that first signals the main thread, and then suspends itself 3. create a signal handler that kill_threads the other threads, and after they have all died, performs exit_thread() with the stored exit value }}} <whew!> 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) -- -- Ticket URL: <http://dev.haiku-os.org/ticket/5713#comment:1> Haiku <http://dev.haiku-os.org> Haiku - the operating system.