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.

davez_______________________________________________

Cocoa-dev mailing list ([email protected])

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 [email protected]

Reply via email to