Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 30 Mar 2003 21:36:43 -0600
From:      Dan Nelson <dnelson@allantgroup.com>
To:        Sean Hamilton <sh@bel.bc.ca>
Cc:        hackers@freebsd.org
Subject:   Re: wait()/alarm() race condition
Message-ID:  <20030331033643.GO74971@dan.emsphone.com>
In-Reply-To: <007e01c2f730$4b5863d0$0300000a@slugabed.org>
References:  <001101c2f71d$8d9e4fb0$0300000a@slugabed.org> <20030331023856.GL74971@dan.emsphone.com> <007e01c2f730$4b5863d0$0300000a@slugabed.org>

next in thread | previous in thread | raw e-mail | index | archive | help
In the last episode (Mar 30), Sean Hamilton said:
> Dan Nelson wrote:
> | Just make sure your signal handler has the SA_RESTART flag unset
> | (either via siginterrupt() if the handler was installed with
> | signal(), or directly if the signal was installed with sigaction()
> | ), and the signal will interrupt the wait() call.
> 
> Er, I think you've missed my problem. Or I'm not getting your solution.
> 
> I'm concerned about this order of events:
> 
> - alarm()
> - wait() returns successfully
> - if (alarmed...) [false]
> - SIGALRM is delivered, alarmed = true
> - loop
> - wait() waits indefinitely

You can probably do something like "alarm(1);" at the top of your
handle_sigalarm function.  That way after 60 seconds the alarm will
fire every second until cleared.

A cleaner solution would be to use ualarm(60000,1000) or setitimer() to
do this (replacing the alarm(60) call outside the handler).

> This is incredibly unlikely to ever happen, but it's irritating me
> somewhat that the code isn't airtight. Bad design. Surely there is
> some atomic means of setting a timeout on a system call.

-- 
	Dan Nelson
	dnelson@allantgroup.com



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030331033643.GO74971>