GC deadlocks on linux

Byron Heads via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Feb 19 08:33:58 PST 2015


On Wednesday, 18 February 2015 at 21:21:11 UTC, Byron Heads wrote:
> On Wednesday, 18 February 2015 at 21:05:10 UTC, Byron Heads 
> wrote:
>> On Wednesday, 18 February 2015 at 20:55:56 UTC, ketmar wrote:
>>> On Wed, 18 Feb 2015 20:35:44 +0000, Byron Heads wrote:
>>>
>>>> On Wednesday, 18 February 2015 at 20:33:40 UTC, ketmar wrote:
>>>>> On Wed, 18 Feb 2015 20:27:07 +0000, Byron Heads wrote:
>>>>>
>>>>> are you forking? ;-)
>>>> 
>>>> 
>>>> I am in the daemonize library
>>>> 
>>>> https://github.com/NCrashed/daemonize
>>>
>>> can you drop that and just let the program run on foreground? 
>>> i suspect
>>> that it may solve your problem. you can detach your program 
>>> with "setsid"
>>> and "&" to avoid forking.
>>>
>>> `fork()` is a very fragile thing, and it may be the source of 
>>> heisenbugs.
>>> stop `fork()`ing may be the easiest solution (if it solves 
>>> something, of
>>> course ;-).
>>
>> By passing daemonize with the GC enabled is working.. going to 
>> dig into the signals and see if thats it.
>
>
>
> My guess is this is going to be related to forking, going to 
> see if I can make a test case.


Now I am not sure. This code runs correctly:

import std.stdio;
import std.concurrency;
import core.sys.posix.unistd;
import core.sys.posix.sys.stat;
import core.memory;
import std.c.linux.linux;

extern(C) nothrow {
	int __libc_current_sigrtmin();
	int close(int rd);
}

void  foo(Tid tid) {
	writeln("1");
	foreach(i; 0..1024) {
		ubyte[] buffer = new ubyte[](8_192);
		auto f = new float[1024];
		GC.collect;
	}

	writeln("2");

	send(tid, true);
	
}

extern(C) void sigsig(int sig) nothrow pure @system @nogc {

}



void main() {
	auto pid = fork();
	if(pid < 0) {
		writeln("fork failed");
	} if (pid > 0) {
		writeln("Spawned ", pid);
		return;
	}
	
	umask(0);
	auto sid = setsid();
	if(sid < 0) {
		writeln("failed to set sid");
	}

	assert(signal(SIGABRT, &sigsig) != SIG_ERR);
	assert(signal(SIGTERM, &sigsig) != SIG_ERR);
	assert(signal(SIGQUIT, &sigsig) != SIG_ERR);
	assert(signal(SIGINT, &sigsig) != SIG_ERR);
	assert(signal(SIGQUIT, &sigsig) != SIG_ERR);
	assert(signal(SIGHUP, &sigsig) != SIG_ERR);
	assert(signal(__libc_current_sigrtmin+1, &sigsig) != SIG_ERR);

	writeln("spawning");
	spawn(&foo, thisTid);
	spawn(&foo, thisTid);
	spawn(&foo, thisTid);

	foreach(i; 0..1024) {
		auto x = new long[1024];
		GC.collect;
	}

	receiveOnly!bool;
	receiveOnly!bool;
	receiveOnly!bool;

	GC.collect;
	writeln("done");
}





More information about the Digitalmars-d-learn mailing list