import std.concurrency;
import std.typecons : Unique;
import std.exception : assumeUnique;

struct Foo { }

struct Bar { }

void bar_generator (Tid ownerTid)
{
    receive(
        (shared(Foo)* input) {
            auto output = new Bar[100];
            // compute output ..
            // .. and cast to immutable via assumeUnique when
            // finished as it won't be mutated anymore and no
            // other pointers exist
            send(ownerTid, assumeUnique(output));
        }
    );
}

void main ()
{
    auto generator = spawn(&bar_generator, thisTid);

    // must be shared or immutable to be passed between threads
    auto input = new shared Foo;
    send(generator, input);

    // in real app use `receiveTimeout` to do useful stuff until
    // result message is received
    auto output = receiveOnly!(immutable(Bar)[]);

    import std.stdio;
    writeln(output.length);
}

Reply via email to