Re: GCD cancel handler invocation
Re: GCD cancel handler invocation
- Subject: Re: GCD cancel handler invocation
- From: Ken Thomases <email@hidden>
- Date: Mon, 10 Jan 2011 16:58:11 -0600
On Jan 10, 2011, at 4:20 PM, Dave Zarzycki wrote:
> On Jan 10, 2011, at 2:06 PM, Jonathon Kuo wrote:
>
>> I set up a source handler on a TCP socket like this:
>> dispatch_source_t newsrc = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ,sockfd,0,globalQueue);
>>
>> It works well, and when a client process closes his socket my cancel_handler gets called, I clean up, and life is good. But if I do a close(sockfd) from my side, my cancel_handler doesn't get invoked. I have to explicitly do a dispatch_source_cancel(). Shouldn't closing the socket be enough to cause my cancel_handler to be run?
>
> Jonathon,
>
> No. This is covered in the dispatch_source_create() man page under the section on cancelation:
>
> Important: a cancellation handler is required for file descriptor and mach port based sources in order to safely close the descriptor or destroy the port. Closing the descriptor or port before the cancellation handler has run may result in a race condition: if a new descriptor is allocated with the same value as the recently closed descriptor while the source's event handler is still running, the event handler may read/write data to the wrong descriptor.
And, likewise, it is not safe to close a file descriptor in one thread while it is the subject of a read(), select(), kevent(), or similar in another thread. In other words, in no system API is it safe to do what you're trying to do.
Regards,
Ken
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden