I'm porting some go code to D

Rory McGuire rjmcguire at gmail.com
Sun Aug 25 15:55:32 PDT 2013


On Sat, Aug 24, 2013 at 3:26 PM, bearophile <bearophileHUGS at lycos.com>wrote:

> David Nadlinger:
>
>
>  It's a cute idea, but not really practical, I'm afraid – Goroutines are
>> managed by a scheduler in the Go runtime library, whereas D threads
>> directly map to OS threads.
>>
>
> Can't Rory McGuire add a scheduler to his code? How much code does it take?
>
> Bye,
> bearophile
>


Here is a basic co-operative scheduler based version of go!(F)  that uses a
channel to keep things simple, its co-op so Fiber.yield has to be called at
some point. If the channel detects its in a Fiber it calls yield if there
is nothing available in it:

void go(alias F)() {
    scheduler._ = new Fiber(F);
}

shared chan!Fiber scheduler; // channel contains Fibers waiting for their
time slice
static this () {
    if (scheduler is null) {
        scheduler = makeChan!Fiber(100);

        // create the workers
        auto goprocs = environment.get("GOPROCS");
        int num_threads = 1;
        if (goprocs != null) {
            num_threads = to!int(goprocs);
        }
        foreach (i; 0..num_threads) {
            // create threads that process the live fibers
            auto t = new Thread(() {
                for (;;) {
                    auto fiber = scheduler._;
                    fiber.call();
                    if (fiber.state != Fiber.State.TERM) {
                        scheduler._ (fiber);
                    }
                }
                });
            t.start();
        }

    }
}

Just need to figure out a way to detect when main() has exited.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d-announce/attachments/20130826/e02661a1/attachment.html>


More information about the Digitalmars-d-announce mailing list