Re: waiting on a condition

From: Neil Horman
Date: Wed Oct 13 2004 - 09:58:52 EST


Martijn Sipkema wrote:
L.S.

I'd like to do something similar as can be done using a POSIX condition
variable in the kernel, i.e. wait for some condition to become true. The
pthread_cond_wait() function allows atomically unlocking a mutex and
waiting on a condition. I think I should do something like:
(the condition is updated from an interrupt handler)

disable interrupts
acquire spinlock
if condition not satisfied
add task to wait queue
set task to sleep
release spinlock
restore interrupts
schedule

Now, this will only work with preemption disabled within the critical
section. How would something like this be done whith preemption
enabled?

you above algorithm seems rather prone to deadlock. Everything else in the kernel does more or less this operation by using a wait queue and a call to schedule to make tasks sleep until an event is signaled with a call to one of the wake_up family of functions. Then a spinlock is used to protect any critical data regions in smp environments. Search the kernel for calls to add_wait_queue and wake_up[_interruptible] for examples of how this is implemented.

HTH
Neil


--ms




-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/


--
/***************************************************
*Neil Horman
*Software Engineer
*Red Hat, Inc.
*nhorman@xxxxxxxxxx
*gpg keyid: 1024D / 0x92A74FA1
*http://pgp.mit.edu
***************************************************/
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/