Skip to content

Commit

Permalink
Fix issue 17037 - std.concurrency has random segfaults
Browse files Browse the repository at this point in the history
  • Loading branch information
WalterWaldron committed Jan 4, 2017
1 parent 3c0b47a commit 3bd0258
Showing 1 changed file with 57 additions and 39 deletions.
96 changes: 57 additions & 39 deletions std/concurrency.d
Original file line number Diff line number Diff line change
Expand Up @@ -1741,52 +1741,53 @@ unittest
import core.exception;
import std.exception;

static void testScheduler(Scheduler s)
{
scheduler = s;
scheduler.start(
{
auto tid = spawn(
auto mainTid = thisTid;
alias testdg = () {
auto tid = spawn(
(Tid mainTid) {
int i;
scope (failure) mainTid.send(false);
try
{
int i;

try
for (i = 1; i < 10; i++)
{
for (i = 1; i < 10; i++)
if (receiveOnly!int() != i)
{
assertNotThrown!AssertError(
assert(receiveOnly!int() == i));
mainTid.send(false);
break;
}
}
catch (OwnerTerminated e)
{

}

// i will advance 1 past the last value expected
assert(i == 4);
});

auto r = new Generator!int(
{
assertThrown!Exception(yield(2.0));
yield(); // ensure this is a no-op
yield(1);
yield(); // also once something has been yielded
yield(2);
yield(3);
});

foreach (e; r)
}
catch (OwnerTerminated e)
{
tid.send(e);
// i will advance 1 past the last value expected
mainTid.send(i == 4);
}
}, mainTid);
auto r = new Generator!int(
{
assertThrown!Exception(yield(2.0));
yield(); // ensure this is a no-op
yield(1);
yield(); // also once something has been yielded
yield(2);
yield(3);
});
scheduler = null;
}

testScheduler(new ThreadScheduler);
testScheduler(new FiberScheduler);
foreach (e; r)
{
tid.send(e);
}
};

changeScheduler(new ThreadScheduler);
scheduler.spawn(testdg);
assert(receiveOnly!bool());

changeScheduler(new FiberScheduler);
scheduler.start(testdg);
assert(receiveOnly!bool());
changeScheduler(null);
}


Expand Down Expand Up @@ -2473,6 +2474,23 @@ private

version( unittest )
{
void changeScheduler(Scheduler s)
{
import core.memory : GC;
import core.thread : Thread;

bool dosleep;
while (Thread.getAll().length != 1)
{
if (dosleep)
Thread.sleep(dur!("msecs")( 10 ));
else
dosleep = true;
GC.collect;
}
scheduler = s;
}

import std.stdio;
import std.typecons : tuple, Tuple;

Expand Down Expand Up @@ -2532,9 +2550,9 @@ version( unittest )

@system unittest
{
scheduler = new ThreadScheduler;
changeScheduler(new ThreadScheduler);
simpleTest();
scheduler = null;
changeScheduler(null);
}
}

Expand Down

0 comments on commit 3bd0258

Please sign in to comment.