from Bjoern Doebel :

> Are you just having a problem understanding the observed values or is there
> a real problem that you are running into? If the latter, could you provide
> a small example program so that we can reproduce it here?

That's a real problem. I use several producer (08 and others) and one
consumer (03) around a queue. I observed state 4, 5 and 6. This is
anoying because semaphore_down exits as my queue is empty. At the
begining I looked for some memory overflow into my code... But I found
the scenario above which could explain this strange state.

I tried a little change into archindep.h and the problem doesn't
appear anymore. However, I find it very dirty and uncomplete because
asm.h and generic should be also changed. As I don't know very well
semaphore, maybe there are some case broken ?

Marc

--- include/archindep.h (revision 230)
+++ include/archindep.h (working copy)
@@ -54,7 +54,7 @@
 L4_INLINE int
 l4semaphore_down_timed(l4semaphore_t * sem, unsigned timeout)
 {
-  int old,tmp,ret;
+  int old,pending,tmp,ret;
   l4_umword_t dummy;
   l4_msgdope_t result;

@@ -66,6 +66,7 @@
   do
     {
       old = sem->counter;
+      pending = sem->pending
       tmp = old - 1;
     }
   /* retry if someone else also modified the counter */
@@ -73,7 +74,7 @@
                           (l4_uint32_t)old, (l4_uint32_t)tmp));


-  if (tmp < 0)
+  if (pending || (tmp < 0))
     {
       /* we did not get the semaphore, block */
       ret = l4_ipc_call(l4semaphore_thread_l4_id,

_______________________________________________
l4-hackers mailing list
l4-hackers@os.inf.tu-dresden.de
http://os.inf.tu-dresden.de/mailman/listinfo/l4-hackers

Reply via email to