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