| @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); | |
| } | |