blob: 46da87d47af6ba6c0a370d31082f9dd040f2d23e [file] [log] [blame] [edit]
@system unittest
{
import std.concurrency;
__gshared string received;
static void spawnedFunc(Tid ownerTid)
{
import std.conv : text;
// Receive a message from the owner thread.
receive((int i){
received = text("Received the number ", i);
// Send a message back to the owner thread
// indicating success.
send(ownerTid, true);
});
}
// Start spawnedFunc in a new thread.
auto childTid = spawn(&spawnedFunc, thisTid);
// Send the number 42 to this new thread.
send(childTid, 42);
// Receive the result code.
auto wasSuccessful = receiveOnly!(bool);
assert(wasSuccessful);
assert(received == "Received the number 42");
}
@system unittest
{
import std.concurrency;
static void f(string msg)
{
assert(msg == "Hello World");
}
auto tid = spawn(&f, "Hello World");
}
@system unittest
{
import std.concurrency;
string msg = "Hello, World!";
static void f1(string msg) {}
static assert(!__traits(compiles, spawn(&f1, msg.dup)));
static assert( __traits(compiles, spawn(&f1, msg.idup)));
static void f2(char[] msg) {}
static assert(!__traits(compiles, spawn(&f2, msg.dup)));
static assert(!__traits(compiles, spawn(&f2, msg.idup)));
}
@system unittest
{
import std.concurrency;
spawn({
ownerTid.send("This is so great!");
});
assert(receiveOnly!string == "This is so great!");
}
@system unittest
{
import std.concurrency;
import std.variant : Variant;
auto process = ()
{
receive(
(int i) { ownerTid.send(1); },
(double f) { ownerTid.send(2); },
(Variant v) { ownerTid.send(3); }
);
};
{
auto tid = spawn(process);
send(tid, 42);
assert(receiveOnly!int == 1);
}
{
auto tid = spawn(process);
send(tid, 3.14);
assert(receiveOnly!int == 2);
}
{
auto tid = spawn(process);
send(tid, "something else");
assert(receiveOnly!int == 3);
}
}
@system unittest
{
import std.concurrency;
auto tid = spawn(
{
assert(receiveOnly!int == 42);
});
send(tid, 42);
}
@system unittest
{
import std.concurrency;
auto tid = spawn(
{
assert(receiveOnly!string == "text");
});
send(tid, "text");
}
@system unittest
{
import std.concurrency;
struct Record { string name; int age; }
auto tid = spawn(
{
auto msg = receiveOnly!(double, Record);
assert(msg[0] == 0.5);
assert(msg[1].name == "Alice");
assert(msg[1].age == 31);
});
send(tid, 0.5, Record("Alice", 31));
}
@system unittest
{
import std.concurrency;
auto tid = spawn({
int i;
while (i < 9)
i = receiveOnly!int;
ownerTid.send(i * 2);
});
auto r = new Generator!int({
foreach (i; 1 .. 10)
yield(i);
});
foreach (e; r)
tid.send(e);
assert(receiveOnly!int == 18);
}
@system unittest
{
import std.concurrency;
import std.range;
InputRange!int myIota = iota(10).inputRangeObject;
myIota.popFront();
myIota.popFront();
assert(myIota.moveFront == 2);
assert(myIota.front == 2);
myIota.popFront();
assert(myIota.front == 3);
//can be assigned to std.range.interfaces.InputRange directly
myIota = new Generator!int(
{
foreach (i; 0 .. 10) yield(i);
});
myIota.popFront();
myIota.popFront();
assert(myIota.moveFront == 2);
assert(myIota.front == 2);
myIota.popFront();
assert(myIota.front == 3);
size_t[2] counter = [0, 0];
foreach (i, unused; myIota) counter[] += [1, i];
assert(myIota.empty);
assert(counter == [7, 21]);
}
@system unittest
{
import std.concurrency;
static class MySingleton
{
static MySingleton instance()
{
__gshared MySingleton inst;
return initOnce!inst(new MySingleton);
}
}
assert(MySingleton.instance !is null);
}
@system unittest
{
import std.concurrency;
import core.sync.mutex : Mutex;
static shared bool varA, varB;
static shared Mutex m;
m = new shared Mutex;
spawn({
// use a different mutex for varB to avoid a dead-lock
initOnce!varB(true, m);
ownerTid.send(true);
});
// init depends on the result of the spawned thread
initOnce!varA(receiveOnly!bool);
assert(varA == true);
assert(varB == true);
}