Is there a way to call scope guard without throw exception?
ChangLong
changlon at gmail.com
Wed Jan 3 09:39:09 UTC 2018
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.
More information about the Digitalmars-d
mailing list