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)
    {