[haiku-bugs] Re: [Haiku] #5713: calling exit from a thread other than the main thread returns the wrong value to caller

  • From: "andrewbachmann" <trac@xxxxxxxxxxxx>
  • Date: Sun, 11 Apr 2010 20:29:51 -0000

#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.

Other related posts: