On Tuesday, 2 January 2018 at 07:10:14 UTC, ChangLong wrote:
On Monday, 1 January 2018 at 03:06:42 UTC, David Nadlinger
wrote:
On Saturday, 30 December 2017 at 13:48:16 UTC, ChangLong wrote:
After fiber yield, the spoke guard is not able to execute,
unless I throw a exception in Fiber. I am look if there is
some hack method to make the fiber Interrupted at any time
with
scope(exit) code executed.
There isn't. In fact, ensuring that the scope isn't left is
the whole point of fibre context switches – how else would
execution continue after the fibre is returned to? (How would
objects be "un-destroyed"?)
However, there is nothing stopping you from creating a
registry of resources yourself, and then wrapping the
Fiber.yield() call into something like:
void myYield() {
registry.releaseResources();
Fiber.yield();
registry.reacquireResources();
}
You could have the resource handles be structs that register
themselves with the registry to integrate with fibre
scheduling, and that also have a destructor to execute the
cleanup when the scope is left (like `scope(exit)`).
— David
I was looking for some thing like yieldAndThrow, and destroy
or reset the fiber same time, without throw exception but call
the scope(exit). I guess It maybe can be done with some ASM
jump code. (or I am wrong.)
I already ask from Learn board few days ago, no answer yet so
I paste it here.
I just implement solution, maybe some one is interested.
step 1: add a FiberQuitChain for each Fiber, when fiber is
terminated each chain delegate will be executed in order.
step 2: when create a new Resource, add the onCancel delegate
into FiberQuitChain. doCancel or ~this will remove it self from
FiberQuitChain.
When a fiber is Killed it will call the FiberQuitChain to notify
every resource the mission is aborted, the resource will release
them self.