drd: Handle non-zero sem_*wait() return values correctly. Fixes #305690.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12897 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/drd/drd_semaphore.c b/drd/drd_semaphore.c
index 5045805..bae3e4d 100644
--- a/drd/drd_semaphore.c
+++ b/drd/drd_semaphore.c
@@ -339,8 +339,7 @@
 
 /**
  * Called after sem_wait() finished.
- * @note Do not rely on the value of 'waited' -- some glibc versions do
- *       not set it correctly.
+ * @note Some C libraries do not set the 'waited' value correctly.
  */
 void DRD_(semaphore_post_wait)(const DrdThreadId tid, const Addr semaphore,
                                const Bool waited)
@@ -354,10 +353,10 @@
                       DRD_(thread_get_running_tid)(), semaphore,
                       p ? p->value : 0, p ? p->value - 1 : 0);
 
-   if (p)
-   {
+   if (p) {
       p->waiters--;
-      p->value--;
+      if (waited)
+         p->value--;
    }
 
    /*
@@ -378,6 +377,9 @@
       return;
    }
 
+   if (!waited)
+      return;
+
    if (p->waits_to_skip > 0)
       p->waits_to_skip--;
    else