/**
* 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)
struct semaphore_info* p;
Segment* sg;
+ tl_assert(waited == 0 || waited == 1);
p = semaphore_get(semaphore);
if (s_trace_semaphore)
- DRD_(trace_msg)("[%d] sem_wait 0x%lx value %u -> %u",
+ DRD_(trace_msg)("[%d] sem_wait 0x%lx value %u -> %u%s",
DRD_(thread_get_running_tid)(), semaphore,
- p ? p->value : 0, p ? p->value - 1 : 0);
+ p ? p->value : 0, p ? p->value - waited : 0,
+ waited ? "" : " (did not wait)");
- if (p)
- {
+ if (p) {
p->waiters--;
- p->value--;
+ p->value -= waited;
}
/*
return;
}
+ if (!waited)
+ return;
+
if (p->waits_to_skip > 0)
p->waits_to_skip--;
else