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