Forking problems on OS X 2.047

soul8o8 soul8o8 at gmail.com
Tue Jun 22 09:11:22 PDT 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.



More information about the Digitalmars-d-learn mailing list