|
From: <sv...@va...> - 2012-08-24 17:59:10
|
bart 2012-08-24 18:59:03 +0100 (Fri, 24 Aug 2012)
New Revision: 12897
Log:
drd: Handle non-zero sem_*wait() return values correctly. Fixes #305690.
Modified files:
trunk/drd/drd_semaphore.c
Modified: trunk/drd/drd_semaphore.c (+7 -5)
===================================================================
--- trunk/drd/drd_semaphore.c 2012-08-24 18:57:44 +01:00 (rev 12896)
+++ trunk/drd/drd_semaphore.c 2012-08-24 18:59:03 +01:00 (rev 12897)
@@ -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
|