NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
kern/38554: kernel condvar wait functions should take an absolute timeout
>Number: 38554
>Category: kern
>Synopsis: kernel condvar wait functions should take an absolute timeout
>Confidential: no
>Severity: serious
>Priority: high
>Responsible: kern-bug-people
>State: open
>Class: change-request
>Submitter-Id: net
>Arrival-Date: Thu May 01 11:50:00 +0000 2008
>Originator: Andrew Doran
>Release: 4.99.62
>Organization:
The NetBSD Project
>Environment:
n/a
>Description:
When sleeping on condition variables in the kernel, threads must be
prepared to handle "spurious wakeups": wakeups that occur due to some
external agent and do not signal an event of interest to the sleeping
thread.
We have lots of code segments that do, for example:
while (!condition) {
error = cv_timedwait(&cv, &lock, hz);
if (error == EWOULDBLOCK)
break;
...
}
If a spurious wakeup occurs, the thread could sleep for N*hz instead
of hz, or it could awaken early and return. Early wakeups are bad news
for syscalls like nanosleep().
>How-To-Repeat:
Code inspection.
>Fix:
Make condvars take an absolute timeout and add some simple functions
to help with computing wakeup times. The above code fragment would
then look something like the following:
when = cv_time_now() + cv_time_second();
while (!condition) {
error = cv_timedwait(&cv, &lock, when);
if (error == EWOULDBLOCK)
break;
...
}
This makes condvars slightly more compatible with the Solaris
interfaces. I think it should also be done before 5.0, because
it's a fairly major change to the interface and it would be good
to have it full stable before it is set in stone.
Home |
Main Index |
Thread Index |
Old Index