You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(122) |
Nov
(152) |
Dec
(69) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(6) |
Feb
(25) |
Mar
(73) |
Apr
(82) |
May
(24) |
Jun
(25) |
Jul
(10) |
Aug
(11) |
Sep
(10) |
Oct
(54) |
Nov
(203) |
Dec
(182) |
| 2004 |
Jan
(307) |
Feb
(305) |
Mar
(430) |
Apr
(312) |
May
(187) |
Jun
(342) |
Jul
(487) |
Aug
(637) |
Sep
(336) |
Oct
(373) |
Nov
(441) |
Dec
(210) |
| 2005 |
Jan
(385) |
Feb
(480) |
Mar
(636) |
Apr
(544) |
May
(679) |
Jun
(625) |
Jul
(810) |
Aug
(838) |
Sep
(634) |
Oct
(521) |
Nov
(965) |
Dec
(543) |
| 2006 |
Jan
(494) |
Feb
(431) |
Mar
(546) |
Apr
(411) |
May
(406) |
Jun
(322) |
Jul
(256) |
Aug
(401) |
Sep
(345) |
Oct
(542) |
Nov
(308) |
Dec
(481) |
| 2007 |
Jan
(427) |
Feb
(326) |
Mar
(367) |
Apr
(255) |
May
(244) |
Jun
(204) |
Jul
(223) |
Aug
(231) |
Sep
(354) |
Oct
(374) |
Nov
(497) |
Dec
(362) |
| 2008 |
Jan
(322) |
Feb
(482) |
Mar
(658) |
Apr
(422) |
May
(476) |
Jun
(396) |
Jul
(455) |
Aug
(267) |
Sep
(280) |
Oct
(253) |
Nov
(232) |
Dec
(304) |
| 2009 |
Jan
(486) |
Feb
(470) |
Mar
(458) |
Apr
(423) |
May
(696) |
Jun
(461) |
Jul
(551) |
Aug
(575) |
Sep
(134) |
Oct
(110) |
Nov
(157) |
Dec
(102) |
| 2010 |
Jan
(226) |
Feb
(86) |
Mar
(147) |
Apr
(117) |
May
(107) |
Jun
(203) |
Jul
(193) |
Aug
(238) |
Sep
(300) |
Oct
(246) |
Nov
(23) |
Dec
(75) |
| 2011 |
Jan
(133) |
Feb
(195) |
Mar
(315) |
Apr
(200) |
May
(267) |
Jun
(293) |
Jul
(353) |
Aug
(237) |
Sep
(278) |
Oct
(611) |
Nov
(274) |
Dec
(260) |
| 2012 |
Jan
(303) |
Feb
(391) |
Mar
(417) |
Apr
(441) |
May
(488) |
Jun
(655) |
Jul
(590) |
Aug
(610) |
Sep
(526) |
Oct
(478) |
Nov
(359) |
Dec
(372) |
| 2013 |
Jan
(467) |
Feb
(226) |
Mar
(391) |
Apr
(281) |
May
(299) |
Jun
(252) |
Jul
(311) |
Aug
(352) |
Sep
(481) |
Oct
(571) |
Nov
(222) |
Dec
(231) |
| 2014 |
Jan
(185) |
Feb
(329) |
Mar
(245) |
Apr
(238) |
May
(281) |
Jun
(399) |
Jul
(382) |
Aug
(500) |
Sep
(579) |
Oct
(435) |
Nov
(487) |
Dec
(256) |
| 2015 |
Jan
(338) |
Feb
(357) |
Mar
(330) |
Apr
(294) |
May
(191) |
Jun
(108) |
Jul
(142) |
Aug
(261) |
Sep
(190) |
Oct
(54) |
Nov
(83) |
Dec
(22) |
| 2016 |
Jan
(49) |
Feb
(89) |
Mar
(33) |
Apr
(50) |
May
(27) |
Jun
(34) |
Jul
(53) |
Aug
(53) |
Sep
(98) |
Oct
(206) |
Nov
(93) |
Dec
(53) |
| 2017 |
Jan
(65) |
Feb
(82) |
Mar
(102) |
Apr
(86) |
May
(187) |
Jun
(67) |
Jul
(23) |
Aug
(93) |
Sep
(65) |
Oct
(45) |
Nov
(35) |
Dec
(17) |
| 2018 |
Jan
(26) |
Feb
(35) |
Mar
(38) |
Apr
(32) |
May
(8) |
Jun
(43) |
Jul
(27) |
Aug
(30) |
Sep
(43) |
Oct
(42) |
Nov
(38) |
Dec
(67) |
| 2019 |
Jan
(32) |
Feb
(37) |
Mar
(53) |
Apr
(64) |
May
(49) |
Jun
(18) |
Jul
(14) |
Aug
(53) |
Sep
(25) |
Oct
(30) |
Nov
(49) |
Dec
(31) |
| 2020 |
Jan
(87) |
Feb
(45) |
Mar
(37) |
Apr
(51) |
May
(99) |
Jun
(36) |
Jul
(11) |
Aug
(14) |
Sep
(20) |
Oct
(24) |
Nov
(40) |
Dec
(23) |
| 2021 |
Jan
(14) |
Feb
(53) |
Mar
(85) |
Apr
(15) |
May
(19) |
Jun
(3) |
Jul
(14) |
Aug
(1) |
Sep
(57) |
Oct
(73) |
Nov
(56) |
Dec
(22) |
| 2022 |
Jan
(3) |
Feb
(22) |
Mar
(6) |
Apr
(55) |
May
(46) |
Jun
(39) |
Jul
(15) |
Aug
(9) |
Sep
(11) |
Oct
(34) |
Nov
(20) |
Dec
(36) |
| 2023 |
Jan
(79) |
Feb
(41) |
Mar
(99) |
Apr
(169) |
May
(48) |
Jun
(16) |
Jul
(16) |
Aug
(57) |
Sep
(19) |
Oct
|
Nov
|
Dec
|
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
|
|
|
|
|
|
|
1
(21) |
|
2
(19) |
3
(33) |
4
(24) |
5
(18) |
6
(13) |
7
(22) |
8
(21) |
|
9
(38) |
10
(25) |
11
(20) |
12
(27) |
13
(43) |
14
(9) |
15
(19) |
|
16
(37) |
17
(19) |
18
(13) |
19
(11) |
20
(8) |
21
(11) |
22
(25) |
|
23
(21) |
24
(30) |
25
(18) |
26
(11) |
27
(10) |
28
(14) |
29
(40) |
|
30
(24) |
31
(14) |
|
|
|
|
|
|
From: <sv...@va...> - 2008-03-16 18:18:40
|
Author: bart Date: 2008-03-16 18:18:41 +0000 (Sun, 16 Mar 2008) New Revision: 7719 Log: Updated to do list. Modified: trunk/exp-drd/TODO.txt Modified: trunk/exp-drd/TODO.txt =================================================================== --- trunk/exp-drd/TODO.txt 2008-03-16 18:15:56 UTC (rev 7718) +++ trunk/exp-drd/TODO.txt 2008-03-16 18:18:41 UTC (rev 7719) @@ -35,13 +35,9 @@ - Find out why no line number or variable name information is printed for races detected in parallel sections of OpenMP programs. An example: ./vg-in-place --tool=exp-drd exp-drd/tests/omp_prime 4 -t 2 -- Find out why there are races reported on exp-drd/tests/pth_detached_sem - on AMD64 (information about freeing stack memory not passed to DRD ?): - ./vg-in-place --tool=exp-drd exp-drd/tests/pth_detached_sem 3 0 - Find a way for suppressing races reported on _IO_2_1_stdout. This race is triggered by calling printf() from more than one thread. Examples (AMD64): ./vg-in-place --tool=exp-drd exp-drd/tests/tc21_pthonce - ./vg-in-place --tool=exp-drd exp-drd/tests/pth_detached 10 10 1 - Find out why 'matinv 400' runs faster in 32-bit mode than in 64-bit mode on the same CPU. - testing on PPC and AIX (current implementation is only tested on X86 and |
|
From: <sv...@va...> - 2008-03-16 18:15:56
|
Author: bart Date: 2008-03-16 18:15:56 +0000 (Sun, 16 Mar 2008) New Revision: 7718 Log: Even more expected output updates. Modified: trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp-linuxthreads Modified: trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp-linuxthreads =================================================================== --- trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp-linuxthreads 2008-03-16 18:04:48 UTC (rev 7717) +++ trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp-linuxthreads 2008-03-16 18:15:56 UTC (rev 7718) @@ -8,4 +8,12 @@ after having upgraded to a newer version of your Linux distribution. Giving up. -ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) +Destroying locked mutex: mutex 0x........, recursion count 1, owner 1. + at 0x........: kill (in /...libc...) + by 0x........: abort (in /...libc...) + by 0x........: vg_set_main_thread_state (drd_pthread_intercepts.c:?) + by 0x........: pthread_create* (drd_pthread_intercepts.c:?) + by 0x........: nearly_main (../../helgrind/tests/tc09_bad_unlock.c:35) + by 0x........: main (../../helgrind/tests/tc09_bad_unlock.c:49) + +ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0) |
|
From: <sv...@va...> - 2008-03-16 18:04:43
|
Author: bart
Date: 2008-03-16 18:04:48 +0000 (Sun, 16 Mar 2008)
New Revision: 7717
Log:
More expected output updates.
Modified:
trunk/exp-drd/tests/tc20_verifywrap.stderr.exp-glibc2.3
trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b
Modified: trunk/exp-drd/tests/tc20_verifywrap.stderr.exp-glibc2.3
===================================================================
--- trunk/exp-drd/tests/tc20_verifywrap.stderr.exp-glibc2.3 2008-03-16 17:57:01 UTC (rev 7716)
+++ trunk/exp-drd/tests/tc20_verifywrap.stderr.exp-glibc2.3 2008-03-16 18:04:48 UTC (rev 7717)
@@ -5,13 +5,13 @@
---------------- pthread_create/join ----------------
-Conflicting store by thread 1 at 0x........ size 2
+Conflicting store by thread 1/1 at 0x........ size 2
at 0x........: main (tc20_verifywrap.c:78)
Location 0x........ is 0 bytes inside global var "unprotected"
declared at tc20_verifywrap.c:27
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
---------------- pthread_mutex_lock et al ----------------
Modified: trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b
===================================================================
--- trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b 2008-03-16 17:57:01 UTC (rev 7716)
+++ trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b 2008-03-16 18:04:48 UTC (rev 7717)
@@ -5,13 +5,13 @@
---------------- pthread_create/join ----------------
-Conflicting store by thread 1 at 0x........ size 2
+Conflicting store by thread 1/1 at 0x........ size 2
at 0x........: main (tc20_verifywrap.c:78)
Location 0x........ is 0 bytes inside global var "unprotected"
declared at tc20_verifywrap.c:27
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
---------------- pthread_mutex_lock et al ----------------
|
|
From: <sv...@va...> - 2008-03-16 17:56:57
|
Author: bart
Date: 2008-03-16 17:57:01 +0000 (Sun, 16 Mar 2008)
New Revision: 7716
Log:
All error and trace messages now show both Valgrind's and DRD's thread ID.
Modified:
trunk/exp-drd/drd_error.c
trunk/exp-drd/drd_segment.c
trunk/exp-drd/drd_thread.c
trunk/exp-drd/tests/fp_race.stderr.exp
trunk/exp-drd/tests/hg03_inherit.stderr.exp
trunk/exp-drd/tests/hg04_race.stderr.exp
trunk/exp-drd/tests/hg05_race2.stderr.exp
trunk/exp-drd/tests/rwlock_race.stderr.exp
trunk/exp-drd/tests/sem_as_mutex.stderr.exp
trunk/exp-drd/tests/tc01_simple_race.stderr.exp
trunk/exp-drd/tests/tc16_byterace.stderr.exp
trunk/exp-drd/tests/tc20_verifywrap.stderr.exp
trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp
Modified: trunk/exp-drd/drd_error.c
===================================================================
--- trunk/exp-drd/drd_error.c 2008-03-16 17:44:17 UTC (rev 7715)
+++ trunk/exp-drd/drd_error.c 2008-03-16 17:57:01 UTC (rev 7716)
@@ -81,10 +81,10 @@
describe_malloced_addr(dri->addr, dri->size, &ai);
}
VG_(message)(Vg_UserMsg,
- "Conflicting %s by thread %d at 0x%08lx size %ld",
+ "Conflicting %s by thread %d/%d at 0x%08lx size %ld",
dri->access_type == eStore ? "store" : "load",
DrdThreadIdToVgThreadId(dri->tid),
- /*dri->tid,*/
+ dri->tid,
dri->addr,
dri->size);
VG_(pp_ExeContext)(VG_(get_error_where)(err));
@@ -156,8 +156,9 @@
case CondDestrErr: {
CondDestrErrInfo* cdi = (CondDestrErrInfo*)(VG_(get_error_extra)(e));
VG_(message)(Vg_UserMsg,
- "%s: cond 0x%lx, mutex 0x%lx locked by thread %d",
- cdi->cond, cdi->mutex, cdi->tid);
+ "%s: cond 0x%lx, mutex 0x%lx locked by thread %d/%d",
+ cdi->cond, cdi->mutex,
+ DrdThreadIdToVgThreadId(cdi->tid), cdi->tid);
VG_(pp_ExeContext)(VG_(get_error_where)(e));
break;
}
Modified: trunk/exp-drd/drd_segment.c
===================================================================
--- trunk/exp-drd/drd_segment.c 2008-03-16 17:44:17 UTC (rev 7715)
+++ trunk/exp-drd/drd_segment.c 2008-03-16 17:57:01 UTC (rev 7716)
@@ -81,8 +81,8 @@
{
char msg[256];
VG_(snprintf)(msg, sizeof(msg),
- "New segment for thread %d with vc ",
- creator);
+ "New segment for thread %d/%d with vc ",
+ DrdThreadIdToVgThreadId(creator), creator);
vc_snprint(msg + VG_(strlen)(msg), sizeof(msg) - VG_(strlen)(msg),
&sg->vc);
VG_(message)(Vg_UserMsg, "%s", msg);
Modified: trunk/exp-drd/drd_thread.c
===================================================================
--- trunk/exp-drd/drd_thread.c 2008-03-16 17:44:17 UTC (rev 7715)
+++ trunk/exp-drd/drd_thread.c 2008-03-16 17:57:01 UTC (rev 7716)
@@ -225,14 +225,6 @@
/* ignored. */
void thread_set_stack_startup(const DrdThreadId tid, const Addr stack_startup)
{
-#if 0
- VG_(message)(Vg_DebugMsg, "thread_set_stack_startup: thread %d (%d)"
- " stack 0x%x .. 0x%lx (size %d)",
- s_threadinfo[tid].vg_threadid, tid,
- stack_startup,
- s_threadinfo[tid].stack_max,
- s_threadinfo[tid].stack_max - stack_startup);
-#endif
tl_assert(0 <= tid && tid < DRD_N_THREADS && tid != DRD_INVALID_THREADID);
tl_assert(s_threadinfo[tid].stack_min <= stack_startup);
tl_assert(stack_startup <= s_threadinfo[tid].stack_max);
@@ -358,8 +350,9 @@
&& s_drd_running_tid != DRD_INVALID_THREADID)
{
VG_(message)(Vg_DebugMsg,
- "Context switch from thread %d to thread %d",
- s_drd_running_tid, drd_tid);
+ "Context switch from thread %d/%d to thread %d/%d",
+ s_vg_running_tid, s_drd_running_tid,
+ DrdThreadIdToVgThreadId(drd_tid), drd_tid);
}
s_vg_running_tid = vg_tid;
s_drd_running_tid = drd_tid;
@@ -668,7 +661,7 @@
{
const ThreadId vg_tid = DrdThreadIdToVgThreadId(tid);
- VG_(message)(Vg_UserMsg, "%s (thread %d)", msg, /*vg_tid,*/ tid);
+ VG_(message)(Vg_UserMsg, "%s (thread %d/%d)", msg, vg_tid, tid);
if (vg_tid != VG_INVALID_THREADID)
{
@@ -775,8 +768,8 @@
char msg[256];
VG_(snprintf)(msg, sizeof(msg),
- "computing danger set for thread %d with vc ",
- tid);
+ "computing danger set for thread %d/%d with vc ",
+ DrdThreadIdToVgThreadId(tid), tid);
vc_snprint(msg + VG_(strlen)(msg),
sizeof(msg) - VG_(strlen)(msg),
&s_threadinfo[tid].last->vc);
Modified: trunk/exp-drd/tests/fp_race.stderr.exp
===================================================================
--- trunk/exp-drd/tests/fp_race.stderr.exp 2008-03-16 17:44:17 UTC (rev 7715)
+++ trunk/exp-drd/tests/fp_race.stderr.exp 2008-03-16 17:57:01 UTC (rev 7716)
@@ -1,20 +1,20 @@
-Conflicting load by thread 1 at 0x........ size 8
+Conflicting load by thread 1/1 at 0x........ size 8
at 0x........: main (fp_race.c:?)
Location 0x........ is 0 bytes inside local var "s_d3"
declared at fp_race.c:47, in frame #? of thread 1
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
-Conflicting store by thread 1 at 0x........ size 8
+Conflicting store by thread 1/1 at 0x........ size 8
at 0x........: main (fp_race.c:?)
Location 0x........ is 0 bytes inside local var "s_d3"
declared at fp_race.c:47, in frame #? of thread 1
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
Modified: trunk/exp-drd/tests/hg03_inherit.stderr.exp
===================================================================
--- trunk/exp-drd/tests/hg03_inherit.stderr.exp 2008-03-16 17:44:17 UTC (rev 7715)
+++ trunk/exp-drd/tests/hg03_inherit.stderr.exp 2008-03-16 17:57:01 UTC (rev 7716)
@@ -1,31 +1,31 @@
Thread 3:
-Conflicting store by thread 3 at 0x........ size 4
+Conflicting store by thread 3/3 at 0x........ size 4
at 0x........: t2 (hg03_inherit.c:28)
by 0x........: vg_thread_wrapper (drd_pthread_intercepts.c:?)
by 0x........: (within libpthread-?.?.so)
by 0x........: clone (in /...libc...)
Location 0x........ is 0 bytes inside shared[1],
declared at hg03_inherit.c:11, in frame #? of thread 3
-Other segment start (thread 1)
+Other segment start (thread 1/1)
at 0x........: pthread_join (drd_pthread_intercepts.c:?)
by 0x........: main (hg03_inherit.c:49)
-Other segment end (thread 1)
+Other segment end (thread 1/1)
at 0x........: (within libpthread-?.?.so)
by 0x........: pthread_join (drd_pthread_intercepts.c:?)
by 0x........: main (hg03_inherit.c:63)
-Conflicting store by thread 3 at 0x........ size 4
+Conflicting store by thread 3/3 at 0x........ size 4
at 0x........: t2 (hg03_inherit.c:29)
by 0x........: vg_thread_wrapper (drd_pthread_intercepts.c:?)
by 0x........: (within libpthread-?.?.so)
by 0x........: clone (in /...libc...)
Location 0x........ is 0 bytes inside shared[1],
declared at hg03_inherit.c:11, in frame #? of thread 3
-Other segment start (thread 1)
+Other segment start (thread 1/1)
at 0x........: pthread_join (drd_pthread_intercepts.c:?)
by 0x........: main (hg03_inherit.c:49)
-Other segment end (thread 1)
+Other segment end (thread 1/1)
at 0x........: (within libpthread-?.?.so)
by 0x........: pthread_join (drd_pthread_intercepts.c:?)
by 0x........: main (hg03_inherit.c:63)
Modified: trunk/exp-drd/tests/hg04_race.stderr.exp
===================================================================
--- trunk/exp-drd/tests/hg04_race.stderr.exp 2008-03-16 17:44:17 UTC (rev 7715)
+++ trunk/exp-drd/tests/hg04_race.stderr.exp 2008-03-16 17:57:01 UTC (rev 7716)
@@ -1,27 +1,27 @@
Thread 2:
-Conflicting load by thread 2 at 0x........ size 4
+Conflicting load by thread 2/3 at 0x........ size 4
at 0x........: th (hg04_race.c:10)
by 0x........: vg_thread_wrapper (drd_pthread_intercepts.c:?)
by 0x........: (within libpthread-?.?.so)
by 0x........: clone (in /...libc...)
Location 0x........ is 0 bytes inside local var "shared"
declared at hg04_race.c:6, in frame #? of thread 2
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
-Conflicting store by thread 2 at 0x........ size 4
+Conflicting store by thread 2/3 at 0x........ size 4
at 0x........: th (hg04_race.c:10)
by 0x........: vg_thread_wrapper (drd_pthread_intercepts.c:?)
by 0x........: (within libpthread-?.?.so)
by 0x........: clone (in /...libc...)
Location 0x........ is 0 bytes inside local var "shared"
declared at hg04_race.c:6, in frame #? of thread 2
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
Modified: trunk/exp-drd/tests/hg05_race2.stderr.exp
===================================================================
--- trunk/exp-drd/tests/hg05_race2.stderr.exp 2008-03-16 17:44:17 UTC (rev 7715)
+++ trunk/exp-drd/tests/hg05_race2.stderr.exp 2008-03-16 17:57:01 UTC (rev 7716)
@@ -1,27 +1,27 @@
Thread 2:
-Conflicting load by thread 2 at 0x........ size 4
+Conflicting load by thread 2/3 at 0x........ size 4
at 0x........: th (hg05_race2.c:17)
by 0x........: vg_thread_wrapper (drd_pthread_intercepts.c:?)
by 0x........: (within libpthread-?.?.so)
by 0x........: clone (in /...libc...)
Location 0x........ is 0 bytes inside foo.poot[5].plop[11],
declared at hg05_race2.c:24, in frame #? of thread 1
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
-Conflicting store by thread 2 at 0x........ size 4
+Conflicting store by thread 2/3 at 0x........ size 4
at 0x........: th (hg05_race2.c:17)
by 0x........: vg_thread_wrapper (drd_pthread_intercepts.c:?)
by 0x........: (within libpthread-?.?.so)
by 0x........: clone (in /...libc...)
Location 0x........ is 0 bytes inside foo.poot[5].plop[11],
declared at hg05_race2.c:24, in frame #? of thread 1
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
Modified: trunk/exp-drd/tests/rwlock_race.stderr.exp
===================================================================
--- trunk/exp-drd/tests/rwlock_race.stderr.exp 2008-03-16 17:44:17 UTC (rev 7715)
+++ trunk/exp-drd/tests/rwlock_race.stderr.exp 2008-03-16 17:57:01 UTC (rev 7716)
@@ -1,27 +1,27 @@
Thread 2:
-Conflicting load by thread 2 at 0x........ size 4
+Conflicting load by thread 2/3 at 0x........ size 4
at 0x........: thread (rwlock_race.c:?)
by 0x........: vg_thread_wrapper (drd_pthread_intercepts.c:?)
by 0x........: (within libpthread-?.?.so)
by 0x........: clone (in /...libc...)
Location 0x........ is 0 bytes inside local var "s_racy"
declared at rwlock_race.c:17, in frame #? of thread 2
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
-Conflicting store by thread 2 at 0x........ size 4
+Conflicting store by thread 2/3 at 0x........ size 4
at 0x........: thread (rwlock_race.c:?)
by 0x........: vg_thread_wrapper (drd_pthread_intercepts.c:?)
by 0x........: (within libpthread-?.?.so)
by 0x........: clone (in /...libc...)
Location 0x........ is 0 bytes inside local var "s_racy"
declared at rwlock_race.c:17, in frame #? of thread 2
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
Result: 2
Modified: trunk/exp-drd/tests/sem_as_mutex.stderr.exp
===================================================================
--- trunk/exp-drd/tests/sem_as_mutex.stderr.exp 2008-03-16 17:44:17 UTC (rev 7715)
+++ trunk/exp-drd/tests/sem_as_mutex.stderr.exp 2008-03-16 17:57:01 UTC (rev 7716)
@@ -1,20 +1,20 @@
-Conflicting load by thread 1 at 0x........ size 8
+Conflicting load by thread 1/1 at 0x........ size 8
at 0x........: main (sem_as_mutex.c:?)
Location 0x........ is 0 bytes inside local var "s_d3"
declared at sem_as_mutex.c:48, in frame #? of thread 1
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
-Conflicting store by thread 1 at 0x........ size 8
+Conflicting store by thread 1/1 at 0x........ size 8
at 0x........: main (sem_as_mutex.c:?)
Location 0x........ is 0 bytes inside local var "s_d3"
declared at sem_as_mutex.c:48, in frame #? of thread 1
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
Modified: trunk/exp-drd/tests/tc01_simple_race.stderr.exp
===================================================================
--- trunk/exp-drd/tests/tc01_simple_race.stderr.exp 2008-03-16 17:44:17 UTC (rev 7715)
+++ trunk/exp-drd/tests/tc01_simple_race.stderr.exp 2008-03-16 17:57:01 UTC (rev 7716)
@@ -1,20 +1,20 @@
-Conflicting load by thread 1 at 0x........ size 4
+Conflicting load by thread 1/1 at 0x........ size 4
at 0x........: main (tc01_simple_race.c:28)
Location 0x........ is 0 bytes inside global var "x"
declared at tc01_simple_race.c:9
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
-Conflicting store by thread 1 at 0x........ size 4
+Conflicting store by thread 1/1 at 0x........ size 4
at 0x........: main (tc01_simple_race.c:28)
Location 0x........ is 0 bytes inside global var "x"
declared at tc01_simple_race.c:9
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
Modified: trunk/exp-drd/tests/tc16_byterace.stderr.exp
===================================================================
--- trunk/exp-drd/tests/tc16_byterace.stderr.exp 2008-03-16 17:44:17 UTC (rev 7715)
+++ trunk/exp-drd/tests/tc16_byterace.stderr.exp 2008-03-16 17:57:01 UTC (rev 7716)
@@ -1,20 +1,20 @@
-Conflicting load by thread 1 at 0x........ size 1
+Conflicting load by thread 1/1 at 0x........ size 1
at 0x........: main (tc16_byterace.c:34)
Location 0x........ is 0 bytes inside bytes[4],
a global variable declared at tc16_byterace.c:7
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
-Conflicting store by thread 1 at 0x........ size 1
+Conflicting store by thread 1/1 at 0x........ size 1
at 0x........: main (tc16_byterace.c:34)
Location 0x........ is 0 bytes inside bytes[4],
a global variable declared at tc16_byterace.c:7
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
Modified: trunk/exp-drd/tests/tc20_verifywrap.stderr.exp
===================================================================
--- trunk/exp-drd/tests/tc20_verifywrap.stderr.exp 2008-03-16 17:44:17 UTC (rev 7715)
+++ trunk/exp-drd/tests/tc20_verifywrap.stderr.exp 2008-03-16 17:57:01 UTC (rev 7716)
@@ -5,13 +5,13 @@
---------------- pthread_create/join ----------------
-Conflicting store by thread 1 at 0x........ size 2
+Conflicting store by thread 1/1 at 0x........ size 2
at 0x........: main (tc20_verifywrap.c:78)
Location 0x........ is 0 bytes inside global var "unprotected"
declared at tc20_verifywrap.c:27
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
---------------- pthread_mutex_lock et al ----------------
Modified: trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp
===================================================================
--- trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp 2008-03-16 17:44:17 UTC (rev 7715)
+++ trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp 2008-03-16 17:57:01 UTC (rev 7716)
@@ -5,13 +5,13 @@
---------------- pthread_create/join ----------------
-Conflicting store by thread 1 at 0x........ size 2
+Conflicting store by thread 1/1 at 0x........ size 2
at 0x........: main (tc20_verifywrap.c:78)
Location 0x........ is 0 bytes inside global var "unprotected"
declared at tc20_verifywrap.c:27
-Other segment start (thread 2)
+Other segment start (thread 0/2)
(thread finished, call stack no longer available)
-Other segment end (thread 2)
+Other segment end (thread 0/2)
(thread finished, call stack no longer available)
---------------- pthread_mutex_lock et al ----------------
|
|
From: <sv...@va...> - 2008-03-16 17:45:09
|
Author: bart Date: 2008-03-16 17:44:17 +0000 (Sun, 16 Mar 2008) New Revision: 7715 Log: Only the error count for the recursive_mutex regression test is taken in account. Modified: trunk/exp-drd/tests/recursive_mutex.stderr.exp trunk/exp-drd/tests/recursive_mutex.vgtest Modified: trunk/exp-drd/tests/recursive_mutex.stderr.exp =================================================================== --- trunk/exp-drd/tests/recursive_mutex.stderr.exp 2008-03-16 17:39:14 UTC (rev 7714) +++ trunk/exp-drd/tests/recursive_mutex.stderr.exp 2008-03-16 17:44:17 UTC (rev 7715) @@ -1,23 +1 @@ - -Recursive locking not allowed: mutex 0x........, recursion count 1, owner 1. - at 0x........: pthread_mutex_lock (drd_pthread_intercepts.c:?) - by 0x........: lock_twice (recursive_mutex.c:?) - by 0x........: main (recursive_mutex.c:?) - -Mutex not locked by calling thread: mutex 0x........, recursion count 0, owner 1. - at 0x........: pthread_mutex_unlock (drd_pthread_intercepts.c:?) - by 0x........: lock_twice (recursive_mutex.c:?) - by 0x........: main (recursive_mutex.c:?) - -Recursive locking not allowed: mutex 0x........, recursion count 1, owner 1. - at 0x........: pthread_mutex_lock (drd_pthread_intercepts.c:?) - by 0x........: lock_twice (recursive_mutex.c:?) - by 0x........: main (recursive_mutex.c:?) - -Destroying locked mutex: mutex 0x........, recursion count 1, owner 1. - at 0x........: (within libpthread-?.?.so) - by 0x........: pthread_mutex_lock (drd_pthread_intercepts.c:?) - by 0x........: lock_twice (recursive_mutex.c:?) - by 0x........: main (recursive_mutex.c:?) - -ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 0 from 0) +ERROR SUMMARY: 4 errors from 4 contexts Modified: trunk/exp-drd/tests/recursive_mutex.vgtest =================================================================== --- trunk/exp-drd/tests/recursive_mutex.vgtest 2008-03-16 17:39:14 UTC (rev 7714) +++ trunk/exp-drd/tests/recursive_mutex.vgtest 2008-03-16 17:44:17 UTC (rev 7715) @@ -1 +1,2 @@ prog: recursive_mutex +stderr_filter: filter_error_summary |
|
From: <sv...@va...> - 2008-03-16 17:39:09
|
Author: bart
Date: 2008-03-16 17:39:14 +0000 (Sun, 16 Mar 2008)
New Revision: 7714
Log:
Updated expected output.
Modified:
trunk/exp-drd/tests/recursive_mutex.stderr.exp
Modified: trunk/exp-drd/tests/recursive_mutex.stderr.exp
===================================================================
--- trunk/exp-drd/tests/recursive_mutex.stderr.exp 2008-03-16 17:29:20 UTC (rev 7713)
+++ trunk/exp-drd/tests/recursive_mutex.stderr.exp 2008-03-16 17:39:14 UTC (rev 7714)
@@ -14,4 +14,10 @@
by 0x........: lock_twice (recursive_mutex.c:?)
by 0x........: main (recursive_mutex.c:?)
-ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
+Destroying locked mutex: mutex 0x........, recursion count 1, owner 1.
+ at 0x........: (within libpthread-?.?.so)
+ by 0x........: pthread_mutex_lock (drd_pthread_intercepts.c:?)
+ by 0x........: lock_twice (recursive_mutex.c:?)
+ by 0x........: main (recursive_mutex.c:?)
+
+ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 0 from 0)
|
|
From: <sv...@va...> - 2008-03-16 17:29:16
|
Author: bart
Date: 2008-03-16 17:29:20 +0000 (Sun, 16 Mar 2008)
New Revision: 7713
Log:
Fixed stack red zone handling.
Modified:
trunk/exp-drd/drd_main.c
trunk/exp-drd/drd_suppression.c
trunk/exp-drd/drd_thread.c
trunk/exp-drd/drd_thread.h
Modified: trunk/exp-drd/drd_main.c
===================================================================
--- trunk/exp-drd/drd_main.c 2008-03-16 17:27:25 UTC (rev 7712)
+++ trunk/exp-drd/drd_main.c 2008-03-16 17:29:20 UTC (rev 7713)
@@ -162,7 +162,7 @@
: access_type == eStart
? "start"
: access_type == eEnd
- ? "end"
+ ? "end "
: "????",
addr,
size,
@@ -464,7 +464,7 @@
if (a1 <= drd_trace_address && drd_trace_address < a2)
{
- drd_trace_mem_access(a1, len, eStart);
+ drd_trace_mem_access(a1, len, eEnd);
}
thread_stop_using_mem(a1, a2);
clientobj_stop_using_mem(a1, a2);
@@ -485,8 +485,8 @@
/* Assumption: stacks grow downward. */
static void drd_start_using_mem_stack(const Addr a, const SizeT len)
{
- thread_set_stack_min(thread_get_running_tid(), a);
- drd_start_using_mem(a, len);
+ thread_set_stack_min(thread_get_running_tid(), a - VG_STACK_REDZONE_SZB);
+ drd_start_using_mem(a - VG_STACK_REDZONE_SZB, len + VG_STACK_REDZONE_SZB);
}
/* Called by the core when the stack of a thread shrinks, to indicate that */
@@ -494,8 +494,9 @@
/* Assumption: stacks grow downward. */
static void drd_stop_using_mem_stack(const Addr a, const SizeT len)
{
- thread_set_stack_min(thread_get_running_tid(), a + len);
- drd_stop_using_mem(a, len);
+ thread_set_stack_min(thread_get_running_tid(),
+ a + len - VG_STACK_REDZONE_SZB);
+ drd_stop_using_mem(a - VG_STACK_REDZONE_SZB, len + VG_STACK_REDZONE_SZB);
}
static void drd_start_using_mem_stack_signal(const Addr a, const SizeT len)
@@ -584,24 +585,28 @@
}
/* Called after a thread has performed its last memory access. */
-static void drd_thread_finished(ThreadId tid)
+static void drd_thread_finished(ThreadId vg_tid)
{
DrdThreadId drd_tid;
- tl_assert(VG_(get_running_tid)() == tid);
+ tl_assert(VG_(get_running_tid)() == vg_tid);
- drd_tid = VgThreadIdToDrdThreadId(tid);
+ drd_tid = VgThreadIdToDrdThreadId(vg_tid);
if (drd_trace_fork_join)
{
VG_(message)(Vg_DebugMsg,
"drd_thread_finished tid = %d/%d%s",
- tid,
+ vg_tid,
drd_tid,
thread_get_joinable(drd_tid)
? ""
: " (which is a detached thread)");
}
+ drd_stop_using_mem(thread_get_stack_min(drd_tid),
+ thread_get_stack_max(drd_tid)
+ - thread_get_stack_min(drd_tid));
+ thread_stop_recording(drd_tid);
thread_finished(drd_tid);
}
Modified: trunk/exp-drd/drd_suppression.c
===================================================================
--- trunk/exp-drd/drd_suppression.c 2008-03-16 17:27:25 UTC (rev 7712)
+++ trunk/exp-drd/drd_suppression.c 2008-03-16 17:29:20 UTC (rev 7713)
@@ -61,7 +61,7 @@
}
tl_assert(a1 < a2);
- tl_assert(! drd_is_any_suppressed(a1, a2));
+ // tl_assert(! drd_is_any_suppressed(a1, a2));
bm_access_range_store(s_suppressed, a1, a2);
}
Modified: trunk/exp-drd/drd_thread.c
===================================================================
--- trunk/exp-drd/drd_thread.c 2008-03-16 17:27:25 UTC (rev 7712)
+++ trunk/exp-drd/drd_thread.c 2008-03-16 17:29:20 UTC (rev 7713)
@@ -246,21 +246,11 @@
return s_threadinfo[tid].stack_min;
}
-DrdThreadId thread_lookup_stackaddr(const Addr a,
- Addr* const stack_min,
- Addr* const stack_max)
+Addr thread_get_stack_max(const DrdThreadId tid)
{
- unsigned i;
- for (i = 0; i < sizeof(s_threadinfo) / sizeof(s_threadinfo[0]); i++)
- {
- if (s_threadinfo[i].stack_min <= a && a <= s_threadinfo[i].stack_max)
- {
- *stack_min = s_threadinfo[i].stack_min;
- *stack_max = s_threadinfo[i].stack_max;
- return i;
- }
- }
- return DRD_INVALID_THREADID;
+ tl_assert(0 <= tid && tid < DRD_N_THREADS
+ && tid != DRD_INVALID_THREADID);
+ return s_threadinfo[tid].stack_max;
}
/**
@@ -295,9 +285,6 @@
tl_assert(0 <= tid && tid < DRD_N_THREADS
&& tid != DRD_INVALID_THREADID);
- thread_stop_using_mem(s_threadinfo[tid].stack_min,
- s_threadinfo[tid].stack_max);
-
s_threadinfo[tid].vg_thread_exists = False;
if (s_threadinfo[tid].detached_posix_thread)
@@ -606,11 +593,11 @@
*/
void thread_stop_using_mem(const Addr a1, const Addr a2)
{
- DrdThreadId other_user = DRD_INVALID_THREADID;
+ DrdThreadId other_user;
+ unsigned i;
/* For all threads, mark the range [ a1, a2 [ as no longer in use. */
-
- unsigned i;
+ other_user = DRD_INVALID_THREADID;
for (i = 0; i < sizeof(s_threadinfo) / sizeof(s_threadinfo[0]); i++)
{
Segment* p;
@@ -681,7 +668,7 @@
{
const ThreadId vg_tid = DrdThreadIdToVgThreadId(tid);
- VG_(message)(Vg_UserMsg, "%s (thread %d)", msg, tid);
+ VG_(message)(Vg_UserMsg, "%s (thread %d)", msg, /*vg_tid,*/ tid);
if (vg_tid != VG_INVALID_THREADID)
{
Modified: trunk/exp-drd/drd_thread.h
===================================================================
--- trunk/exp-drd/drd_thread.h 2008-03-16 17:27:25 UTC (rev 7712)
+++ trunk/exp-drd/drd_thread.h 2008-03-16 17:29:20 UTC (rev 7713)
@@ -102,9 +102,7 @@
void thread_finished(const DrdThreadId tid);
void thread_set_stack_startup(const DrdThreadId tid, const Addr stack_startup);
Addr thread_get_stack_min(const DrdThreadId tid);
-DrdThreadId thread_lookup_stackaddr(const Addr a,
- Addr* const stack_min,
- Addr* const stack_max);
+Addr thread_get_stack_max(const DrdThreadId tid);
void thread_set_pthreadid(const DrdThreadId tid, const PThreadId ptid);
Bool thread_get_joinable(const DrdThreadId tid);
void thread_set_joinable(const DrdThreadId tid, const Bool joinable);
|
|
From: <sv...@va...> - 2008-03-16 17:27:21
|
Author: bart
Date: 2008-03-16 17:27:25 +0000 (Sun, 16 Mar 2008)
New Revision: 7712
Log:
Removed obsolete code.
Modified:
trunk/exp-drd/drd_error.c
Modified: trunk/exp-drd/drd_error.c
===================================================================
--- trunk/exp-drd/drd_error.c 2008-03-16 16:42:45 UTC (rev 7711)
+++ trunk/exp-drd/drd_error.c 2008-03-16 17:27:25 UTC (rev 7712)
@@ -44,178 +44,24 @@
} DRD_SuppKind;
-static void make_path_relative(Char* const path)
-{
- int offset = 0;
- Char cwd[512];
-
- if (! VG_(get_startup_wd)(cwd, sizeof(cwd)))
- tl_assert(False);
- if (VG_(strncmp)(path + offset, cwd, VG_(strlen)(cwd)) == 0)
- {
- offset += VG_(strlen)(cwd);
- if (path[offset] == '/')
- {
- offset++;
- }
- }
- VG_(memmove)(path, path + offset, VG_(strlen)(path + offset) + 1);
-}
-
-
-/* Describe a data address range [a,a+len[ as good as you can, for error */
+/* Describe a data address range [a,a+len[ as good as possible, for error */
/* messages, putting the result in ai. */
-void describe_addr(Addr const a, SizeT const len, AddrInfo* const ai)
+static
+void describe_malloced_addr(Addr const a, SizeT const len, AddrInfo* const ai)
{
- Addr stack_min, stack_max;
- DebugInfo* sg;
+ Addr data;
- /* Perhaps it's on a thread's stack? */
- ai->stack_tid = thread_lookup_stackaddr(a, &stack_min, &stack_max);
- if (ai->stack_tid != DRD_INVALID_THREADID)
+ if (drd_heap_addrinfo(a, &data, &ai->size, &ai->lastchange))
{
- ai->akind = eStack;
- ai->size = len;
- ai->rwoffset = a - stack_max;
- tl_assert(a + ai->size <= stack_max);
- tl_assert(ai->rwoffset < 0);
- return;
+ ai->akind = eMallocd;
+ ai->rwoffset = a - data;
}
-
- /* Perhaps it's in a mapped segment ? */
- sg = VG_(find_seginfo)(a);
- if (sg)
+ else
{
- int i, n;
-
- ai->akind = eSegment;
- ai->debuginfo = sg;
- ai->name[0] = 0;
- ai->size = 1;
- ai->rwoffset = 0;
-
- n = VG_(seginfo_syms_howmany)(sg);
- for (i = 0; i < n; i++)
- {
- Addr addr;
- Addr tocptr;
- UInt size;
- HChar* name;
- Char filename[256];
- Int linenum;
- Bool isText;
-
- VG_(seginfo_syms_getidx)(sg, i, &addr, &tocptr, &size, &name, &isText);
- if (isText && addr <= a && a < addr + size)
- {
- ai->size = size;
- ai->rwoffset = a - addr;
- tl_assert(name && name[0]);
- VG_(snprintf)(ai->name, sizeof(ai->name), "%s", name);
- if (VG_(get_filename_linenum)(addr,
- filename, sizeof(filename),
- 0, 0, 0,
- &linenum))
- {
- make_path_relative(filename);
- VG_(snprintf)(ai->descr, sizeof(ai->descr),
- " in %s:%d", filename, linenum);
- }
- else
- {
- i = n;
- }
- break;
- }
- }
- if (i == n)
- {
- Char filename[512];
- Char soname[512];
- VgSectKind kind = VG_(seginfo_sect_kind)(NULL, 0, a);
- const HChar* sect_kind_name = VG_(pp_SectKind)(kind);
- VG_(strncpy)(filename, VG_(seginfo_filename)(sg), sizeof(filename));
- filename[sizeof(filename) - 1] = 0;
- make_path_relative(filename);
- VG_(strncpy)(soname, VG_(seginfo_soname)(sg), sizeof(soname));
- soname[sizeof(soname) - 1] = 0;
- make_path_relative(soname);
- VG_(snprintf)(ai->descr, sizeof(ai->descr),
- "%s, %s:%s",
- filename,
- soname,
- sect_kind_name);
- }
- return;
+ ai->akind = eUnknown;
}
-
- /* Search for a currently malloc'd block which might bracket it. */
- {
- Addr data;
- if (drd_heap_addrinfo(a, &data, &ai->size, &ai->lastchange))
- {
- ai->akind = eMallocd;
- ai->rwoffset = a - data;
- return;
- }
- }
-
- /* Clueless ... */
- ai->akind = eUnknown;
- return;
}
-/**
- * Generate a description string for the data residing at address a.
- */
-Char* describe_addr_text(Addr const a, SizeT const len, AddrInfo* const ai,
- Char* const buf, UInt const n_buf)
-{
- tl_assert(a);
- tl_assert(ai);
- tl_assert(buf);
-
- describe_addr(a, len, ai);
-
- switch (ai->akind)
- {
- case eStack: {
- VG_(snprintf)(buf, n_buf,
- "stack of thread %d, offset %d",
- ai->stack_tid, ai->rwoffset);
- break;
- }
- case eSegment: {
- if (ai->name[0])
- {
- VG_(snprintf)(buf, n_buf,
- "%s (offset %ld, size %ld) in %s",
- ai->name, ai->rwoffset, ai->size, ai->descr);
- }
- else
- {
- VG_(snprintf)(buf, n_buf,
- "%s",
- ai->descr);
- }
- break;
- }
- case eMallocd: {
- VG_(snprintf)(buf, n_buf, "heap");
- VG_(snprintf)(buf + VG_(strlen)(buf), n_buf - VG_(strlen)(buf),
- ", offset %ld in block at 0x%lx of size %ld",
- ai->rwoffset, a - ai->rwoffset, ai->size);
- break;
- }
- case eUnknown:
- VG_(snprintf)(buf, n_buf, "unknown");
- break;
- default:
- tl_assert(0);
- }
- return buf;
-}
-
static
void drd_report_data_race2(Error* const err, const DataRaceErrInfo* const dri)
{
@@ -232,12 +78,13 @@
VG_(get_data_description)(descr1, descr2, sizeof(descr1), dri->addr);
if (descr1[0] == 0)
{
- describe_addr(dri->addr, dri->size, &ai);
+ describe_malloced_addr(dri->addr, dri->size, &ai);
}
VG_(message)(Vg_UserMsg,
"Conflicting %s by thread %d at 0x%08lx size %ld",
dri->access_type == eStore ? "store" : "load",
DrdThreadIdToVgThreadId(dri->tid),
+ /*dri->tid,*/
dri->addr,
dri->size);
VG_(pp_ExeContext)(VG_(get_error_where)(err));
@@ -417,7 +264,7 @@
{
switch (VG_(get_error_kind)(e))
{
- case DataRaceErr: return "DataRaceErr";
+ case DataRaceErr: return "ConflictingAccess";
case MutexErr: return "MutexErr";
case CondErr: return "CondErr";
case CondRaceErr: return "CondRaceErr";
|
|
From: <sv...@va...> - 2008-03-16 16:42:39
|
Author: sewardj
Date: 2008-03-16 16:42:45 +0000 (Sun, 16 Mar 2008)
New Revision: 7711
Log:
Reinstate last lock lossage mechanism.
Modified:
branches/HGDEV/helgrind/hg_main.c
branches/HGDEV/helgrind/hg_wordset.c
branches/HGDEV/helgrind/hg_wordset.h
Modified: branches/HGDEV/helgrind/hg_main.c
===================================================================
--- branches/HGDEV/helgrind/hg_main.c 2008-03-16 16:42:20 UTC (rev 7710)
+++ branches/HGDEV/helgrind/hg_main.c 2008-03-16 16:42:45 UTC (rev 7711)
@@ -3161,9 +3161,9 @@
//static WordSetID add_BHL ( WordSetID lockset ) {
// return HG_(addToWS)( univ_lsets, lockset, (Word)__bus_lock_Lock );
//}
-//static WordSetID del_BHL ( WordSetID lockset ) {
-// return HG_(delFromWS)( univ_lsets, lockset, (Word)__bus_lock_Lock );
-//}
+static inline WordSetID del_BHL ( WordSetID lockset ) {
+ return HG_(delFromWS)( univ_lsets, lockset, (Word)__bus_lock_Lock );
+}
/* Last-lock-lossage records. This mechanism exists to help explain
@@ -3202,8 +3202,7 @@
static WordFM* ga_to_lastlock = NULL; /* GuestAddr -> ExeContext* */
-#if 0 // commented out to avoid a compiler warning about unused function
-static
+static __attribute((noinline))
void record_last_lock_lossage ( Addr ga_of_access,
WordSetID lset_old, WordSetID lset_new )
{
@@ -3219,18 +3218,17 @@
HG_(cardinalityWS)(univ_lsets,lset_new),
ga_of_access );
+ /* If the new lockset is neither empty nor contains merely the bus
+ lock (that is, it contains at least one "real" lock), we're not
+ interested. */
+ if (!HG_(isSingletonOrEmptyWS)(univ_lsets, lset_new, (Word)__bus_lock_Lock))
+ return;
+
/* This is slow, but at least it's simple. The bus hardware lock
just confuses the logic, so remove it from the locksets we're
considering before doing anything else. */
lset_new = del_BHL( lset_new );
-
- if (!HG_(isEmptyWS)( univ_lsets, lset_new )) {
- /* The post-transition lock set is not empty. So we are not
- interested. We're only interested in spotting transitions
- that make locksets become empty. */
- return;
- }
-
+
/* lset_new is now empty */
card_new = HG_(cardinalityWS)( univ_lsets, lset_new );
tl_assert(card_new == 0);
@@ -3265,8 +3263,8 @@
stats__ga_LL_adds++;
}
}
-#endif // #if 0
+
/* This queries the table (ga_to_lastlock) made by
record_last_lock_lossage, when constructing error messages. It
attempts to find the ExeContext of the allocation or initialisation
@@ -3592,6 +3590,8 @@
} else {
oldLS = get_SHVAL_LS(sv_old);
newLS = HG_(intersectWS)(univ_lsets, oldLS, currLS);
+ if (oldLS != newLS)
+ record_last_lock_lossage( a, oldLS, newLS );
}
// generate new SVal
@@ -3725,6 +3725,8 @@
} else {
oldLS = get_SHVAL_LS(sv_old);
newLS = HG_(intersectWS)(univ_lsets, oldLS, currLS);
+ if (oldLS != newLS)
+ record_last_lock_lossage( a, oldLS, newLS );
}
// update the state
@@ -9274,6 +9276,16 @@
old_state, old_buf, new_state, new_buf);
}
#endif /* 0 */
+ /* show the last lock lossage info */
+ if (xe->XE.Race.mb_lastlock) {
+ VG_(message)(Vg_UserMsg, " Last consistently used lock for %p was "
+ "first observed", err_ga);
+ VG_(pp_ExeContext)(xe->XE.Race.mb_lastlock);
+ } else {
+ VG_(message)(Vg_UserMsg, " Location 0x%lX has never been protected "
+ "by any lock", err_ga);
+ }
+
/* If we have a better description of the address, show it. */
if (xe->XE.Race.descr1[0] != 0)
VG_(message)(Vg_UserMsg, " %s", &xe->XE.Race.descr1);
@@ -9281,7 +9293,7 @@
VG_(message)(Vg_UserMsg, " %s", &xe->XE.Race.descr2);
if (xe->XE.Race.block_allocdAt) {
VG_(message)(Vg_UserMsg,
- " Location 0x%lx is %,ld bytes inside a block of "
+ " Location 0x%lX is %,ld bytes inside a block of "
"size %,lu alloc'd",
xe->XE.Race.data_addr,
xe->XE.Race.block_rwoffset, xe->XE.Race.block_szB
Modified: branches/HGDEV/helgrind/hg_wordset.c
===================================================================
--- branches/HGDEV/helgrind/hg_wordset.c 2008-03-16 16:42:20 UTC (rev 7710)
+++ branches/HGDEV/helgrind/hg_wordset.c 2008-03-16 16:42:45 UTC (rev 7711)
@@ -166,6 +166,7 @@
UWord n_doubleton;
UWord n_isEmpty;
UWord n_isSingleton;
+ UWord n_isSorE;
UWord n_anyElementOf;
UWord n_elementOf;
UWord n_isSubsetOf;
@@ -252,7 +253,7 @@
/* Index into a WordSetU, doing the obvious range check. Failure of
the assertions marked XXX and YYY is an indication of passing the
wrong WordSetU* in the public API of this module. */
-static WordVec* do_ix2vec ( WordSetU* wsu, WordSet ws )
+static inline WordVec* do_ix2vec ( WordSetU* wsu, WordSet ws )
{
WordVec* wv;
tl_assert(wsu->ix2vec_used <= wsu->ix2vec_size);
@@ -408,6 +409,16 @@
return (Bool)(wv->size == 1 && wv->words[0] == w);
}
+Bool HG_(isSingletonOrEmptyWS) ( WordSetU* wsu, WordSet ws, UWord w )
+{
+ WordVec* wv;
+ tl_assert(wsu);
+ wsu->n_isSorE++;
+ wv = do_ix2vec( wsu, ws );
+ if (wv->size == 0) return True;
+ return (Bool)(wv->size == 1 && wv->words[0] == w);
+}
+
UWord HG_(cardinalityWS) ( WordSetU* wsu, WordSet ws )
{
WordVec* wv;
@@ -534,11 +545,10 @@
void HG_(ppWSUstats) ( WordSetU* wsu, HChar* name )
{
- int i;
- int d_size = 10;
- int size_distribution[10] = {0};
+ Int i;
+ Int d_size = 10;
+ Int size_distribution[10] = {0,0,0,0,0,0,0,0,0,0};
-
VG_(printf)(" WordSet \"%s\":\n", name);
VG_(printf)(" addTo %,10u (%,u uncached)\n",
wsu->n_add, wsu->n_add_uncached);
@@ -553,15 +563,15 @@
VG_(printf)(" doubleton %10u\n", wsu->n_doubleton);
VG_(printf)(" isEmpty %10u\n", wsu->n_isEmpty);
VG_(printf)(" isSingleton %10u\n", wsu->n_isSingleton);
+ VG_(printf)(" isSorEmpty %10u\n", wsu->n_isSorE);
VG_(printf)(" anyElementOf %10u\n", wsu->n_anyElementOf);
VG_(printf)(" elementOf %10u\n", wsu->n_elementOf);
VG_(printf)(" isSubsetOf %10u\n", wsu->n_isSubsetOf);
-
// compute and print size distributions
for (i = 0; i < (int)HG_(cardinalityWSU)(wsu); i++) {
WordVec *wv = do_ix2vec( wsu, i );
- int size = wv->size;
+ Int size = wv->size;
if (size >= d_size) size = d_size-1;
size_distribution[size]++;
}
Modified: branches/HGDEV/helgrind/hg_wordset.h
===================================================================
--- branches/HGDEV/helgrind/hg_wordset.h 2008-03-16 16:42:20 UTC (rev 7710)
+++ branches/HGDEV/helgrind/hg_wordset.h 2008-03-16 16:42:45 UTC (rev 7711)
@@ -73,6 +73,7 @@
WordSet HG_(minusWS) ( WordSetU*, WordSet, WordSet );
Bool HG_(isEmptyWS) ( WordSetU*, WordSet );
Bool HG_(isSingletonWS) ( WordSetU*, WordSet, UWord );
+Bool HG_(isSingletonOrEmptyWS) ( WordSetU*, WordSet, UWord );
UWord HG_(anyElementOfWS) ( WordSetU*, WordSet );
UWord HG_(cardinalityWS) ( WordSetU*, WordSet );
Bool HG_(elemWS) ( WordSetU*, WordSet, UWord );
|
|
From: <sv...@va...> - 2008-03-16 16:42:17
|
Author: sewardj
Date: 2008-03-16 16:42:20 +0000 (Sun, 16 Mar 2008)
New Revision: 7710
Log:
Consistently use uppercase hex output.
Modified:
branches/HGDEV/coregrind/m_debuginfo/debuginfo.c
Modified: branches/HGDEV/coregrind/m_debuginfo/debuginfo.c
===================================================================
--- branches/HGDEV/coregrind/m_debuginfo/debuginfo.c 2008-03-16 12:27:11 UTC (rev 7709)
+++ branches/HGDEV/coregrind/m_debuginfo/debuginfo.c 2008-03-16 16:42:20 UTC (rev 7710)
@@ -1702,7 +1702,7 @@
*/
VG_(snprintf)(
dname1, n_dname,
- "Location 0x%lx is %lu byte%s inside local var \"%s\",",
+ "Location 0x%lX is %lu byte%s inside local var \"%s\",",
data_addr, var_offset, vo_plural, var->name );
VG_(snprintf)(
dname2, n_dname,
@@ -1716,7 +1716,7 @@
*/
VG_(snprintf)(
dname1, n_dname,
- "Location 0x%lx is %lu byte%s inside local var \"%s\"",
+ "Location 0x%lX is %lu byte%s inside local var \"%s\"",
data_addr, var_offset, vo_plural, var->name );
VG_(snprintf)(
dname2, n_dname,
@@ -1731,7 +1731,7 @@
*/
VG_(snprintf)(
dname1, n_dname,
- "Location 0x%lx is %lu byte%s inside %s%s",
+ "Location 0x%lX is %lu byte%s inside %s%s",
data_addr, residual_offset, ro_plural, var->name,
VG_(indexXA)(described,0) );
VG_(snprintf)(
@@ -1744,7 +1744,7 @@
declared at dsyms7.c:17, in frame #1 of thread 1 */
VG_(snprintf)(
dname1, n_dname,
- "Location 0x%lx is %lu byte%s inside %s%s,",
+ "Location 0x%lX is %lu byte%s inside %s%s,",
data_addr, residual_offset, ro_plural, var->name,
VG_(indexXA)(described,0) );
VG_(snprintf)(
@@ -1760,7 +1760,7 @@
*/
VG_(snprintf)(
dname1, n_dname,
- "Location 0x%lx is %lu byte%s inside global var \"%s\"",
+ "Location 0x%lX is %lu byte%s inside global var \"%s\"",
data_addr, var_offset, vo_plural, var->name );
}
else
@@ -1771,7 +1771,7 @@
*/
VG_(snprintf)(
dname1, n_dname,
- "Location 0x%lx is %lu byte%s inside global var \"%s\"",
+ "Location 0x%lX is %lu byte%s inside global var \"%s\"",
data_addr, var_offset, vo_plural, var->name );
VG_(snprintf)(
dname2, n_dname,
@@ -1786,7 +1786,7 @@
*/
VG_(snprintf)(
dname1, n_dname,
- "Location 0x%lx is %lu byte%s inside %s%s,",
+ "Location 0x%lX is %lu byte%s inside %s%s,",
data_addr, residual_offset, ro_plural, var->name,
VG_(indexXA)(described,0) );
VG_(snprintf)(
@@ -1799,7 +1799,7 @@
a global variable declared at dsyms7.c:17 */
VG_(snprintf)(
dname1, n_dname,
- "Location 0x%lx is %lu byte%s inside %s%s,",
+ "Location 0x%lX is %lu byte%s inside %s%s,",
data_addr, residual_offset, ro_plural, var->name,
VG_(indexXA)(described,0) );
VG_(snprintf)(
@@ -2086,7 +2086,7 @@
dname1[0] = 0;
VG_(snprintf)(
dname1, n_dname,
- "Address 0x%llx is %llu bytes "
+ "Address 0x%llX is %llu bytes "
"inside data symbol \"%t\"",
(ULong)data_addr, (ULong)datasym_offset, &dname2[0]
);
|
|
From: <sv...@va...> - 2008-03-16 12:27:08
|
Author: sewardj
Date: 2008-03-16 12:27:11 +0000 (Sun, 16 Mar 2008)
New Revision: 7709
Log:
Also intercept strcmp().
Modified:
branches/HGDEV/helgrind/hg_intercepts.c
Modified: branches/HGDEV/helgrind/hg_intercepts.c
===================================================================
--- branches/HGDEV/helgrind/hg_intercepts.c 2008-03-16 12:25:54 UTC (rev 7708)
+++ branches/HGDEV/helgrind/hg_intercepts.c 2008-03-16 12:27:11 UTC (rev 7709)
@@ -1,7 +1,7 @@
/*--------------------------------------------------------------------*/
/*--- pthread intercepts for thread checking. ---*/
-/*--- tc_intercepts.c ---*/
+/*--- hg_intercepts.c ---*/
/*--------------------------------------------------------------------*/
/*
@@ -1380,6 +1380,8 @@
/* END tiresome boilerplate */
+// --- MEMCPY -----------------------------------------------------
+//
#define MEMCPY(soname, fnname) \
void* VG_REPLACE_FUNCTION_ZU(soname,fnname) \
( void *dst, const void *src, SizeT len ); \
@@ -1436,6 +1438,8 @@
MEMCPY(NONE, _intel_fast_memcpy)
+// --- STRCHR and INDEX -------------------------------------------
+//
#define STRCHR(soname, fnname) \
char* VG_REPLACE_FUNCTION_ZU(soname,fnname) ( const char* s, int c ); \
char* VG_REPLACE_FUNCTION_ZU(soname,fnname) ( const char* s, int c ) \
@@ -1458,6 +1462,35 @@
STRCHR(m_ld_linux_x86_64_so_2, index)
+// --- STRCMP -----------------------------------------------------
+//
+#define STRCMP(soname, fnname) \
+ int VG_REPLACE_FUNCTION_ZU(soname,fnname) \
+ ( const char* s1, const char* s2 ); \
+ int VG_REPLACE_FUNCTION_ZU(soname,fnname) \
+ ( const char* s1, const char* s2 ) \
+ { \
+ register unsigned char c1; \
+ register unsigned char c2; \
+ while (True) { \
+ c1 = *(unsigned char *)s1; \
+ c2 = *(unsigned char *)s2; \
+ if (c1 != c2) break; \
+ if (c1 == 0) break; \
+ s1++; s2++; \
+ } \
+ if ((unsigned char)c1 < (unsigned char)c2) return -1; \
+ if ((unsigned char)c1 > (unsigned char)c2) return 1; \
+ return 0; \
+ }
+
+STRCMP(m_libc_soname, strcmp)
+STRCMP(m_ld_linux_x86_64_so_2, strcmp)
+STRCMP(m_ld64_so_1, strcmp)
+
+
+// --- STRLEN -----------------------------------------------------
+//
// Note that this replacement often doesn't get used because gcc inlines
// calls to strlen() with its own built-in version. This can be very
// confusing if you aren't expecting it. Other small functions in this file
@@ -1476,7 +1509,6 @@
STRLEN(m_ld_linux_x86_64_so_2, strlen)
-
/*--------------------------------------------------------------------*/
-/*--- end tc_intercepts.c ---*/
+/*--- end hg_intercepts.c ---*/
/*--------------------------------------------------------------------*/
|
|
From: <sv...@va...> - 2008-03-16 12:25:49
|
Author: sewardj
Date: 2008-03-16 12:25:54 +0000 (Sun, 16 Mar 2008)
New Revision: 7708
Log:
* don't track the BGL in the LAOG mechanism
* cosmetic printing improvements (stats fields wider, etc)
Modified:
branches/HGDEV/helgrind/hg_main.c
Modified: branches/HGDEV/helgrind/hg_main.c
===================================================================
--- branches/HGDEV/helgrind/hg_main.c 2008-03-16 11:06:36 UTC (rev 7707)
+++ branches/HGDEV/helgrind/hg_main.c 2008-03-16 12:25:54 UTC (rev 7708)
@@ -5786,7 +5786,8 @@
noerror:
/* check lock order acquisition graph, and update. This has to
happen before the lock is added to the thread's locksetA/W. */
- laog__pre_thread_acquires_lock( thr, lk );
+ if (lk != __bus_lock_Lock)
+ laog__pre_thread_acquires_lock( thr, lk );
/* update the thread's held-locks set */
thr->locksetA = HG_(addToWS)( univ_lsets, thr->locksetA, (Word)lk );
thr->locksetW = HG_(addToWS)( univ_lsets, thr->locksetW, (Word)lk );
@@ -5861,6 +5862,7 @@
noerror:
/* check lock order acquisition graph, and update. This has to
happen before the lock is added to the thread's locksetA/W. */
+ tl_assert(lk != __bus_lock_Lock); /* bus lock only ever acquired as W */
laog__pre_thread_acquires_lock( thr, lk );
/* update the thread's held-locks set */
thr->locksetA = HG_(addToWS)( univ_lsets, thr->locksetA, (Word)lk );
@@ -7556,6 +7558,18 @@
Word ls_size, i;
Lock* other;
+ /* There's no point in tracking the BHL with this mechanism, as
+ that just wastes time, and the lock is always at the "top" of
+ any hierarchy in which it appears (since it is only transiently
+ locked for one instruction). So just insist the callers don't
+ provide it. */
+ if (UNLIKELY(lk == __bus_lock_Lock)) {
+ tl_assert(lk->guestaddr == (Addr)&__bus_lock); /* as it should be */
+ tl_assert(0); /* caller should never supply this arg */
+ } else {
+ tl_assert(lk->guestaddr != (Addr)&__bus_lock);
+ }
+
/* It may be that 'thr' already holds 'lk' and is recursively
relocking in. In this case we just ignore the call. */
/* NB: univ_lsets really is correct here */
@@ -9374,7 +9388,8 @@
}
else if (VG_CLO_STREQN(23, arg, "--max-segment-set-size=")) {
clo_max_segment_set_size = VG_(atoll)(&arg[23]);
- tl_assert(clo_max_segment_set_size >= 4);
+ if (clo_max_segment_set_size < 4)
+ clo_max_segment_set_size = 4;
}
else if (VG_CLO_STREQ(arg, "--gen-vcg=no"))
@@ -9431,6 +9446,9 @@
" create/join, create/join/cvsignal/cvwait/semwait/post as sync points\n"
" --trace-addr=0xXXYYZZ show all state changes for address 0xXXYYZZ\n"
" --trace-level=0|1|2 verbosity level of --trace-addr [1]\n"
+" --max-segment-set-size=<N> limit mem use by limiting SegSet sizes [20]\n"
+" --ignore-n=<N> speedup hack; add documentation\n"
+" --ignore-i=<N> speedup hack; add documentation\n"
);
VG_(replacement_malloc_print_usage)();
}
@@ -9500,11 +9518,6 @@
}
VG_(printf)("\n");
- VG_(printf)(" zalloc/free: %,10lu %,10lu\n",
- stat__hg_zalloc, stat__hg_free);
-
-
- VG_(printf)("\n");
VG_(printf)(" hbefore: %,10lu queries\n", stats__hbefore_queries);
VG_(printf)(" hbefore: %,10lu hash table hits\n", stats__hbefore_hits);
VG_(printf)(" hbefore: %,10lu graph searches\n", stats__hbefore_gsearches);
@@ -9515,36 +9528,38 @@
VG_(printf)(" hbefore: %,10lu cache invals\n", stats__hbefore_invals);
VG_(printf)("\n");
- VG_(printf)(" segments: %,8lu Segment objects allocated\n",
+ VG_(printf)(" segments: %,11lu Segment objects allocated\n",
stats__mk_Segment);
- VG_(printf)(" locksets: %,8d unique lock sets\n",
- (Int)HG_(cardinalityWSU)( univ_lsets ));
- VG_(printf)(" segmentsets: %,8d unique segment sets\n",
- (Int)HG_(cardinalityWSU)( univ_ssets ));
- VG_(printf)(" univ_laog: %,8d unique lock sets\n",
- (Int)HG_(cardinalityWSU)( univ_laog ));
+ VG_(printf)(" locksets: %,11ld unique lock sets\n",
+ (Word)HG_(cardinalityWSU)( univ_lsets ));
+ VG_(printf)(" segmentsets: %,11ld unique segment sets\n",
+ (Word)HG_(cardinalityWSU)( univ_ssets ));
+ VG_(printf)(" univ_laog: %,11ld unique lock sets\n",
+ (Word)HG_(cardinalityWSU)( univ_laog ));
- VG_(printf)("L(ast)L(ock) map: %,8lu inserts (%d map size)\n",
+ VG_(printf)("L(ast)L(ock) map: %,11lu inserts (%,ld map size)\n",
stats__ga_LL_adds,
- (Int)(ga_to_lastlock ? HG_(sizeFM)( ga_to_lastlock ) : 0) );
+ (Word)(ga_to_lastlock ? HG_(sizeFM)( ga_to_lastlock ) : 0) );
- VG_(printf)(" LockN-to-P map: %,8lu queries (%d map size)\n",
+ VG_(printf)(" LockN-to-P map: %,11lu queries (%,ld map size)\n",
stats__ga_LockN_to_P_queries,
- (Int)(yaWFM ? HG_(sizeFM)( yaWFM ) : 0) );
+ (Word)(yaWFM ? HG_(sizeFM)( yaWFM ) : 0) );
- VG_(printf)("string table map: %,8lu queries (%d map size)\n",
+ VG_(printf)("string table map: %,11lu queries (%,ld map size)\n",
stats__string_table_queries,
- (Int)(string_table ? HG_(sizeFM)( string_table ) : 0) );
- VG_(printf)(" LAOG: %,8d map size\n",
- (Int)(laog ? HG_(sizeFM)( laog ) : 0));
- VG_(printf)(" LAOG exposition: %,8d map size\n",
- (Int)(laog_exposition ? HG_(sizeFM)( laog_exposition ) : 0));
- VG_(printf)(" locks: %,8lu acquires, "
+ (Word)(string_table ? HG_(sizeFM)( string_table ) : 0) );
+ VG_(printf)(" LAOG: %,11ld map size\n",
+ (Word)(laog ? HG_(sizeFM)( laog ) : 0));
+ VG_(printf)(" LAOG exposition: %,11ld map size\n",
+ (Word)(laog_exposition ? HG_(sizeFM)( laog_exposition ) : 0));
+ VG_(printf)(" locks: %,11lu acquires, "
"%,lu releases\n",
stats__lockN_acquires,
stats__lockN_releases
);
- VG_(printf)(" sanity checks: %,8lu\n", stats__sanity_checks);
+ VG_(printf)(" sanity checks: %,11lu\n", stats__sanity_checks);
+ VG_(printf)(" zalloc/free: %,11lu zallocs, %,lu frees\n",
+ stat__hg_zalloc, stat__hg_free);
VG_(printf)("\n");
VG_(printf)(" msm: %,14lu %,14lu BHL-skipped, Race\n",
@@ -9559,7 +9574,7 @@
stats__msm_oldSS_single);
VG_(printf)(" msm: %,14lu %,14lu SS_update_multi, shortcut\n",
stats__msm_oldSS_multi, stats__msm_oldSS_multi_shortcut);
- VG_(printf)(" msm: %,14lu %,14lu SS_update_add, SS_update_del\n",
+ VG_(printf)(" msm: %,14lu %,14lu SS_update_add, SS_update_del\n",
stats__msm_oldSS_multi_add, stats__msm_oldSS_multi_del);
VG_(printf)("\n");
@@ -9593,17 +9608,17 @@
VG_(printf)("\n");
VG_(printf)(" cline: %,10lu normalises\n",
stats__cline_normalises );
- VG_(printf)(" cline: reads 8/4/2/1: %,12lu %,12lu %,12lu %,12lu\n",
+ VG_(printf)(" cline: rds 8/4/2/1: %,13lu %,13lu %,13lu %,13lu\n",
stats__cline_read64s,
stats__cline_read32s,
stats__cline_read16s,
stats__cline_read8s );
- VG_(printf)(" cline: writes 8/4/2/1: %,12lu %,12lu %,12lu %,12lu\n",
+ VG_(printf)(" cline: wrs 8/4/2/1: %,13lu %,13lu %,13lu %,13lu\n",
stats__cline_write64s,
stats__cline_write32s,
stats__cline_write16s,
stats__cline_write8s );
- VG_(printf)(" cline: sets 8/4/2/1: %,12lu %,12lu %,12lu %,12lu\n",
+ VG_(printf)(" cline: sets 8/4/2/1: %,13lu %,13lu %,13lu %,13lu\n",
stats__cline_set64s,
stats__cline_set32s,
stats__cline_set16s,
|
|
From: <sv...@va...> - 2008-03-16 11:06:33
|
Author: bart Date: 2008-03-16 11:06:36 +0000 (Sun, 16 Mar 2008) New Revision: 7707 Log: Un-break "make dist". Modified: trunk/exp-drd/tests/Makefile.am Modified: trunk/exp-drd/tests/Makefile.am =================================================================== --- trunk/exp-drd/tests/Makefile.am 2008-03-16 10:57:02 UTC (rev 7706) +++ trunk/exp-drd/tests/Makefile.am 2008-03-16 11:06:36 UTC (rev 7707) @@ -58,7 +58,6 @@ omp_matinv_racy.stdout.exp \ omp_matinv_racy.vgtest \ omp_prime_racy.stderr.exp \ - omp_prime_racy.stdout.exp \ omp_prime_racy.vgtest \ pth_barrier.stderr.exp \ pth_barrier.stderr.exp-linuxthreads \ |
|
From: <sv...@va...> - 2008-03-16 10:56:58
|
Author: bart Date: 2008-03-16 10:57:02 +0000 (Sun, 16 Mar 2008) New Revision: 7706 Log: Updated to do list. Modified: trunk/exp-drd/TODO.txt Modified: trunk/exp-drd/TODO.txt =================================================================== --- trunk/exp-drd/TODO.txt 2008-03-16 10:56:35 UTC (rev 7705) +++ trunk/exp-drd/TODO.txt 2008-03-16 10:57:02 UTC (rev 7706) @@ -29,14 +29,21 @@ count. - Add test programs for destroying a condition variable / semaphore / barrier being waited upon. -- Add OpenMP examples to the regression tests. - Make sure an error message is printed if no debug information is found in libopenmp.so.1. - Make sure tc14_laog_dinphils is run during exp-drd regression tests. +- Find out why no line number or variable name information is printed for + races detected in parallel sections of OpenMP programs. An example: + ./vg-in-place --tool=exp-drd exp-drd/tests/omp_prime 4 -t 2 +- Find out why there are races reported on exp-drd/tests/pth_detached_sem + on AMD64 (information about freeing stack memory not passed to DRD ?): + ./vg-in-place --tool=exp-drd exp-drd/tests/pth_detached_sem 3 0 - Find a way for suppressing races reported on _IO_2_1_stdout. This race is triggered by calling printf() from more than one thread. Examples (AMD64): ./vg-in-place --tool=exp-drd exp-drd/tests/tc21_pthonce ./vg-in-place --tool=exp-drd exp-drd/tests/pth_detached 10 10 1 +- Find out why 'matinv 400' runs faster in 32-bit mode than in 64-bit mode + on the same CPU. - testing on PPC and AIX (current implementation is only tested on X86 and AMD64). - Convert the array in drd_thread.c with thread information into an OSet. @@ -51,7 +58,6 @@ (http://www-flash.stanford.edu/apps/SPLASH/) or the PARSEC benchmark (http://parsec.cs.princeton.edu/license.htm). - test with Synfig Studio (see also http://bugs.kde.org/show_bug.cgi?id=158555) -- test with some OpenMP examples. See also http://en.wikipedia.org/wiki/OpenMP. Documentation |
|
From: <sv...@va...> - 2008-03-16 10:56:31
|
Author: bart
Date: 2008-03-16 10:56:35 +0000 (Sun, 16 Mar 2008)
New Revision: 7705
Log:
Added information about OpenMP.
Modified:
trunk/exp-drd/docs/README.txt
Modified: trunk/exp-drd/docs/README.txt
===================================================================
--- trunk/exp-drd/docs/README.txt 2008-03-16 10:42:33 UTC (rev 7704)
+++ trunk/exp-drd/docs/README.txt 2008-03-16 10:56:35 UTC (rev 7705)
@@ -1,7 +1,7 @@
DRD: a Data Race Detector
=========================
-Last update: February 16, 2008 by Bart Van Assche.
+Last update: March 16, 2008 by Bart Van Assche.
Introduction
@@ -30,16 +30,16 @@
all possible data races or deadlocks via source reading. This is why
tools for detecting data races and deadlocks at runtime are essential.
-There exist parallellizing compilers that give good results for a
-certain class of high performance computing (HPC) applications. If you
-are not using a parallelizing compiler, you have to specify explicitly
-in the source code how your program should use threads. How to specify
-this depends on the programming language and the operating system you
-are using. The two options on Unix systems are for C and C++ are the
-POSIX threads library and OpenMP. OpenMP is best suited for HPC
-applications. For other applications, e.g. server or embedded
-software, you can use the POSIX threads library directly or a library
-that is built on top of it.
+Threads can be used to model simultaneous activities in software, to
+allow software to use more than one core of a multiprocessor or both
+at the same time. Most multithreaded server and embedded software
+falls in the first category, while most multithreaded high performance
+computing (HPC) applications fall in the second category. The source
+code syntax for using multithreading depends on the programming
+language and the threading library you want to use. Two common options
+on Unix systems are the POSIX threads library for modeling
+simultaneous activities in C and C++ software and OpenMP for C, C++
+and Fortran HPC applications.
Data Races
@@ -119,12 +119,7 @@
variables, spinlocks, semaphores and barriers are supported. POSIX
reader-writer locks are not yet supported.
-Although [Savage 1997] claims that a happens-before detector is harder
-to implement efficiently than the Eraser algorithm, as of Valgrind
-version 3.3.0 exp-drd runs significantly faster on several regression
-tests than Helgrind.
-
Programming with Threads
------------------------
@@ -137,6 +132,9 @@
decide to use another approach, make sure you understand very well the
consequences of doing so.
+Note: the guidelines below apply to the explicit use of threads such
+as with the POSIX threads library, and not to OpenMP programs.
+
1. Use of synchronization calls.
Do not call synchronization functions directly but use objects that
@@ -232,6 +230,69 @@
To use this tool, specify --tool=drd on the Valgrind command line.
+DRD and OpenMP
+--------------
+
+Just as regular POSIX threads software, OpenMP software can contain
+data races. DRD is able to detect data races in OpenMP programs, but
+only if the shared library that implements OpenMP functionality
+(libgomp.so) has been compiled such that it uses the POSIX threads
+library instead of futexes. A second requirement is that libgomp.so
+must contain debug information. You have to recompile gcc in order to
+obtain a version of libgomp.so that is suited for use with DRD. Once
+gcc has been recompiled, set the CC and LD_LIBRARY_PATH environment
+variables appropriately. It can be convenient to set up shortcuts for
+switching between the gcc compiler provided by your Linux distribution
+and the newly compiled gcc. The shell command below will add the commands
+system-gcc and my-gcc to your shell upon the next login:
+
+cat <<EOF >>~/.bashrc
+function system-gcc { unset CC LD_LIBRARY_PATH; export CC LD_LIBRARY_PATH; }
+function my-gcc { export CC=$HOME/gcc-4.3.0/bin/gcc LD_LIBRARY_PATH=$HOME/gcc-4.3.0/lib64:; }
+EOF
+
+Recompiling gcc is possible with e.g. the following shell script:
+
+---------------------------------------------------------------------------
+#!/bin/sh
+
+GCC_VERSION=4.3.0
+FSF_MIRROR=ftp://ftp.easynet.be/gnu
+SRCDIR=$HOME/software
+INBOUND=$SRCDIR/inbound
+SRC=$HOME/software/gcc-${GCC_VERSION}
+BUILD=${SRC}-build
+TAR=gcc-${GCC_VERSION}.tar.bz2
+PREFIX=$HOME/gcc-${GCC_VERSION}
+
+rm -rf ${BUILD} || exit $?
+rm -rf ${PREFIX} || exit $?
+mkdir -p ${BUILD} || exit $?
+mkdir -p ${INBOUND} || exit $?
+cd ${BUILD} || exit $?
+
+if [ ! -e $INBOUND/$TAR ]; then
+ ( cd $INBOUND && wget -q $FSF_MIRROR/gcc/gcc-${GCC_VERSION}/$TAR )
+fi
+
+if [ ! -e $SRC ]; then
+ ( cd $SRCDIR && tar -xjf $INBOUND/$TAR )
+fi
+
+${SRC}/configure \
+ --disable-linux-futex \
+ --disable-mudflap \
+ --disable-nls \
+ --enable-languages=c,c++ \
+ --enable-threads=posix \
+ --enable-tls \
+ --prefix=$PREFIX
+
+make -s || exit $?
+make -s install || exit $?
+---------------------------------------------------------------------------
+
+
Future DRD Versions
-------------------
The following may be expected in future versions of DRD:
@@ -407,6 +468,10 @@
http://valgrind.org/docs/muehlenfeld2006.pdf
http://portal.acm.org/citation.cfm?id=1229457
+[Sun 2007]
+ Sun Studio 12: Thread Analyzer User's Guide
+ http://docs.sun.com/app/docs/doc/820-0619
+
[Zhou 2007]
Pin Zhou, Radu Teodorescu, Yuanyuan Zhou.
HARD: Hardware-Assisted Lockset-based Race Detection.
|
|
From: <sv...@va...> - 2008-03-16 10:42:29
|
Author: bart
Date: 2008-03-16 10:42:33 +0000 (Sun, 16 Mar 2008)
New Revision: 7704
Log:
Removed support for thread names.
Modified:
trunk/exp-drd/drd_clientreq.c
trunk/exp-drd/drd_clientreq.h
trunk/exp-drd/drd_error.c
trunk/exp-drd/drd_error.h
trunk/exp-drd/drd_main.c
trunk/exp-drd/drd_thread.c
trunk/exp-drd/drd_thread.h
trunk/exp-drd/tests/fp_race.c
trunk/exp-drd/tests/fp_race.stderr.exp
trunk/exp-drd/tests/pth_cond_race.c
trunk/exp-drd/tests/pth_detached.c
trunk/exp-drd/tests/pth_detached_sem.c
trunk/exp-drd/tests/sem_as_mutex.c
trunk/exp-drd/tests/sem_as_mutex.stderr.exp
Modified: trunk/exp-drd/drd_clientreq.c
===================================================================
--- trunk/exp-drd/drd_clientreq.c 2008-03-16 10:41:25 UTC (rev 7703)
+++ trunk/exp-drd/drd_clientreq.c 2008-03-16 10:42:33 UTC (rev 7704)
@@ -93,10 +93,6 @@
result = vg_tid;
break;
- case VG_USERREQ__SET_THREAD_NAME:
- thread_set_name_fmt(drd_tid, (char*)arg[1], arg[2]);
- break;
-
case VG_USERREQ__DRD_START_SUPPRESSION:
drd_start_suppression(arg[1], arg[2], "client");
break;
Modified: trunk/exp-drd/drd_clientreq.h
===================================================================
--- trunk/exp-drd/drd_clientreq.h 2008-03-16 10:41:25 UTC (rev 7703)
+++ trunk/exp-drd/drd_clientreq.h 2008-03-16 10:42:33 UTC (rev 7704)
@@ -9,9 +9,6 @@
/* Ask the core the thread ID assigned by Valgrind. */
VG_USERREQ__GET_THREAD_SELF = VG_USERREQ_TOOL_BASE('D', 'R'),
/* args: none. */
- /* Set the name of the thread that performs this client request. */
- VG_USERREQ__SET_THREAD_NAME,
- /* args: null-terminated character string. */
/* To tell the drd tool to suppress data race detection on the specified */
/* address range. */
Modified: trunk/exp-drd/drd_error.c
===================================================================
--- trunk/exp-drd/drd_error.c 2008-03-16 10:41:25 UTC (rev 7703)
+++ trunk/exp-drd/drd_error.c 2008-03-16 10:42:33 UTC (rev 7704)
@@ -181,8 +181,8 @@
{
case eStack: {
VG_(snprintf)(buf, n_buf,
- "stack of %s, offset %d",
- thread_get_name(ai->stack_tid), ai->rwoffset);
+ "stack of thread %d, offset %d",
+ ai->stack_tid, ai->rwoffset);
break;
}
case eSegment: {
@@ -235,9 +235,9 @@
describe_addr(dri->addr, dri->size, &ai);
}
VG_(message)(Vg_UserMsg,
- "Conflicting %s by %s at 0x%08lx size %ld",
+ "Conflicting %s by thread %d at 0x%08lx size %ld",
dri->access_type == eStore ? "store" : "load",
- thread_get_name(VgThreadIdToDrdThreadId(dri->tid)),
+ DrdThreadIdToVgThreadId(dri->tid),
dri->addr,
dri->size);
VG_(pp_ExeContext)(VG_(get_error_where)(err));
@@ -258,7 +258,7 @@
{
VG_(message)(Vg_UserMsg, "Allocation context: unknown.");
}
- thread_report_conflicting_segments(VgThreadIdToDrdThreadId(dri->tid),
+ thread_report_conflicting_segments(dri->tid,
dri->addr, dri->size, dri->access_type);
}
Modified: trunk/exp-drd/drd_error.h
===================================================================
--- trunk/exp-drd/drd_error.h 2008-03-16 10:41:25 UTC (rev 7703)
+++ trunk/exp-drd/drd_error.h 2008-03-16 10:42:33 UTC (rev 7704)
@@ -78,7 +78,7 @@
AddrInfo;
typedef struct {
- ThreadId tid; // Thread ID of the running thread.
+ DrdThreadId tid; // Thread ID of the running thread.
Addr addr; // Conflicting address in current thread.
SizeT size; // Size in bytes of conflicting operation.
BmAccessTypeT access_type; // Access type: load or store.
Modified: trunk/exp-drd/drd_main.c
===================================================================
--- trunk/exp-drd/drd_main.c 2008-03-16 10:41:25 UTC (rev 7703)
+++ trunk/exp-drd/drd_main.c 2008-03-16 10:42:33 UTC (rev 7704)
@@ -154,7 +154,7 @@
char vc[80];
vc_snprint(vc, sizeof(vc), thread_get_vc(thread_get_running_tid()));
VG_(message)(Vg_UserMsg,
- "%s 0x%lx size %ld %s (vg %d / drd %d / vc %s)",
+ "%s 0x%lx size %ld (vg %d / drd %d / vc %s)",
access_type == eLoad
? "load "
: access_type == eStore
@@ -166,7 +166,6 @@
: "????",
addr,
size,
- thread_get_name(thread_get_running_tid()),
VG_(get_running_tid)(),
thread_get_running_tid(),
vc);
@@ -184,7 +183,7 @@
if (drd_is_suppressed(addr, addr + size))
return;
- drei.tid = VG_(get_running_tid)();
+ drei.tid = thread_get_running_tid();
drei.addr = addr;
drei.size = size;
drei.access_type = access_type;
Modified: trunk/exp-drd/drd_thread.c
===================================================================
--- trunk/exp-drd/drd_thread.c 2008-03-16 10:41:25 UTC (rev 7703)
+++ trunk/exp-drd/drd_thread.c 2008-03-16 10:42:33 UTC (rev 7704)
@@ -122,9 +122,6 @@
s_threadinfo[i].stack_min = 0;
s_threadinfo[i].stack_startup = 0;
s_threadinfo[i].stack_max = 0;
- VG_(snprintf)(s_threadinfo[i].name, sizeof(s_threadinfo[i].name),
- "thread %d", tid);
- s_threadinfo[i].name[sizeof(s_threadinfo[i].name) - 1] = 0;
s_threadinfo[i].is_recording = True;
s_threadinfo[i].synchr_nesting = 0;
if (s_threadinfo[i].first != 0)
@@ -350,32 +347,6 @@
s_threadinfo[tid].detached_posix_thread = ! joinable;
}
-const char* thread_get_name(const DrdThreadId tid)
-{
- tl_assert(0 <= tid && tid < DRD_N_THREADS
- && tid != DRD_INVALID_THREADID);
- return s_threadinfo[tid].name;
-}
-
-void thread_set_name(const DrdThreadId tid, const char* const name)
-{
- tl_assert(0 <= tid && tid < DRD_N_THREADS
- && tid != DRD_INVALID_THREADID);
- VG_(strncpy)(s_threadinfo[tid].name, name,
- sizeof(s_threadinfo[tid].name));
- s_threadinfo[tid].name[sizeof(s_threadinfo[tid].name) - 1] = 0;
-}
-
-void thread_set_name_fmt(const DrdThreadId tid, const char* const fmt,
- const UWord arg)
-{
- tl_assert(0 <= tid && tid < DRD_N_THREADS
- && tid != DRD_INVALID_THREADID);
- VG_(snprintf)(s_threadinfo[tid].name, sizeof(s_threadinfo[tid].name),
- fmt, arg);
- s_threadinfo[tid].name[sizeof(s_threadinfo[tid].name) - 1] = 0;
-}
-
void thread_set_vg_running_tid(const ThreadId vg_tid)
{
tl_assert(vg_tid != VG_INVALID_THREADID);
@@ -688,15 +659,14 @@
if (s_threadinfo[i].first)
{
VG_(printf)("**************\n"
- "* thread %3d (%d/%d/%d/0x%x/%d/%s) *\n"
+ "* thread %3d (%d/%d/%d/0x%x/%d) *\n"
"**************\n",
i,
s_threadinfo[i].vg_thread_exists,
s_threadinfo[i].vg_threadid,
s_threadinfo[i].posix_thread_exists,
s_threadinfo[i].pt_threadid,
- s_threadinfo[i].detached_posix_thread,
- s_threadinfo[i].name);
+ s_threadinfo[i].detached_posix_thread);
for (p = s_threadinfo[i].first; p; p = p->next)
{
sg_print(p);
@@ -711,10 +681,7 @@
{
const ThreadId vg_tid = DrdThreadIdToVgThreadId(tid);
- VG_(message)(Vg_UserMsg,
- "%s (%s)",
- msg,
- thread_get_name(tid));
+ VG_(message)(Vg_UserMsg, "%s (thread %d)", msg, tid);
if (vg_tid != VG_INVALID_THREADID)
{
Modified: trunk/exp-drd/drd_thread.h
===================================================================
--- trunk/exp-drd/drd_thread.h 2008-03-16 10:41:25 UTC (rev 7703)
+++ trunk/exp-drd/drd_thread.h 2008-03-16 10:42:33 UTC (rev 7704)
@@ -63,7 +63,6 @@
Addr stack_min;
Addr stack_startup;
Addr stack_max;
- char name[32];
/// Indicates whether the Valgrind core knows about this thread.
Bool vg_thread_exists;
/// Indicates whether there is an associated POSIX thread ID.
@@ -109,10 +108,6 @@
void thread_set_pthreadid(const DrdThreadId tid, const PThreadId ptid);
Bool thread_get_joinable(const DrdThreadId tid);
void thread_set_joinable(const DrdThreadId tid, const Bool joinable);
-const char* thread_get_name(const DrdThreadId tid);
-void thread_set_name(const DrdThreadId tid, const char* const name);
-void thread_set_name_fmt(const DrdThreadId tid, const char* const name,
- const UWord arg);
void thread_set_vg_running_tid(const ThreadId vg_tid);
void thread_set_running_tid(const ThreadId vg_tid,
const DrdThreadId drd_tid);
Modified: trunk/exp-drd/tests/fp_race.c
===================================================================
--- trunk/exp-drd/tests/fp_race.c 2008-03-16 10:41:25 UTC (rev 7703)
+++ trunk/exp-drd/tests/fp_race.c 2008-03-16 10:42:33 UTC (rev 7704)
@@ -52,20 +52,11 @@
// Function definitions.
-static void set_thread_name(const char* const name)
-{
- int res;
- VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__SET_THREAD_NAME,
- name, 0, 0, 0, 0);
-}
-
int main(int argc, char** argv)
{
int optchar;
pthread_t threadid;
- set_thread_name("main");
-
while ((optchar = getopt(argc, argv, "dmp")) != EOF)
{
switch (optchar)
@@ -123,8 +114,6 @@
static void* thread_func(void* thread_arg)
{
- set_thread_name("thread_func");
-
if (s_do_printf)
{
printf("s_d1 = %g (should be 1)\n", s_d1);
Modified: trunk/exp-drd/tests/fp_race.stderr.exp
===================================================================
--- trunk/exp-drd/tests/fp_race.stderr.exp 2008-03-16 10:41:25 UTC (rev 7703)
+++ trunk/exp-drd/tests/fp_race.stderr.exp 2008-03-16 10:42:33 UTC (rev 7704)
@@ -1,20 +1,20 @@
-Conflicting load by main at 0x........ size 8
+Conflicting load by thread 1 at 0x........ size 8
at 0x........: main (fp_race.c:?)
Location 0x........ is 0 bytes inside local var "s_d3"
declared at fp_race.c:47, in frame #? of thread 1
-Other segment start (thread_func)
+Other segment start (thread 2)
(thread finished, call stack no longer available)
-Other segment end (thread_func)
+Other segment end (thread 2)
(thread finished, call stack no longer available)
-Conflicting store by main at 0x........ size 8
+Conflicting store by thread 1 at 0x........ size 8
at 0x........: main (fp_race.c:?)
Location 0x........ is 0 bytes inside local var "s_d3"
declared at fp_race.c:47, in frame #? of thread 1
-Other segment start (thread_func)
+Other segment start (thread 2)
(thread finished, call stack no longer available)
-Other segment end (thread_func)
+Other segment end (thread 2)
(thread finished, call stack no longer available)
ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
Modified: trunk/exp-drd/tests/pth_cond_race.c
===================================================================
--- trunk/exp-drd/tests/pth_cond_race.c 2008-03-16 10:41:25 UTC (rev 7703)
+++ trunk/exp-drd/tests/pth_cond_race.c 2008-03-16 10:42:33 UTC (rev 7704)
@@ -23,20 +23,11 @@
// Function definitions.
-static void set_thread_name(const char* const name)
-{
- int res;
- VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__SET_THREAD_NAME,
- "%s", name, 0, 0, 0);
-}
-
int main(int argc, char** argv)
{
int optchar;
pthread_t threadid;
- set_thread_name("main");
-
while ((optchar = getopt(argc, argv, "m")) != EOF)
{
switch (optchar)
@@ -68,8 +59,6 @@
static void* thread_func(void* thread_arg)
{
- set_thread_name("thread_func");
-
// Wait until the main thread has entered pthread_cond_wait().
pthread_mutex_lock(&s_mutex);
pthread_mutex_unlock(&s_mutex);
Modified: trunk/exp-drd/tests/pth_detached.c
===================================================================
--- trunk/exp-drd/tests/pth_detached.c 2008-03-16 10:41:25 UTC (rev 7703)
+++ trunk/exp-drd/tests/pth_detached.c 2008-03-16 10:42:33 UTC (rev 7704)
@@ -12,23 +12,9 @@
static int s_finished_count;
-static int s_set_thread_name;
static pthread_mutex_t s_mutex;
-static void set_thread_name(const char* const fmt, const int arg)
-{
- if (s_set_thread_name)
- {
- int res;
- char name[32];
- snprintf(name, sizeof(name), fmt, arg);
- name[sizeof(name) - 1] = 0;
- VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__SET_THREAD_NAME,
- name, 0, 0, 0, 0);
- }
-}
-
static void increment_finished_count()
{
pthread_mutex_lock(&s_mutex);
@@ -47,7 +33,6 @@
static void* thread_func1(void* arg)
{
- set_thread_name("thread_func1[%d]", *(int*)arg);
write(STDOUT_FILENO, ".", 1);
increment_finished_count();
return 0;
@@ -55,7 +40,6 @@
static void* thread_func2(void* arg)
{
- set_thread_name("thread_func2[%d]", *(int*)arg);
pthread_detach(pthread_self());
write(STDOUT_FILENO, ".", 1);
increment_finished_count();
@@ -66,16 +50,11 @@
{
const int count1 = argc > 1 ? atoi(argv[1]) : 100;
const int count2 = argc > 2 ? atoi(argv[2]) : 100;
- const int do_set_thread_name = argc > 3 ? atoi(argv[3]) != 0 : 0;
int thread_arg[count1 > count2 ? count1 : count2];
int i;
int detachstate;
pthread_attr_t attr;
- s_set_thread_name = do_set_thread_name;
-
- set_thread_name("main", 0);
-
for (i = 0; i < count1 || i < count2; i++)
thread_arg[i] = i;
Modified: trunk/exp-drd/tests/pth_detached_sem.c
===================================================================
--- trunk/exp-drd/tests/pth_detached_sem.c 2008-03-16 10:41:25 UTC (rev 7703)
+++ trunk/exp-drd/tests/pth_detached_sem.c 2008-03-16 10:42:33 UTC (rev 7704)
@@ -16,23 +16,9 @@
#include "../drd_clientreq.h"
-static int s_set_thread_name;
static sem_t s_sem;
-static void set_thread_name(const char* const fmt, const int arg)
-{
- if (s_set_thread_name)
- {
- int res;
- char name[32];
- snprintf(name, sizeof(name), fmt, arg);
- name[sizeof(name) - 1] = 0;
- VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__SET_THREAD_NAME,
- name, 0, 0, 0, 0);
- }
-}
-
static void increment_finished_count()
{
sem_post(&s_sem);
@@ -40,7 +26,6 @@
static void* thread_func1(void* arg)
{
- set_thread_name("thread_func1[%d]", *(int*)arg);
write(STDOUT_FILENO, ".", 1);
increment_finished_count();
return 0;
@@ -48,7 +33,6 @@
static void* thread_func2(void* arg)
{
- set_thread_name("thread_func2[%d]", *(int*)arg);
pthread_detach(pthread_self());
write(STDOUT_FILENO, ".", 1);
increment_finished_count();
@@ -59,16 +43,11 @@
{
const int count1 = argc > 1 ? atoi(argv[1]) : 100;
const int count2 = argc > 2 ? atoi(argv[2]) : 100;
- const int do_set_thread_name = argc > 3 ? atoi(argv[3]) != 0 : 0;
int thread_arg[count1 > count2 ? count1 : count2];
int i;
int detachstate;
pthread_attr_t attr;
- s_set_thread_name = do_set_thread_name;
-
- set_thread_name("main", 0);
-
for (i = 0; i < count1 || i < count2; i++)
thread_arg[i] = i;
Modified: trunk/exp-drd/tests/sem_as_mutex.c
===================================================================
--- trunk/exp-drd/tests/sem_as_mutex.c 2008-03-16 10:41:25 UTC (rev 7703)
+++ trunk/exp-drd/tests/sem_as_mutex.c 2008-03-16 10:42:33 UTC (rev 7704)
@@ -53,20 +53,11 @@
// Function definitions.
-static void set_thread_name(const char* const name)
-{
- int res;
- VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__SET_THREAD_NAME,
- name, 0, 0, 0, 0);
-}
-
int main(int argc, char** argv)
{
int optchar;
pthread_t threadid;
- set_thread_name("main");
-
while ((optchar = getopt(argc, argv, "dmp")) != EOF)
{
switch (optchar)
@@ -124,8 +115,6 @@
static void* thread_func(void* thread_arg)
{
- set_thread_name("thread_func");
-
if (s_do_printf)
{
printf("s_d1 = %g (should be 1)\n", s_d1);
Modified: trunk/exp-drd/tests/sem_as_mutex.stderr.exp
===================================================================
--- trunk/exp-drd/tests/sem_as_mutex.stderr.exp 2008-03-16 10:41:25 UTC (rev 7703)
+++ trunk/exp-drd/tests/sem_as_mutex.stderr.exp 2008-03-16 10:42:33 UTC (rev 7704)
@@ -1,20 +1,20 @@
-Conflicting load by main at 0x........ size 8
+Conflicting load by thread 1 at 0x........ size 8
at 0x........: main (sem_as_mutex.c:?)
Location 0x........ is 0 bytes inside local var "s_d3"
declared at sem_as_mutex.c:48, in frame #? of thread 1
-Other segment start (thread_func)
+Other segment start (thread 2)
(thread finished, call stack no longer available)
-Other segment end (thread_func)
+Other segment end (thread 2)
(thread finished, call stack no longer available)
-Conflicting store by main at 0x........ size 8
+Conflicting store by thread 1 at 0x........ size 8
at 0x........: main (sem_as_mutex.c:?)
Location 0x........ is 0 bytes inside local var "s_d3"
declared at sem_as_mutex.c:48, in frame #? of thread 1
-Other segment start (thread_func)
+Other segment start (thread 2)
(thread finished, call stack no longer available)
-Other segment end (thread_func)
+Other segment end (thread 2)
(thread finished, call stack no longer available)
ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
|
|
From: <sv...@va...> - 2008-03-16 10:41:20
|
Author: bart
Date: 2008-03-16 10:41:25 +0000 (Sun, 16 Mar 2008)
New Revision: 7703
Log:
Refinement: OpenMP tests are now only run if libgomp.so has debug information and if it has been compiled with --disable-linux-futex.
Modified:
trunk/exp-drd/tests/run_openmp_test
Modified: trunk/exp-drd/tests/run_openmp_test
===================================================================
--- trunk/exp-drd/tests/run_openmp_test 2008-03-16 10:04:58 UTC (rev 7702)
+++ trunk/exp-drd/tests/run_openmp_test 2008-03-16 10:41:25 UTC (rev 7703)
@@ -4,6 +4,25 @@
# with status 0 if the OpenMP test program should be run and that exits with
# status 1 if the OpenMP test program should not be run.
+# Inspect the output of nm. If nm does not find any symbol information,
+# echo 1. If the symbol gomp_barrier_init is found, echo 0. Otherwise echo
+# nothing. The second case occurs if gcc has been compiled with
+# --disable-linux-futex, and the last case occurs if gcc has been compiled with
+# --enable-linux-futex.
+function parse_libgomp {
+ nm "$1" 2>&1 \
+ |
+ while read line
+ do
+ if [ "${line%: no symbols}" != "${line}" ]; then
+ echo 1
+ elif [ "${line% gomp_barrier_init}" != "${line}" ]; then
+ echo 0
+ fi
+ done
+}
+
+
test -e "$1" || exit $?
if [ "$(uname)" = Linux ]; then
@@ -13,17 +32,7 @@
| while read soname arrow path offset; \
do if [ "${soname#libgomp.so}" != "${soname}" ]; then echo $path; fi; done)"
- # Inspect the first line of the output of nm. If nm does not find any symbol
- # information, return exit code 1, and otherwise return exit code 0.
- nm "${libgomp_path}" 2>&1 \
- |
- while read line
- do
- if [ "${line%: no symbols}" != "${line}" ]; then
- exit 1
- else
- exit 0
- fi
- done
+ rc="$(parse_libgomp "${libgomp_path}")"
+ exit ${rc:-1}
fi
|
|
From: <sv...@va...> - 2008-03-16 10:04:54
|
Author: bart
Date: 2008-03-16 10:04:58 +0000 (Sun, 16 Mar 2008)
New Revision: 7702
Log:
An error message is now printed if DRD is started with a client program that loads a version of libgomp.so that has been compiled with --enable-linux-futex.
Modified:
trunk/exp-drd/drd_barrier.c
Modified: trunk/exp-drd/drd_barrier.c
===================================================================
--- trunk/exp-drd/drd_barrier.c 2008-03-16 08:40:55 UTC (rev 7701)
+++ trunk/exp-drd/drd_barrier.c 2008-03-16 10:04:58 UTC (rev 7702)
@@ -261,6 +261,16 @@
const UWord word_tid = tid;
p = barrier_get(barrier);
+ if (p == 0 && barrier_type == gomp_barrier)
+ {
+ VG_(message)(Vg_UserMsg, "");
+ VG_(message)(Vg_UserMsg,
+ "Please verify whether gcc has been configured"
+ " with option --disable-linux-futex.");
+ VG_(message)(Vg_UserMsg,
+ "See also the section about OpenMP in the DRD manual.");
+ VG_(message)(Vg_UserMsg, "");
+ }
tl_assert(p);
if (s_trace_barrier)
|
|
From: <sv...@va...> - 2008-03-16 08:40:51
|
Author: bart
Date: 2008-03-16 08:40:55 +0000 (Sun, 16 Mar 2008)
New Revision: 7701
Log:
More small performance optimizations with regard to stack pointer manipulation.
Modified:
trunk/exp-drd/drd_main.c
Modified: trunk/exp-drd/drd_main.c
===================================================================
--- trunk/exp-drd/drd_main.c 2008-03-16 08:39:54 UTC (rev 7700)
+++ trunk/exp-drd/drd_main.c 2008-03-16 08:40:55 UTC (rev 7701)
@@ -155,7 +155,15 @@
vc_snprint(vc, sizeof(vc), thread_get_vc(thread_get_running_tid()));
VG_(message)(Vg_UserMsg,
"%s 0x%lx size %ld %s (vg %d / drd %d / vc %s)",
- access_type == eLoad ? "load " : "store",
+ access_type == eLoad
+ ? "load "
+ : access_type == eStore
+ ? "store"
+ : access_type == eStart
+ ? "start"
+ : access_type == eEnd
+ ? "end"
+ : "????",
addr,
size,
thread_get_name(thread_get_running_tid()),
@@ -443,15 +451,9 @@
tl_assert(a1 < a2);
- thread_set_vg_running_tid(VG_(get_running_tid)());
-
if (a1 <= drd_trace_address && drd_trace_address < a2)
{
- VG_(message)(Vg_UserMsg, "start 0x%lx size %ld %s (tracing 0x%lx)",
- a1, a2 - a1, thread_get_name(thread_get_running_tid()),
- drd_trace_address);
- VG_(get_and_pp_StackTrace)(VG_(get_running_tid)(),
- VG_(clo_backtrace_size));
+ drd_trace_mem_access(a1, len, eStart);
}
}
@@ -463,11 +465,7 @@
if (a1 <= drd_trace_address && drd_trace_address < a2)
{
- VG_(message)(Vg_UserMsg, "end 0x%lx size %ld %s (tracing 0x%lx)",
- a1, a2 - a1, thread_get_name(thread_get_running_tid()),
- drd_trace_address);
- VG_(get_and_pp_StackTrace)(VG_(get_running_tid)(),
- VG_(clo_backtrace_size));
+ drd_trace_mem_access(a1, len, eStart);
}
thread_stop_using_mem(a1, a2);
clientobj_stop_using_mem(a1, a2);
@@ -478,6 +476,8 @@
void drd_start_using_mem_w_perms(const Addr a, const SizeT len,
const Bool rr, const Bool ww, const Bool xx)
{
+ thread_set_vg_running_tid(VG_(get_running_tid)());
+
drd_start_using_mem(a, len);
}
@@ -486,7 +486,7 @@
/* Assumption: stacks grow downward. */
static void drd_start_using_mem_stack(const Addr a, const SizeT len)
{
- thread_set_stack_min(thread_get_running_tid(), a - VG_STACK_REDZONE_SZB);
+ thread_set_stack_min(thread_get_running_tid(), a);
drd_start_using_mem(a, len);
}
@@ -495,14 +495,13 @@
/* Assumption: stacks grow downward. */
static void drd_stop_using_mem_stack(const Addr a, const SizeT len)
{
- thread_set_vg_running_tid(VG_(get_running_tid)());
- thread_set_stack_min(thread_get_running_tid(),
- a + len - VG_STACK_REDZONE_SZB);
+ thread_set_stack_min(thread_get_running_tid(), a + len);
drd_stop_using_mem(a, len);
}
static void drd_start_using_mem_stack_signal(const Addr a, const SizeT len)
{
+ thread_set_vg_running_tid(VG_(get_running_tid)());
drd_start_using_mem(a, len);
}
|
|
From: <sv...@va...> - 2008-03-16 08:40:02
|
Author: bart
Date: 2008-03-16 08:39:54 +0000 (Sun, 16 Mar 2008)
New Revision: 7700
Log:
Added creation / destruction events to the bitmap access type enumeration.
Modified:
trunk/exp-drd/pub_drd_bitmap.h
Modified: trunk/exp-drd/pub_drd_bitmap.h
===================================================================
--- trunk/exp-drd/pub_drd_bitmap.h 2008-03-16 08:39:19 UTC (rev 7699)
+++ trunk/exp-drd/pub_drd_bitmap.h 2008-03-16 08:39:54 UTC (rev 7700)
@@ -50,7 +50,7 @@
// Datatype definitions.
-typedef enum { eLoad, eStore } BmAccessTypeT;
+typedef enum { eLoad, eStore, eStart, eEnd } BmAccessTypeT;
// Function declarations.
|
|
From: <sv...@va...> - 2008-03-16 08:39:18
|
Author: bart Date: 2008-03-16 08:39:19 +0000 (Sun, 16 Mar 2008) New Revision: 7699 Log: The recently added cache data members of the bitmap structure are now initialized properly. Modified: trunk/exp-drd/drd_bitmap.c Modified: trunk/exp-drd/drd_bitmap.c =================================================================== --- trunk/exp-drd/drd_bitmap.c 2008-03-16 08:36:23 UTC (rev 7698) +++ trunk/exp-drd/drd_bitmap.c 2008-03-16 08:39:19 UTC (rev 7699) @@ -59,7 +59,9 @@ bm = VG_(malloc)(sizeof(*bm)); tl_assert(bm); - bm->oset = VG_(OSetGen_Create)(0, 0, VG_(malloc), VG_(free)); + bm->last_lookup_a1 = 0; + bm->last_lookup_result = 0; + bm->oset = VG_(OSetGen_Create)(0, 0, VG_(malloc), VG_(free)); s_bitmap_creation_count++; |
|
From: <sv...@va...> - 2008-03-16 08:36:19
|
Author: bart
Date: 2008-03-16 08:36:23 +0000 (Sun, 16 Mar 2008)
New Revision: 7698
Log:
Declared thread_set_stack_min() inline.
Modified:
trunk/exp-drd/drd_thread.c
trunk/exp-drd/drd_thread.h
Modified: trunk/exp-drd/drd_thread.c
===================================================================
--- trunk/exp-drd/drd_thread.c 2008-03-16 08:31:04 UTC (rev 7697)
+++ trunk/exp-drd/drd_thread.c 2008-03-16 08:36:23 UTC (rev 7698)
@@ -119,7 +119,6 @@
s_threadinfo[i].vg_thread_exists = True;
s_threadinfo[i].vg_threadid = tid;
s_threadinfo[i].pt_threadid = INVALID_POSIX_THREADID;
- s_threadinfo[i].stack_min_min = 0;
s_threadinfo[i].stack_min = 0;
s_threadinfo[i].stack_startup = 0;
s_threadinfo[i].stack_max = 0;
@@ -218,7 +217,6 @@
s_threadinfo[created].stack_max = VG_(thread_get_stack_max)(vg_created);
s_threadinfo[created].stack_startup = s_threadinfo[created].stack_max;
s_threadinfo[created].stack_min = s_threadinfo[created].stack_max;
- s_threadinfo[created].stack_min_min = s_threadinfo[created].stack_max;
tl_assert(s_threadinfo[created].stack_max != 0);
return created;
@@ -251,31 +249,6 @@
return s_threadinfo[tid].stack_min;
}
-void thread_set_stack_min(const DrdThreadId tid, const Addr stack_min)
-{
-#if 0
- VG_(message)(Vg_DebugMsg, "thread %d (%d) stack_min = 0x%x"
- " (size %d, max %d, delta %d)",
- s_threadinfo[tid].vg_threadid, tid,
- stack_min,
- s_threadinfo[tid].stack_max - stack_min,
- s_threadinfo[tid].stack_max - s_threadinfo[tid].stack_min_min,
- s_threadinfo[tid].stack_min - stack_min);
-#endif
- tl_assert(0 <= tid && tid < DRD_N_THREADS && tid != DRD_INVALID_THREADID);
- if (s_threadinfo[tid].stack_max)
- {
- s_threadinfo[tid].stack_min = stack_min;
- if (stack_min < s_threadinfo[tid].stack_min_min)
- {
- s_threadinfo[tid].stack_min_min = stack_min;
- }
- tl_assert(s_threadinfo[tid].stack_min_min
- <= s_threadinfo[tid].stack_min);
- tl_assert(s_threadinfo[tid].stack_min < s_threadinfo[tid].stack_max);
- }
-}
-
DrdThreadId thread_lookup_stackaddr(const Addr a,
Addr* const stack_min,
Addr* const stack_max)
@@ -403,12 +376,6 @@
s_threadinfo[tid].name[sizeof(s_threadinfo[tid].name) - 1] = 0;
}
-DrdThreadId thread_get_running_tid(void)
-{
- tl_assert(s_drd_running_tid != DRD_INVALID_THREADID);
- return s_drd_running_tid;
-}
-
void thread_set_vg_running_tid(const ThreadId vg_tid)
{
tl_assert(vg_tid != VG_INVALID_THREADID);
@@ -845,12 +812,9 @@
if (s_danger_set)
{
- bm_clear_all(s_danger_set);
+ bm_delete(s_danger_set);
}
- else
- {
- s_danger_set = bm_new();
- }
+ s_danger_set = bm_new();
if (s_trace_danger_set)
{
Modified: trunk/exp-drd/drd_thread.h
===================================================================
--- trunk/exp-drd/drd_thread.h 2008-03-16 08:31:04 UTC (rev 7697)
+++ trunk/exp-drd/drd_thread.h 2008-03-16 08:36:23 UTC (rev 7698)
@@ -60,7 +60,6 @@
Segment* last;
ThreadId vg_threadid;
PThreadId pt_threadid;
- Addr stack_min_min;
Addr stack_min;
Addr stack_startup;
Addr stack_max;
@@ -104,7 +103,6 @@
void thread_finished(const DrdThreadId tid);
void thread_set_stack_startup(const DrdThreadId tid, const Addr stack_startup);
Addr thread_get_stack_min(const DrdThreadId tid);
-void thread_set_stack_min(const DrdThreadId tid, const Addr stack_min);
DrdThreadId thread_lookup_stackaddr(const Addr a,
Addr* const stack_min,
Addr* const stack_max);
@@ -115,7 +113,6 @@
void thread_set_name(const DrdThreadId tid, const char* const name);
void thread_set_name_fmt(const DrdThreadId tid, const char* const name,
const UWord arg);
-DrdThreadId thread_get_running_tid(void);
void thread_set_vg_running_tid(const ThreadId vg_tid);
void thread_set_running_tid(const ThreadId vg_tid,
const DrdThreadId drd_tid);
@@ -146,9 +143,16 @@
ULong thread_get_danger_set_bitmap2_creation_count(void);
-static
-inline struct bitmap* thread_get_danger_set(void)
+static inline
+DrdThreadId thread_get_running_tid(void)
{
+ tl_assert(s_drd_running_tid != DRD_INVALID_THREADID);
+ return s_drd_running_tid;
+}
+
+static inline
+struct bitmap* thread_get_danger_set(void)
+{
return s_danger_set;
}
@@ -161,6 +165,21 @@
&& s_threadinfo[s_drd_running_tid].is_recording);
}
+static inline
+void thread_set_stack_min(const DrdThreadId tid, const Addr stack_min)
+{
+#if 0
+ tl_assert(0 <= tid && tid < DRD_N_THREADS && tid != DRD_INVALID_THREADID);
+#endif
+ if (s_threadinfo[tid].stack_max)
+ {
+ s_threadinfo[tid].stack_min = stack_min;
+#if 0
+ tl_assert(s_threadinfo[tid].stack_min < s_threadinfo[tid].stack_max);
+#endif
+ }
+}
+
/** Return a pointer to the latest segment for the specified thread. */
static inline
Segment* thread_get_segment(const DrdThreadId tid)
|
|
From: <sv...@va...> - 2008-03-16 08:31:00
|
Author: bart
Date: 2008-03-16 08:31:04 +0000 (Sun, 16 Mar 2008)
New Revision: 7697
Log:
Minor optimization: commented out an assert statement.
Modified:
trunk/exp-drd/drd_vc.c
Modified: trunk/exp-drd/drd_vc.c
===================================================================
--- trunk/exp-drd/drd_vc.c 2008-03-16 07:48:07 UTC (rev 7696)
+++ trunk/exp-drd/drd_vc.c 2008-03-16 08:31:04 UTC (rev 7697)
@@ -104,8 +104,7 @@
* vc2, and if additionally all corresponding counters in v2 are higher or
* equal.
*/
-Bool vc_lte(const VectorClock* const vc1,
- const VectorClock* const vc2)
+Bool vc_lte(const VectorClock* const vc1, const VectorClock* const vc2)
{
unsigned i;
unsigned j = 0;
@@ -117,7 +116,7 @@
}
if (j >= vc2->size || vc2->vc[j].threadid > vc1->vc[i].threadid)
return False;
- tl_assert(j < vc2->size && vc2->vc[j].threadid == vc1->vc[i].threadid);
+ //tl_assert(j < vc2->size && vc2->vc[j].threadid == vc1->vc[i].threadid);
if (vc1->vc[i].count > vc2->vc[j].count)
return False;
}
|
|
From: Bart V. A. <bar...@gm...> - 2008-03-16 08:30:33
|
Hello Julian, Automake prints several warnings during the compilation of Valgrind. The patch below suppresses these warnings. Can you please review this patch ? Thanks, Bart. Index: memcheck/tests/amd64/Makefile.am =================================================================== --- memcheck/tests/amd64/Makefile.am (revision 7696) +++ memcheck/tests/amd64/Makefile.am (working copy) @@ -1,3 +1,5 @@ +AUTOMAKE_OPTIONS = foreign + noinst_SCRIPTS = filter_stderr noinst_HEADERS = Index: memcheck/tests/x86/Makefile.am =================================================================== --- memcheck/tests/x86/Makefile.am (revision 7696) +++ memcheck/tests/x86/Makefile.am (working copy) @@ -1,3 +1,5 @@ +AUTOMAKE_OPTIONS = foreign + noinst_SCRIPTS = filter_stderr filter_pushfpopf filter_tronical noinst_HEADERS = scalar.h Index: configure.in =================================================================== --- configure.in (revision 7696) +++ configure.in (working copy) @@ -55,7 +55,7 @@ AC_PROG_LN_S AC_PROG_CC -##AM_PROG_CC_C_O +AM_PROG_CC_C_O AC_PROG_CPP AC_PROG_CXX AC_PROG_RANLIB Index: none/tests/amd64/Makefile.am =================================================================== --- none/tests/amd64/Makefile.am (revision 7696) +++ none/tests/amd64/Makefile.am (working copy) @@ -1,3 +1,4 @@ +AUTOMAKE_OPTIONS = foreign noinst_SCRIPTS = filter_cpuid filter_stderr filter_int gen_insn_test.pl Index: none/tests/x86/Makefile.am =================================================================== --- none/tests/x86/Makefile.am (revision 7696) +++ none/tests/x86/Makefile.am (working copy) @@ -1,3 +1,5 @@ +AUTOMAKE_OPTIONS = foreign + noinst_SCRIPTS = filter_cpuid filter_stderr gen_insn_test.pl CLEANFILES = $(addsuffix .c,$(INSN_TESTS)) |
|
From: <sv...@va...> - 2008-03-16 07:48:02
|
Author: bart Date: 2008-03-16 07:48:07 +0000 (Sun, 16 Mar 2008) New Revision: 7696 Log: Added script run_openmp_test and regression test pth_detached_sem. Modified: trunk/exp-drd/tests/Makefile.am Modified: trunk/exp-drd/tests/Makefile.am =================================================================== --- trunk/exp-drd/tests/Makefile.am 2008-03-16 07:47:30 UTC (rev 7695) +++ trunk/exp-drd/tests/Makefile.am 2008-03-16 07:48:07 UTC (rev 7696) @@ -11,7 +11,8 @@ filter_fdleak \ filter_linenos \ filter_none_discards \ - filter_stderr + filter_stderr \ + run_openmp_test EXTRA_DIST = \ $(noinst_SCRIPTS) \ @@ -89,8 +90,12 @@ pth_detached2.stderr.exp-linuxthreads \ pth_detached2.stdout.exp \ pth_detached2.stdout.exp-linuxthreads \ - pth_detached2.stdout.exp-linuxthreads \ pth_detached2.vgtest \ + pth_detached_sem.stdout.exp \ + pth_detached_sem.stdout.exp-linuxthreads \ + pth_detached_sem.stderr.exp \ + pth_detached_sem.stderr.exp-linuxthreads \ + pth_detached_sem.vgtest \ recursive_mutex.stderr.exp \ recursive_mutex.stdout.exp \ recursive_mutex.vgtest \ @@ -206,6 +211,7 @@ pth_cond_race \ pth_create_chain \ pth_detached \ + pth_detached_sem \ recursive_mutex \ rwlock_race \ sem_as_mutex \ @@ -288,6 +294,9 @@ pth_detached_SOURCES = pth_detached.c pth_detached_LDADD = -lpthread +pth_detached_sem_SOURCES = pth_detached_sem.c +pth_detached_sem_LDADD = -lpthread + recursive_mutex_SOURCES = recursive_mutex.c recursive_mutex_LDADD = -lpthread |