VG_(OSetGen_Insert)(p->oset, q);
tl_assert(VG_(OSetGen_Lookup)(p->oset, &word_tid) == q);
}
+
+ thread_new_segment(tid);
+ s_barrier_segment_creation_count++;
+
VG_(OSetGen_ResetIter)(p->oset);
for ( ; (r = VG_(OSetGen_Next)(p->oset)) != 0; )
{
}
}
- thread_new_segment(tid);
- s_barrier_segment_creation_count++;
-
if (--p->post_waiters_left <= 0)
{
p->post_iteration = 1 - p->post_iteration;
// Function definitions.
+#if 0
+
GOMP_FUNC(void, gompZubarrierZuinit, // gomp_barrier_init
gomp_barrier_t* barrier, unsigned count)
{
VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_BARRIER_WAIT,
barrier, gomp_barrier, 1, 0, 0);
}
+
+#endif
{
tl_assert(IsValidDrdThreadId(drd_joiner));
tl_assert(IsValidDrdThreadId(drd_joinee));
- thread_new_segment(drd_joinee);
- thread_combine_vc(drd_joiner, drd_joinee);
+
thread_new_segment(drd_joiner);
+ thread_combine_vc(drd_joiner, drd_joinee);
+ thread_new_segment(drd_joinee);
if (s_drd_trace_fork_join)
{
{
const DrdThreadId last_owner = p->owner;
+ thread_new_segment(drd_tid);
+ s_mutex_segment_creation_count++;
+
if (last_owner != drd_tid && last_owner != DRD_INVALID_THREADID)
{
tl_assert(p->last_locked_segment);
thread_combine_vc2(drd_tid, &p->last_locked_segment->vc);
}
- thread_new_segment(drd_tid);
- s_mutex_segment_creation_count++;
p->owner = drd_tid;
p->acquiry_time_ms = VG_(read_millisecond_timer)();
q = lookup_or_insert_node(p->thread_info, drd_tid);
if (++q->reader_nesting_count == 1)
{
- rwlock_combine_other_vc(p, drd_tid, False);
q->last_lock_was_writer_lock = False;
thread_new_segment(drd_tid);
s_rwlock_segment_creation_count++;
+ rwlock_combine_other_vc(p, drd_tid, False);
p->acquiry_time_ms = VG_(read_millisecond_timer)();
p->acquired_at = VG_(record_ExeContext)(VG_(get_running_tid)(), 0);
q->writer_nesting_count++;
q->last_lock_was_writer_lock = True;
tl_assert(q->writer_nesting_count == 1);
- rwlock_combine_other_vc(p, drd_tid, True);
thread_new_segment(drd_tid);
s_rwlock_segment_creation_count++;
+ rwlock_combine_other_vc(p, drd_tid, True);
p->acquiry_time_ms = VG_(read_millisecond_timer)();
p->acquired_at = VG_(record_ExeContext)(VG_(get_running_tid)(), 0);
}
p = semaphore_get_or_allocate(semaphore);
tl_assert(p);
- tl_assert((int)p->waiters >= 0);
p->waiters++;
- tl_assert(p->waiters > 0);
+
+ if ((int)p->waiters <= 0)
+ {
+ SemaphoreErrInfo sei = { semaphore };
+ VG_(maybe_record_error)(VG_(get_running_tid)(),
+ SemaphoreErr,
+ VG_(get_IP)(VG_(get_running_tid)()),
+ "Invalid semaphore",
+ &sei);
+ }
}
/** Called after sem_wait() finished.
p ? p->value : 0,
p ? p->value - 1 : 0);
}
- tl_assert(p);
- tl_assert(p->waiters > 0);
- p->waiters--;
- tl_assert((int)p->waiters >= 0);
- tl_assert((int)p->value >= 0);
- if (p->value == 0)
+
+ if (p)
+ {
+ p->waiters--;
+ p->value--;
+ }
+
+ /*
+ * Note: if another thread destroyed and reinitialized a semaphore while
+ * the current thread was waiting in sem_wait, p->waiters may have been
+ * set to zero by semaphore_initialize() after
+ * semaphore_pre_wait() has finished before
+ * semaphore_post_wait() has been called.
+ */
+ if (p == NULL || (int)p->value < 0 || (int)p->waiters < 0)
{
SemaphoreErrInfo sei = { semaphore };
VG_(maybe_record_error)(VG_(get_running_tid)(),
&sei);
return;
}
- p->value--;
- tl_assert((int)p->value >= 0);
+
if (p->waits_to_skip > 0)
p->waits_to_skip--;
else
tl_assert(sg);
if (sg)
{
+ thread_new_segment(tid);
+ s_semaphore_segment_creation_count++;
+
if (p->last_sem_post_tid != tid
&& p->last_sem_post_tid != DRD_INVALID_THREADID)
{
thread_combine_vc2(tid, &sg->vc);
}
sg_put(sg);
- thread_new_segment(tid);
- s_semaphore_segment_creation_count++;
}
}
}
}
p->last_sem_post_tid = tid;
- thread_new_segment(tid);
sg = 0;
thread_get_latest_segment(&sg, tid);
tl_assert(sg);
segment_push(p, sg);
+ thread_new_segment(tid);
s_semaphore_segment_creation_count++;
}
semaphore 0x........ was first observed at:
at 0x........: sem_init* (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:228)
-[1/1] semaphore_post 0x........ value 0 -> 1
+[1/1] semaphore_post 0x........ value 4294967295 -> 0
FIXME: can't figure out how to verify wrap of sem_post
-[1/1] semaphore_destroy 0x........ value 1
+[1/1] semaphore_destroy 0x........ value 0
------------ dealloc of mem holding locks ------------
semaphore 0x........ was first observed at:
at 0x........: sem_init* (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:228)
-[1/1] semaphore_post 0x........ value 0 -> 1
+[1/1] semaphore_post 0x........ value 4294967295 -> 0
FIXME: can't figure out how to verify wrap of sem_post
-[1/1] semaphore_destroy 0x........ value 1
+[1/1] semaphore_destroy 0x........ value 0
------------ dealloc of mem holding locks ------------
semaphore 0x........ was first observed at:
at 0x........: sem_init* (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:228)
-[1/1] semaphore_post 0x........ value 0 -> 1
+[1/1] semaphore_post 0x........ value 4294967295 -> 0
FIXME: can't figure out how to verify wrap of sem_post
-[1/1] semaphore_destroy 0x........ value 1
+[1/1] semaphore_destroy 0x........ value 0
------------ dealloc of mem holding locks ------------
semaphore 0x........ was first observed at:
at 0x........: sem_init* (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:228)
-[1/1] semaphore_post 0x........ value 0 -> 1
+[1/1] semaphore_post 0x........ value 4294967295 -> 0
FIXME: can't figure out how to verify wrap of sem_post
-[1/1] semaphore_destroy 0x........ value 1
+[1/1] semaphore_destroy 0x........ value 0
------------ dealloc of mem holding locks ------------
semaphore 0x........ was first observed at:
at 0x........: sem_init* (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:228)
-[1/1] semaphore_post 0x........ value 0 -> 1
+[1/1] semaphore_post 0x........ value 4294967295 -> 0
FIXME: can't figure out how to verify wrap of sem_post
-[1/1] semaphore_destroy 0x........ value 1
+[1/1] semaphore_destroy 0x........ value 0
------------ dealloc of mem holding locks ------------
gomp
drd:ConflictingAccess
obj:/usr/lib*/libgomp.so*
- obj:/usr/lib*/libgomp.so*
}
{
libX11-XCreateFontSet