Trouble with semaphore library
Marc CHALAND
l4 at marc-chaland.net
Tue Oct 23 14:26:09 CEST 2007
Alexander Boettcher <boettcher at os.inf.tu-dresden.de>:
> Marc CHALAND wrote:
> > 2. thread 08 calls semaphore_up inline assembler code. Before IPC
> > call, the semaphore structure is as follow :
> > counter = 0
> > pending = 0
> > queue = 03
> >
> 2.1 Now, Thread 02 (the semaphore thread) have to run, because this is
> the only one which remove threads from the queue. Otherwise the 3. step
> below isn't possible (empty queue, so thread 03 must be removed by
> thread 02 from the queue).
Is there a mecanism which prevents thread 03 from running before IPC call ?
> > 3. Thread 03 gains the CPU after timeout and calls IPC RELEASETIMED :
> > counter = 1
> > pending = 0
> > queue = empty
> Thread 03 increment the counter only if it gets really a timeout,
> however the queue is already empty that means that thread 02 executed
> between 2. and 3. step (2.1). Therefore Thread 03 should get a wakeup
> IPC from Thread 02 instead of a timeout.
Into the code, it seams that after IPC timeout, counter is incremented
immediately, isn't it ?
After, 03 sends IPC RELEASETIMED and thread 02 removes thread from queue.
> > 4. Thread 02 doesn't find thread into queue, so that pending is set to 1.
> > counter = 1
> > pending = 1
> > queue = empty
This matches what you said into 2.1. In fact, I think 08 is
interrupted in such a way that when IPC is sent, there is nothing into
queue, so pending is set to 1.
> In state 5. and 6. the same thread (thread 03) calls semaphore_down
> twice without any semaphore_ups in between by other threads.
Yes, 03 is a consumer, not a producer. I don't use semaphore for
critical section but for a producer/consumer mecanism. 03 only makes
down_timed before a pop from queue and others make up after a push
into queue.
> Why the
> thread 03 acquires the semaphore again when it has it already ?
First time, counter is > 0 so, no ipc is called.
Second time, pending is also >0, so thread is imediately awaken even
if counter is < 0.
> This
> will cause strange behavior of your application/semaphore or will cause
> dead locks.
It causes semaphore_down exits without error code as my queue is
empty which is annoying.
Marc
More information about the l4-hackers
mailing list