Thread overview
Forking problems on OS X 2.047
Jun 21, 2010
Byron Heads
Jun 21, 2010
Byron Heads
Jun 22, 2010
Jacob Carlborg
Jun 22, 2010
Masahiro Nakagawa
Jun 23, 2010
soul8o8
Jun 23, 2010
soul8o8
June 21, 2010
When I use fork I am getting a core.thread.ThreadException: Unable to load thread state exception.

This is dmd 2.047 on OS X
I am trying to convert a small C application.


module fork;
import  core.sys.posix.unistd,
        std.stdio;

void main()
{
    auto pid = fork();

    if( pid > 0 ) {
        writeln( "Parent" );
    } else if( pid == 0 ) {
        writeln( "Child" );
    } else {
        writeln( "Failed to fork!" );
    }
}


$ ./fork
Parent
Child
core.thread.ThreadException: Unable to load thread state
----------------
5   fork                                0x00006de9 thread_suspendAll + 85
6   fork                                0x0000aff0
D2gc3gcx3Gcx11fullcollectMFPvZk + 32
7   fork                                0x0000afbd
D2gc3gcx3Gcx16fullcollectshellMFZk + 41
8   fork                                0x0000a0a2
D2gc3gcx2GC18fullCollectNoStackMFZv + 54
9   fork                                0x0000803c gc_term + 44
10  fork                                0x0000cef6
D2rt6dmain24mainUiPPaZi6runAllMFZv + 90
11  fork                                0x0000cdc6
D2rt6dmain24mainUiPPaZi7tryExecMFMDFZvZv + 42
12  fork                                0x0000cd54 main + 168
13  fork                                0x00001a85 start + 53

I tried different flags but the output is the same.
June 21, 2010
On Mon, 21 Jun 2010 21:32:21 +0000, Byron Heads wrote:

> When I use fork I am getting a core.thread.ThreadException: Unable to load thread state exception.
> 
> This is dmd 2.047 on OS X
> I am trying to convert a small C application.
> 

This runs fine under linux

-Byron
June 22, 2010
On 2010-06-21 23:32, Byron Heads wrote:
> When I use fork I am getting a core.thread.ThreadException: Unable to
> load thread state exception.
>
> This is dmd 2.047 on OS X
> I am trying to convert a small C application.
>
>
> module fork;
> import  core.sys.posix.unistd,
>          std.stdio;
>
> void main()
> {
>      auto pid = fork();
>
>      if( pid>  0 ) {
>          writeln( "Parent" );
>      } else if( pid == 0 ) {
>          writeln( "Child" );
>      } else {
>          writeln( "Failed to fork!" );
>      }
> }
>
>
> $ ./fork
> Parent
> Child
> core.thread.ThreadException: Unable to load thread state
> ----------------
> 5   fork                                0x00006de9 thread_suspendAll + 85
> 6   fork                                0x0000aff0
> D2gc3gcx3Gcx11fullcollectMFPvZk + 32
> 7   fork                                0x0000afbd
> D2gc3gcx3Gcx16fullcollectshellMFZk + 41
> 8   fork                                0x0000a0a2
> D2gc3gcx2GC18fullCollectNoStackMFZv + 54
> 9   fork                                0x0000803c gc_term + 44
> 10  fork                                0x0000cef6
> D2rt6dmain24mainUiPPaZi6runAllMFZv + 90
> 11  fork                                0x0000cdc6
> D2rt6dmain24mainUiPPaZi7tryExecMFMDFZvZv + 42
> 12  fork                                0x0000cd54 main + 168
> 13  fork                                0x00001a85 start + 53
>
> I tried different flags but the output is the same.

It's working fine using Tango on Snow Leopard but it doesn't work using D2 on Leopard or Snow.

-- 
/Jacob Carlborg
June 22, 2010
On Tue, 22 Jun 2010 06:32:21 +0900, Byron Heads <wyverex.cypher@gmail.com> wrote:

> When I use fork I am getting a core.thread.ThreadException: Unable to
> load thread state exception.
>
> This is dmd 2.047 on OS X
> I am trying to convert a small C application.
>
>
> module fork;
> import  core.sys.posix.unistd,
>         std.stdio;
>
> void main()
> {
>     auto pid = fork();
>
>     if( pid > 0 ) {
>         writeln( "Parent" );
>     } else if( pid == 0 ) {
>         writeln( "Child" );
>     } else {
>         writeln( "Failed to fork!" );
>     }
> }
>
>
> $ ./fork
> Parent
> Child
> core.thread.ThreadException: Unable to load thread state
> ----------------
> 5   fork                                0x00006de9 thread_suspendAll + 85
> 6   fork                                0x0000aff0
> D2gc3gcx3Gcx11fullcollectMFPvZk + 32
> 7   fork                                0x0000afbd
> D2gc3gcx3Gcx16fullcollectshellMFZk + 41
> 8   fork                                0x0000a0a2
> D2gc3gcx2GC18fullCollectNoStackMFZv + 54
> 9   fork                                0x0000803c gc_term + 44
> 10  fork                                0x0000cef6
> D2rt6dmain24mainUiPPaZi6runAllMFZv + 90
> 11  fork                                0x0000cdc6
> D2rt6dmain24mainUiPPaZi7tryExecMFMDFZvZv + 42
> 12  fork                                0x0000cd54 main + 168
> 13  fork                                0x00001a85 start + 53
>
> I tried different flags but the output is the same.

My environment too. Please put this bug into bugzilla.


Masahiro
June 23, 2010


Correction:
Of course, you shouldn't call thread_attachThis() for the parent thread. It's already been attached since the D runtime created it. (In fact, the documentation says: "If [thread_attachThis()] is called for a thread which is already registered, the result is undefined." My bad.)

BR
/soul


On Jun 21, 2010, at 23:32 , Byron Heads wrote:

> When I use fork I am getting a core.thread.ThreadException: Unable to load thread state exception.
> 
> This is dmd 2.047 on OS X
> I am trying to convert a small C application.
> 
> 
> module fork;
> import  core.sys.posix.unistd,
>        std.stdio;
> 
> void main()
> {
>    auto pid = fork();
> 
>    if( pid > 0 ) {
>        writeln( "Parent" );
>    } else if( pid == 0 ) {
>        writeln( "Child" );
>    } else {
>        writeln( "Failed to fork!" );
>    }
> }
> 
> 
> $ ./fork
> Parent
> Child
> core.thread.ThreadException: Unable to load thread state
> ----------------
> 5   fork                                0x00006de9 thread_suspendAll + 85
> 6   fork                                0x0000aff0
> D2gc3gcx3Gcx11fullcollectMFPvZk + 32
> 7   fork                                0x0000afbd
> D2gc3gcx3Gcx16fullcollectshellMFZk + 41
> 8   fork                                0x0000a0a2
> D2gc3gcx2GC18fullCollectNoStackMFZv + 54
> 9   fork                                0x0000803c gc_term + 44
> 10  fork                                0x0000cef6
> D2rt6dmain24mainUiPPaZi6runAllMFZv + 90
> 11  fork                                0x0000cdc6
> D2rt6dmain24mainUiPPaZi7tryExecMFMDFZvZv + 42
> 12  fork                                0x0000cd54 main + 168
> 13  fork                                0x00001a85 start + 53
> 
> I tried different flags but the output is the same.

June 23, 2010
I get the same error.

Fix:
The following code works allright on MacOS X 10.6.4 / DMD v2.047:


module fork;
import  core.sys.posix.unistd,
        core.thread, 		// added
        std.stdio;

void main()
{
    auto pid = fork();

    if( pid>  0 ) {
        thread_attachThis(); 	// added
        writeln( "Parent" );
    } else if( pid == 0 ) {
        thread_attachThis();	 // added
        writeln( "Child" );
    } else {
        writeln( "Failed to fork!" );
    }
}



I'm completely new to D, so this is just me speculating: By using low-level posix threads I think you kind of sneak behind the back of the D runtime. You need to give it a chance to set things up for each thread. This is what thread_attachThis() does. (Please correct me if I'm wrong.)

BR
/soul


On Jun 21, 2010, at 23:32 , Byron Heads wrote:

> When I use fork I am getting a core.thread.ThreadException: Unable to load thread state exception.
> 
> This is dmd 2.047 on OS X
> I am trying to convert a small C application.
> 
> 
> module fork;
> import  core.sys.posix.unistd,
>        std.stdio;
> 
> void main()
> {
>    auto pid = fork();
> 
>    if( pid > 0 ) {
>        writeln( "Parent" );
>    } else if( pid == 0 ) {
>        writeln( "Child" );
>    } else {
>        writeln( "Failed to fork!" );
>    }
> }
> 
> 
> $ ./fork
> Parent
> Child
> core.thread.ThreadException: Unable to load thread state
> ----------------
> 5   fork                                0x00006de9 thread_suspendAll + 85
> 6   fork                                0x0000aff0
> D2gc3gcx3Gcx11fullcollectMFPvZk + 32
> 7   fork                                0x0000afbd
> D2gc3gcx3Gcx16fullcollectshellMFZk + 41
> 8   fork                                0x0000a0a2
> D2gc3gcx2GC18fullCollectNoStackMFZv + 54
> 9   fork                                0x0000803c gc_term + 44
> 10  fork                                0x0000cef6
> D2rt6dmain24mainUiPPaZi6runAllMFZv + 90
> 11  fork                                0x0000cdc6
> D2rt6dmain24mainUiPPaZi7tryExecMFMDFZvZv + 42
> 12  fork                                0x0000cd54 main + 168
> 13  fork                                0x00001a85 start + 53
> 
> I tried different flags but the output is the same.