Canceling/releasing a suspended timer
It appears that releasing a suspended timer is not allowed and will crash. Also, canceling the suspended timer does not appear to work and call the cancel handler. Are these correct assumptions? If so, then if I have a suspended timer, is the proper way to cancel or release it is to first resume? However I would imagine there is still the off chance that the timer could fire in between those calls to resume and cancel, requiring a flag to be set. Kevin
The crash you're seeing is actually an assertion. Dispatch objects must be fully resumed before the final release, this is so that the object can navigate through the internal machinery to properly cancel, etc. I think the order of operations you're looking for is: dispatch_source_cancel(source); // ATOMIC ; this guarantees the event handler will not fire again after the source is resumed dispatch_resume(source); dispatch_release(source); Hope this helps, Kevin On Dec 14, 2010, at 3:33 PM, Kevin Wojniak wrote:
It appears that releasing a suspended timer is not allowed and will crash. Also, canceling the suspended timer does not appear to work and call the cancel handler. Are these correct assumptions? If so, then if I have a suspended timer, is the proper way to cancel or release it is to first resume? However I would imagine there is still the off chance that the timer could fire in between those calls to resume and cancel, requiring a flag to be set.
Kevin
Thanks Kevin, that works. On Dec 14, 2010, at 4:06 PM, Kevin Van Vechten wrote:
The crash you're seeing is actually an assertion. Dispatch objects must be fully resumed before the final release, this is so that the object can navigate through the internal machinery to properly cancel, etc.
I think the order of operations you're looking for is:
dispatch_source_cancel(source); // ATOMIC ; this guarantees the event handler will not fire again after the source is resumed dispatch_resume(source); dispatch_release(source);
Hope this helps,
Kevin
On Dec 14, 2010, at 3:33 PM, Kevin Wojniak wrote:
It appears that releasing a suspended timer is not allowed and will crash. Also, canceling the suspended timer does not appear to work and call the cancel handler. Are these correct assumptions? If so, then if I have a suspended timer, is the proper way to cancel or release it is to first resume? However I would imagine there is still the off chance that the timer could fire in between those calls to resume and cancel, requiring a flag to be set.
Kevin
participants (2)
-
Kevin Van Vechten
-
Kevin Wojniak