[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#581700: [libphobos-4.1-dev] Not started Threads cause Segfault on exit



Package: libphobos-4.1-dev
Version: 0.25-4.1.2-27
Severity: normal


Hi,

While trying to narrow down another bug (#581698) I noticed that my
program segfaults on exit, if there are Thread-objects that haven't
been start()ed.
While it probably doesn't make much sense to create Threads and not
start them, this shouldn't happen.
I ran it with gdb and got the following backtrace:

Program received signal SIGSEGV, Segmentation fault.
0xb7f6292b in pthread_detach () from /lib/i686/cmov/libpthread.so.0
(gdb) bt
#0  0xb7f6292b in pthread_detach () from /lib/i686/cmov/libpthread.so.0
#1  0x0805ad93 in _d_callfinalizer ()
#2  0x0805c5a6 in _D3gcx3Gcx11fullcollectMFPvZk ()
#3  0x0805ca54 in _D3gcx3Gcx16fullcollectshellMFZk ()
#4  0x0805cd8c in _D3gcx2GC18fullCollectNoStackMFZv ()
#5  0x0805a203 in gc_term ()
#6  0x0806166a in _d_run_main ()
#7  0x0805e33a in main ()

I think (but haven't tried to fix that yet) that the error is in
Thread's destructor (std/thread.d line 589/590):

if (state != TS.FINISHED)
    pthread_detach(id);

The status of an unstarted Thread is TS.INITIAL - I don't know if it
is necessary to pthread_detach() a thread that hasn't run,
but if it isn't I'd suggest to change this to

if(state != TS.FINISHED && state != TS.INITIAL)
    pthread_detach(id);

This Bug also applies gdc-4.3 and Digitalmars dmd.
I've attached a simple example to demonstrate the bug.

Cheers,
- Daniel


--- System information. ---
Architecture: i386
Kernel:       Linux 2.6.32-3-686

Debian Release: squeeze/sid
  500 testing         security.debian.org
  500 testing         ftp.de.debian.org

--- Package information. ---
Depends                (Version) | Installed
================================-+-==================
gdc-4.1        (= 0.25-4.1.2-27) | 0.25-4.1.2-27
zlib1g-dev        (>= 1:1.2.3.3) | 1:1.2.3.4.dfsg-3


Package's Recommends field is empty.

Package's Suggests field is empty.
import std.stdio;
import std.thread;

const bool doSegfault=true;

void main(){
	int fun(){
		writefln("bla");
		return 0;
	}
	int delegate() dg = &fun;
	Thread t = new Thread(dg);
	
	// if t.start() is missing, the program segfaults on exit (all compilers), 
	// probably because of pthread_detach in Threads destructor
	// - is pthread_detach necessary when state == TS.INITIAL?
	static if(!doSegfault){
		t.start(); 
		t.wait();
	}
}

Reply to: