|
From: <sv...@va...> - 2009-06-06 13:06:05
|
Author: bart
Date: 2009-06-06 13:26:05 +0100 (Sat, 06 Jun 2009)
New Revision: 10265
Log:
Consistency improvement: made sure that for all synchronization operations vector clocks are combined after having created a new segment instead of before.
Modified:
trunk/drd/drd_barrier.c
trunk/drd/drd_mutex.c
trunk/drd/drd_rwlock.c
trunk/drd/drd_thread.c
Modified: trunk/drd/drd_barrier.c
===================================================================
--- trunk/drd/drd_barrier.c 2009-06-06 11:41:43 UTC (rev 10264)
+++ trunk/drd/drd_barrier.c 2009-06-06 12:26:05 UTC (rev 10265)
@@ -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
Modified: trunk/drd/drd_mutex.c
===================================================================
--- trunk/drd/drd_mutex.c 2009-06-06 11:41:43 UTC (rev 10264)
+++ trunk/drd/drd_mutex.c 2009-06-06 12:26:05 UTC (rev 10265)
@@ -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)();
Modified: trunk/drd/drd_rwlock.c
===================================================================
--- trunk/drd/drd_rwlock.c 2009-06-06 11:41:43 UTC (rev 10264)
+++ trunk/drd/drd_rwlock.c 2009-06-06 12:26:05 UTC (rev 10265)
@@ -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);
}
Modified: trunk/drd/drd_thread.c
===================================================================
--- trunk/drd/drd_thread.c 2009-06-06 11:41:43 UTC (rev 10264)
+++ trunk/drd/drd_thread.c 2009-06-06 12:26:05 UTC (rev 10265)
@@ -297,9 +297,10 @@
{
tl_assert(DRD_(IsValidDrdThreadId)(drd_joiner));
tl_assert(DRD_(IsValidDrdThreadId)(drd_joinee));
+
+ DRD_(thread_new_segment)(drd_joiner);
+ DRD_(thread_combine_vc)(drd_joiner, drd_joinee);
DRD_(thread_new_segment)(drd_joinee);
- DRD_(thread_combine_vc)(drd_joiner, drd_joinee);
- DRD_(thread_new_segment)(drd_joiner);
if (s_trace_fork_join)
{
|