Consistency improvement: made sure that for all synchronization operations vector clocks are combined after having created a new segment instead of before.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10265 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/drd/drd_barrier.c b/drd/drd_barrier.c
index cc1077f..fceb644 100644
--- a/drd/drd_barrier.c
+++ b/drd/drd_barrier.c
@@ -456,6 +456,12 @@
VG_(OSetGen_Insert)(p->oset, q);
tl_assert(VG_(OSetGen_Lookup)(p->oset, &word_tid) == q);
}
+
+ /* Create a new segment and store a pointer to that segment. */
+ DRD_(thread_new_segment)(tid);
+ DRD_(thread_get_latest_segment)(&q->post_wait_sg, tid);
+ s_barrier_segment_creation_count++;
+
/*
* Combine all vector clocks that were stored in the pre_barrier_wait
* wrapper with the vector clock of the current thread.
@@ -470,11 +476,6 @@
}
}
- /* Create a new segment and store a pointer to that segment. */
- DRD_(thread_new_segment)(tid);
- DRD_(thread_get_latest_segment)(&q->post_wait_sg, tid);
- s_barrier_segment_creation_count++;
-
/*
* If the same number of threads as the barrier count indicates have
* called the post *_barrier_wait() wrapper, toggle p->post_iteration and
diff --git a/drd/drd_mutex.c b/drd/drd_mutex.c
index 0b7f360..82a3355 100644
--- a/drd/drd_mutex.c
+++ b/drd/drd_mutex.c
@@ -308,13 +308,14 @@
{
const DrdThreadId last_owner = p->owner;
+ DRD_(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);
DRD_(thread_combine_vc2)(drd_tid, &p->last_locked_segment->vc);
}
- DRD_(thread_new_segment)(drd_tid);
- s_mutex_segment_creation_count++;
p->owner = drd_tid;
p->acquiry_time_ms = VG_(read_millisecond_timer)();
diff --git a/drd/drd_rwlock.c b/drd/drd_rwlock.c
index 854e6ef..efbd4dc 100644
--- a/drd/drd_rwlock.c
+++ b/drd/drd_rwlock.c
@@ -381,10 +381,10 @@
q = DRD_(lookup_or_insert_node)(p->thread_info, drd_tid);
if (++q->reader_nesting_count == 1)
{
- DRD_(rwlock_combine_other_vc)(p, drd_tid, False);
q->last_lock_was_writer_lock = False;
DRD_(thread_new_segment)(drd_tid);
DRD_(s_rwlock_segment_creation_count)++;
+ DRD_(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);
@@ -462,9 +462,9 @@
q->writer_nesting_count++;
q->last_lock_was_writer_lock = True;
tl_assert(q->writer_nesting_count == 1);
- DRD_(rwlock_combine_other_vc)(p, drd_tid, True);
DRD_(thread_new_segment)(drd_tid);
DRD_(s_rwlock_segment_creation_count)++;
+ DRD_(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);
}
diff --git a/drd/drd_thread.c b/drd/drd_thread.c
index c8740e3..7a80230 100644
--- a/drd/drd_thread.c
+++ b/drd/drd_thread.c
@@ -297,9 +297,10 @@
{
tl_assert(DRD_(IsValidDrdThreadId)(drd_joiner));
tl_assert(DRD_(IsValidDrdThreadId)(drd_joinee));
- DRD_(thread_new_segment)(drd_joinee);
- DRD_(thread_combine_vc)(drd_joiner, drd_joinee);
+
DRD_(thread_new_segment)(drd_joiner);
+ DRD_(thread_combine_vc)(drd_joiner, drd_joinee);
+ DRD_(thread_new_segment)(drd_joinee);
if (s_trace_fork_join)
{