> On Aug 20, 2015, at 5:55 PM, Ken Thomases <k...@codeweavers.com> wrote:
> 
> On Aug 20, 2015, at 7:29 PM, Carl Hoefs <newsli...@autonomy.caltech.edu> 
> wrote:
>> 
>> From within a background NSOperationQueue thread, the effects of alarm(3) 
>> seem to be ignored. (I use alarm() to interrupt certain system calls like 
>> connect() when they stall.) The alarm fires, the alarm handler is invoked, 
>> but the ongoing sys call is not interrupted, as it would be normally. Is 
>> there something inherent in NSOperationQueue that would block the delivery 
>> of alarms? Is there another way to effect this?
> 
> You can't do this safely.  alarm() was effectively obsoleted as soon as 
> multiple threads were introduced.  alarm() causes a signal to be delivered to 
> the process, not necessary the calling thread.  It may interrupt some system 
> call, but not necessarily the one you want it to.  Also, attempts to use 
> alarm() from multiple threads will supersede each other.
> 
> You should set your sockets to be non-blocking, initiate the connect() which 
> should return -1 and set errno to EINPROGRESS, and then use a 
> file-descriptor-readiness-testing API to determine when the attempt has 
> either succeeded or failed.  One approach is to use kqueue with an 
> appropriate time out on the kevent() call.  That is a blocking approach.
> 
> Another approach is to use dispatch sources.  You'd create one for the socket 
> and another for a timer.  Whichever fires first tells you what happened and 
> you should cancel the other.  This is non-blocking.  The thread can do other 
> things or be returned to the pool and maybe exit and, when the relevant event 
> occurs, a task will be queued to a queue.
> 
> If you want to stop a connect attempt that was initiated this way due to the 
> timeout expiring, close() the socket.

kqueue() works perfectly! (I never knew what OS X's equivalent to Linux's 
epoll() was.). Very nice. I was thinking of using select() instead, but 
kqueue() is more flexible and works for numerous system events.
Thanks for the sagely advice!
-Carl


_______________________________________________

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

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

Reply via email to