Add test for SIGCHLD coalescing.
This commit is contained in:
parent
507fb5a0c9
commit
de199d3410
76
tests/issue-122-coalesced-sigchld.d
Normal file
76
tests/issue-122-coalesced-sigchld.d
Normal file
|
@ -0,0 +1,76 @@
|
|||
#!/usr/bin/env dub
|
||||
/+ dub.sdl:
|
||||
name "test"
|
||||
dependency "eventcore" path=".."
|
||||
+/
|
||||
|
||||
module test;
|
||||
|
||||
import core.time : Duration, msecs;
|
||||
import eventcore.core;
|
||||
import std.conv;
|
||||
import std.datetime;
|
||||
import std.process : thisProcessID;
|
||||
import std.stdio;
|
||||
|
||||
version (Windows) {
|
||||
void main()
|
||||
{
|
||||
writefln("Skipping SIGCHLD coalesce test on Windows.");
|
||||
}
|
||||
} else:
|
||||
|
||||
import core.sys.posix.sys.wait : waitpid, WNOHANG;
|
||||
|
||||
int numProc;
|
||||
|
||||
void main(string[] args)
|
||||
{
|
||||
// child mode
|
||||
if (args.length == 2)
|
||||
{
|
||||
import core.thread : Thread;
|
||||
writefln("Child: %s (%s) from %s", args[1], (args[1].to!long - Clock.currStdTime).hnsecs, thisProcessID);
|
||||
Thread.sleep((args[1].to!long - Clock.currStdTime).hnsecs);
|
||||
return;
|
||||
}
|
||||
|
||||
auto tm = eventDriver.timers.create();
|
||||
eventDriver.timers.set(tm, 5.seconds, 0.msecs);
|
||||
eventDriver.timers.wait(tm, (tm) @trusted {
|
||||
assert(false, "Test hung.");
|
||||
});
|
||||
|
||||
// attempt to let all child processes finish in exactly 1 second to force
|
||||
// signal coalescing
|
||||
auto targettime = Clock.currTime(UTC()) + 1.seconds;
|
||||
|
||||
auto procs = new Process[](20);
|
||||
foreach (i, ref p; procs) {
|
||||
p = eventDriver.processes.spawn(
|
||||
["./test", targettime.stdTime.to!string],
|
||||
ProcessStdinFile(ProcessRedirect.inherit),
|
||||
ProcessStdoutFile(ProcessRedirect.inherit),
|
||||
ProcessStderrFile(ProcessRedirect.inherit),
|
||||
null, ProcessConfig.none, null
|
||||
);
|
||||
assert(p != Process.init);
|
||||
|
||||
writeln("Started child: ", p.pid);
|
||||
numProc++;
|
||||
}
|
||||
|
||||
foreach (p; procs) {
|
||||
eventDriver.processes.wait(p.pid, (ProcessID pid, int res) nothrow
|
||||
{
|
||||
numProc--;
|
||||
try writefln("Child %s exited with %s", pid, res);
|
||||
catch(Exception){}
|
||||
});
|
||||
}
|
||||
|
||||
do eventDriver.core.processEvents(Duration.max);
|
||||
while (numProc);
|
||||
|
||||
foreach (p; procs) assert(waitpid(cast(int)p.pid, null, WNOHANG) == -1);
|
||||
}
|
Loading…
Reference in a new issue