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