D and microservices

Ola Fosheim Grøstad via Digitalmars-d digitalmars-d at puremagic.com
Thu Oct 8 00:58:15 PDT 2015


On Thursday, 8 October 2015 at 03:12:03 UTC, Martin Nowak wrote:
> We might be able to reuse the existing delegate capture 
> mechanism to create continuations.
> Then await would "simply" rewrite the rest of the body as 
> delegate, similar to how the foreach body can be transformed 
> into a delegate.

Not sure how that works? What is needed is to preallocate a 
"continuation" that is large enough to cover all "stack 
allocated" state that has to be retained when the coroutine 
yields, at all yield points. But with reuse of memory for dead 
variables (like in optimized stack usage where you reuse stack 
memory that is dead). Then use those areas of the continuation 
during computation rather than the stack.

So basically all functions that may yield have to be available 
for static analysis before you start up the coroutine and all 
reachable yield points have to be analysed. So you basically have 
one big stack frame at the "top of the stack" as a separate 
object (the "continuation") and everything that has to survive a 
yield has to go onto that frame.

That's how I would do it anyway.

> There is some use-case for HPC code where stackless coroutines 
> make a huge differences (used with a work stealing scheduler), 
> for basic networking code it will only be a small difference.

The current D implementation can run out of stack. That's much 
less of an issue if the system/thread stack is used in 
combination with a fixed size preallocated "continuation".



More information about the Digitalmars-d mailing list