On Jan 10, 2011, at 2:58 PM, Ken Thomases wrote:

> 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.

Okay... then is the only place I should ever call the close() is from within 
the cancel_handler for that file descriptor?


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to