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
(6) |
2
(7) |
|
3
(12) |
4
(9) |
5
(12) |
6
(9) |
7
(18) |
8
(10) |
9
(17) |
|
10
(15) |
11
(22) |
12
(16) |
13
(18) |
14
(9) |
15
(14) |
16
(18) |
|
17
(24) |
18
(11) |
19
(15) |
20
(29) |
21
(19) |
22
(20) |
23
(9) |
|
24
(25) |
25
(25) |
26
(38) |
27
(22) |
28
(16) |
29
(17) |
|
|
From: <sv...@va...> - 2008-02-29 19:49:02
|
Author: bart Date: 2008-02-29 19:49:06 +0000 (Fri, 29 Feb 2008) New Revision: 7515 Log: Updated tc20_verifywrap to current output, and documented that an error message is missing at the end of the output for this test. Modified: trunk/exp-drd/TODO.txt trunk/exp-drd/tests/tc20_verifywrap.stderr.exp2 Modified: trunk/exp-drd/TODO.txt =================================================================== --- trunk/exp-drd/TODO.txt 2008-02-29 19:45:07 UTC (rev 7514) +++ trunk/exp-drd/TODO.txt 2008-02-29 19:49:06 UTC (rev 7515) @@ -31,8 +31,8 @@ a crash on AMD64. Is this an exp-drd or a VEX bug ? - On x86 and amd64 platforms, add support for implicit locking arising from the use of the LOCK instruction prefix. -- Add test programs for freeing memory that contains a condition variable / - destroying a condition variable being waited upon. +- Add test programs for destroying a condition variable / semaphore / barrier + being waited upon. - Convert the array in drd_thread.c with thread information into an OSet. @@ -66,7 +66,5 @@ -- VG_(find_seginfo)() returns NULL for BSS symbols on x86_64. Not yet in the KDE bug tracking system. - tc04_free_lock fails on AMD64 + openSUSE 10.3 (free() locked mutex). - -Known performance issues: -- According to cachegrind, VG_(OSet_Next)() is taking up most CPU cycles. - Probably due to the bitmap implementation. +- No error message is printed for tc20_verifywrap when a locked mutex is + deallocated (mutex was allocated on the stack). Modified: trunk/exp-drd/tests/tc20_verifywrap.stderr.exp2 =================================================================== --- trunk/exp-drd/tests/tc20_verifywrap.stderr.exp2 2008-02-29 19:45:07 UTC (rev 7514) +++ trunk/exp-drd/tests/tc20_verifywrap.stderr.exp2 2008-02-29 19:49:06 UTC (rev 7515) @@ -84,7 +84,4 @@ ------------ dealloc of mem holding locks ------------ -Destroying locked mutex: address 0x........, recursion count 1, owner 1. - at 0x........: main (tc20_verifywrap.c:262) - ERROR SUMMARY: 10 errors from 10 contexts (suppressed: 0 from 0) |
|
From: <sv...@va...> - 2008-02-29 19:45:08
|
Author: sewardj
Date: 2008-02-29 19:45:07 +0000 (Fri, 29 Feb 2008)
New Revision: 7514
Log:
Stop icc9 complaining about this (doesn't it understand that assert(0)
never returns?)
Modified:
branches/DATASYMS/memcheck/tests/varinfo6.c
Modified: branches/DATASYMS/memcheck/tests/varinfo6.c
===================================================================
--- branches/DATASYMS/memcheck/tests/varinfo6.c 2008-02-29 19:44:04 UTC (rev 7513)
+++ branches/DATASYMS/memcheck/tests/varinfo6.c 2008-02-29 19:45:07 UTC (rev 7514)
@@ -6470,8 +6470,8 @@
default:
assert(0);
}
+ return 0;
}
-
static char *bzerrorstrings[] = {
"OK"
,"SEQUENCE_ERROR"
|
|
From: <sv...@va...> - 2008-02-29 19:44:05
|
Author: sewardj
Date: 2008-02-29 19:44:04 +0000 (Fri, 29 Feb 2008)
New Revision: 7513
Log:
Make debuginfo reading work again on AIX, and improve debug printing a
bit.
Modified:
branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c
branches/DATASYMS/coregrind/m_debuginfo/readxcoff.c
Modified: branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c 2008-02-29 19:37:03 UTC (rev 7512)
+++ branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c 2008-02-29 19:44:04 UTC (rev 7513)
@@ -727,14 +727,20 @@
di = find_or_create_DebugInfo_for( file_name, mem_name );
vg_assert(di);
- di->text_svma = 0; /* don't know yet */
- di->text_bias = 0; /* don't know yet */
- di->text_avma = code_start;
- di->text_size = code_len;
- di->data_svma = 0; /* don't know yet */
- di->data_bias = 0; /* don't know yet */
- di->data_avma = data_start;
- di->data_size = data_len;
+ if (code_len > 0) {
+ di->text_present = True;
+ di->text_svma = 0; /* don't know yet */
+ di->text_bias = 0; /* don't know yet */
+ di->text_avma = code_start;
+ di->text_size = code_len;
+ }
+ if (data_len > 0) {
+ di->data_present = True;
+ di->data_svma = 0; /* don't know yet */
+ di->data_bias = 0; /* don't know yet */
+ di->data_avma = data_start;
+ di->data_size = data_len;
+ }
/* These need to be filled in in order to keep various
assertions in storage.c happy. In particular see
@@ -765,7 +771,8 @@
/* Dump all the debugInfos whose text segments intersect
code_start/code_len. */
- discard_syms_in_range( code_start, code_len );
+ if (code_len > 0)
+ discard_syms_in_range( code_start, code_len );
}
}
Modified: branches/DATASYMS/coregrind/m_debuginfo/readxcoff.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/readxcoff.c 2008-02-29 19:37:03 UTC (rev 7512)
+++ branches/DATASYMS/coregrind/m_debuginfo/readxcoff.c 2008-02-29 19:44:04 UTC (rev 7513)
@@ -93,7 +93,7 @@
#define SHOW_AR_DETAILS 0 /* show details of .a file internals */
-#define SHOW VG_(clo_trace_symtab)
+#define SHOW di->trace_symtab
/* A small stack of filenames is maintained for dealing
with BINCL/EINCL symbol table entries. */
@@ -1546,7 +1546,8 @@
}
-static void show_loader_section ( UChar* oi_start, UWord size )
+static void show_loader_section ( struct _DebugInfo* di,
+ UChar* oi_start, UWord size )
{
Int i, j;
LDHDR* hdr = (LDHDR*)oi_start;
@@ -2024,7 +2025,7 @@
i, name_of_scnhdr_s_flags(t_scnhdr[i].s_flags) );
switch (t_scnhdr[i].s_flags & 0xFFFF) {
case STYP_LOADER:
- show_loader_section( oimage + t_scnhdr[i].s_scnptr,
+ show_loader_section( di, oimage + t_scnhdr[i].s_scnptr,
t_scnhdr[i].s_size );
break;
default:
|
|
From: <sv...@va...> - 2008-02-29 19:37:00
|
Author: bart
Date: 2008-02-29 19:37:03 +0000 (Fri, 29 Feb 2008)
New Revision: 7512
Log:
Updated output variants.
Modified:
trunk/exp-drd/tests/tc20_verifywrap.stderr.exp
trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp
Modified: trunk/exp-drd/tests/tc20_verifywrap.stderr.exp
===================================================================
--- trunk/exp-drd/tests/tc20_verifywrap.stderr.exp 2008-02-29 19:28:15 UTC (rev 7511)
+++ trunk/exp-drd/tests/tc20_verifywrap.stderr.exp 2008-02-29 19:37:03 UTC (rev 7512)
@@ -21,6 +21,18 @@
by 0x........: main (tc20_verifywrap.c:102)
Invalid mutex
+ at 0x........: pthread_mutex_lock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:108)
+
+Invalid mutex
+ at 0x........: pthread_mutex_trylock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:116)
+
+Invalid mutex
+ at 0x........: pthread_mutex_timedlock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:121)
+
+Invalid mutex
at 0x........: pthread_mutex_unlock (drd_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:125)
@@ -41,6 +53,10 @@
FIXME: can't figure out how to verify wrap of pthread_broadcast_signal
+Mutex not locked: address 0x........, recursion count 0, owner 0.
+ at 0x........: pthread_cond_timedwait* (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:165)
+
---------------- pthread_rwlock_* ----------------
(1) no error on next line
@@ -58,13 +74,14 @@
FIXME: can't figure out how to verify wrap of sem_destroy
+Invalid semaphore 0x........
+ at 0x........: sem_wait* (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:242)
+
FIXME: can't figure out how to verify wrap of sem_post
------------ dealloc of mem holding locks ------------
-Destroying locked mutex: address 0x........, recursion count 1, owner 1.
- at 0x........: main (tc20_verifywrap.c:261)
-
-ERROR SUMMARY: 6 errors from 6 contexts (suppressed: 0 from 0)
+ERROR SUMMARY: 10 errors from 10 contexts (suppressed: 0 from 0)
Modified: trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp
===================================================================
--- trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp 2008-02-29 19:28:15 UTC (rev 7511)
+++ trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp 2008-02-29 19:37:03 UTC (rev 7512)
@@ -0,0 +1,149 @@
+
+
+
+------ This is output for >= glibc 2.4 ------
+
+---------------- pthread_create/join ----------------
+
+Conflicting store by thread 1 at 0x........ size 2
+ at 0x........: main (tc20_verifywrap.c:78)
+Allocation context: unprotected (offset 0, size 2) in tc20_verifywrap, NONE:BSS
+Other segment start (thread 2)
+ (thread finished, call stack no longer available)
+Other segment end (thread 2)
+ (thread finished, call stack no longer available)
+
+---------------- pthread_mutex_lock et al ----------------
+
+[1/1] mutex_init invalid mutex 0x........
+[1/1] mutex_init mutex 0x........
+[1/1] post_mutex_lock mutex 0x........ rc 0 owner 0
+[1/1] mutex_destroy mutex 0x........
+
+Destroying locked mutex: address 0x........, recursion count 1, owner 1.
+ at 0x........: pthread_mutex_destroy (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:102)
+[1/1] mutex_init invalid mutex 0x........
+[1/1] post_mutex_lock invalid mutex 0x........ rc 0 owner 0
+
+Invalid mutex
+ at 0x........: pthread_mutex_lock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:108)
+[1/1] post_mutex_lock invalid mutex 0x........ rc 0 owner 0
+
+Invalid mutex
+ at 0x........: pthread_mutex_trylock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:116)
+[1/1] post_mutex_lock invalid mutex 0x........ rc 0 owner 0
+
+Invalid mutex
+ at 0x........: pthread_mutex_timedlock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:121)
+[1/1] mutex_unlock invalid mutex 0x........ rc 0
+
+Invalid mutex
+ at 0x........: pthread_mutex_unlock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:125)
+
+Mutex not locked: address 0x........, recursion count 0, owner 0.
+ at 0x........: pthread_mutex_unlock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:125)
+
+---------------- pthread_cond_wait et al ----------------
+
+[1/1] mutex_init error checking mutex 0x........
+[1/1] cond_init 0x........
+[1/1] mutex_unlock error checking mutex 0x........ rc 0
+
+Mutex not locked: address 0x........, recursion count 0, owner 0.
+ at 0x........: pthread_cond_wait* (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:147)
+[1/1] cond_pre_wait 0x........
+[1/1] cond_post_wait 0x........
+[1/1] post_mutex_lock error checking mutex 0x........ rc 0 owner 0
+[1/1] cond_signal 0x........
+
+FIXME: can't figure out how to verify wrap of pthread_cond_signal
+
+[1/1] cond_broadcast 0x........
+
+FIXME: can't figure out how to verify wrap of pthread_broadcast_signal
+
+[1/1] mutex_unlock error checking mutex 0x........ rc 0
+
+Mutex not locked: address 0x........, recursion count 0, owner 0.
+ at 0x........: pthread_cond_timedwait* (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:165)
+[1/1] cond_pre_wait 0x........
+[1/1] cond_post_wait 0x........
+[1/1] post_mutex_lock error checking mutex 0x........ rc 0 owner 0
+
+---------------- pthread_rwlock_* ----------------
+
+(1) no error on next line
+(2) no error on next line
+(3) ERROR on next line
+(4) no error on next line
+(5) no error on next line
+(6) no error on next line
+(7) no error on next line
+(8) ERROR on next line
+
+---------------- sem_* ----------------
+
+[1/1] semaphore_init 0x........
+
+FIXME: can't figure out how to verify wrap of sem_destroy
+
+[1/1] semaphore_pre_wait 0x........
+[1/1] semaphore_post_wait 0x........
+
+Invalid semaphore 0x........
+ at 0x........: sem_wait* (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:242)
+[1/1] semaphore_post 0x........
+
+FIXME: can't figure out how to verify wrap of sem_post
+
+[1/1] semaphore_destroy 0x........
+
+------------ dealloc of mem holding locks ------------
+
+[1/1] mutex_destroy error checking mutex 0x........
+[1/1] mutex_destroy invalid mutex 0x........
+[1/1] mutex_destroy invalid mutex 0x........
+[1/1] mutex_init recursive mutex 0x........
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 0
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+
+ERROR SUMMARY: 10 errors from 10 contexts (suppressed: 0 from 0)
|
|
From: <sv...@va...> - 2008-02-29 19:28:14
|
Author: bart
Date: 2008-02-29 19:28:15 +0000 (Fri, 29 Feb 2008)
New Revision: 7511
Log:
Added detection of more types of runtime errors. Cleaned up tracing output. Added test for tracing output (tc20_verifywrap2).
Added:
trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp
trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp2
trunk/exp-drd/tests/tc20_verifywrap2.vgtest
Modified:
trunk/exp-drd/drd_barrier.c
trunk/exp-drd/drd_clientreq.c
trunk/exp-drd/drd_clientreq.h
trunk/exp-drd/drd_cond.c
trunk/exp-drd/drd_error.c
trunk/exp-drd/drd_error.h
trunk/exp-drd/drd_intercepts.c
trunk/exp-drd/drd_main.c
trunk/exp-drd/drd_mutex.c
trunk/exp-drd/drd_mutex.h
trunk/exp-drd/drd_semaphore.c
trunk/exp-drd/drd_track.h
trunk/exp-drd/tests/Makefile.am
trunk/exp-drd/tests/tc18_semabuse.stderr.exp
trunk/exp-drd/tests/tc20_verifywrap.stderr.exp2
Modified: trunk/exp-drd/drd_barrier.c
===================================================================
--- trunk/exp-drd/drd_barrier.c 2008-02-29 19:19:39 UTC (rev 7510)
+++ trunk/exp-drd/drd_barrier.c 2008-02-29 19:28:15 UTC (rev 7511)
@@ -123,8 +123,13 @@
if (p->pre_waiters_left != p->count || p->post_waiters_left != p->count)
{
- VG_(message)(Vg_UserMsg, "Destruction of barrier 0x%lx being waited upon",
- p->a1);
+ BarrierErrInfo bei = { p->a1 };
+ VG_(maybe_record_error)(VG_(get_running_tid)(),
+ BarrierErr,
+ VG_(get_IP)(VG_(get_running_tid)()),
+ "Destruction of barrier that is being waited"
+ " upon",
+ &bei);
}
VG_(OSetGen_ResetIter)(p->oset);
@@ -168,6 +173,14 @@
struct barrier_info*
barrier_init(const Addr barrier, const SizeT size, const Word count)
{
+ if (s_trace_barrier)
+ {
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] barrier_init 0x%lx",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
+ barrier);
+ }
tl_assert(barrier_get(barrier) == 0);
return barrier_get_or_allocate(barrier, size, count);
}
@@ -175,6 +188,14 @@
/** Called after pthread_barrier_destroy(). */
void barrier_destroy(struct barrier_info* const p)
{
+ if (s_trace_barrier)
+ {
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] barrier_destroy 0x%lx",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
+ p->a1);
+ }
tl_assert(p);
drd_clientobj_remove(p->a1, ClientBarrier);
}
@@ -191,9 +212,12 @@
if (s_trace_barrier)
{
- VG_(message)(Vg_DebugMsg,
- "[%d] barrier_pre_wait(%p) iteration %d",
- tid, barrier, p->pre_iteration);
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] barrier_pre_wait 0x%lx iteration %d",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
+ barrier,
+ p->pre_iteration);
}
q = VG_(OSetGen_Lookup)(p->oset, &word_tid);
@@ -218,14 +242,19 @@
void barrier_post_wait(const DrdThreadId tid, const Addr barrier,
const Bool waited)
{
- struct barrier_info* const p = barrier_get(barrier);
+ struct barrier_info* p;
+ p = barrier_get(barrier);
tl_assert(p);
if (s_trace_barrier)
{
- VG_(message)(Vg_DebugMsg, "[%d] barrier_post_wait(%p) iteration %d",
- tid, barrier, p->post_iteration);
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] barrier_post_wait 0x%lx iteration %d",
+ VG_(get_running_tid)(),
+ tid,
+ barrier,
+ p->post_iteration);
}
if (waited)
@@ -241,23 +270,7 @@
{
if (r != q)
{
- if (s_trace_barrier)
- {
- VG_(message)(Vg_DebugMsg,
- "[%d] barrier_post_wait: combining vc of thread %d, "
- "iteration %d",
- tid, r->tid, p->post_iteration);
- vc_print(&thread_get_segment(tid)->vc);
- VG_(printf)(", ");
- vc_print(&r->vc[p->post_iteration]);
- VG_(printf)(" -> ");
- }
thread_combine_vc2(tid, &r->vc[p->post_iteration]);
- if (s_trace_barrier)
- {
- vc_print(&thread_get_segment(tid)->vc);
- VG_(printf)("\n");
- }
}
}
Modified: trunk/exp-drd/drd_clientreq.c
===================================================================
--- trunk/exp-drd/drd_clientreq.c 2008-02-29 19:19:39 UTC (rev 7510)
+++ trunk/exp-drd/drd_clientreq.c 2008-02-29 19:28:15 UTC (rev 7511)
@@ -61,10 +61,11 @@
}
static void drd_post_cond_wait(const Addr cond, const Addr mutex,
- const SizeT size, const MutexT mutex_type)
+ const SizeT size, const MutexT mutex_type,
+ const Bool took_lock)
{
cond_post_wait(cond);
- mutex_post_lock(mutex, size, mutex_type);
+ mutex_post_lock(mutex, size, mutex_type, took_lock);
}
static void drd_pre_cond_signal(const Addr cond)
@@ -144,7 +145,8 @@
break;
case VG_USERREQ__POST_PTHREAD_MUTEX_LOCK:
- drd_post_mutex_lock(thread_get_running_tid(), arg[1], arg[2], arg[3]);
+ drd_post_mutex_lock(thread_get_running_tid(),
+ arg[1], arg[2], arg[3], arg[4]);
break;
case VG_USERREQ__PRE_PTHREAD_MUTEX_UNLOCK:
@@ -170,7 +172,8 @@
case VG_USERREQ__POST_PTHREAD_COND_WAIT:
drd_post_cond_wait(arg[1]/*cond*/, arg[2]/*mutex*/,
- arg[3]/*mutex_size*/, arg[4]/*mutex_type*/);
+ arg[3]/*mutex_size*/, arg[4]/*mutex_type*/,
+ arg[5]/*took_lock*/);
break;
case VG_USERREQ__PRE_PTHREAD_COND_SIGNAL:
Modified: trunk/exp-drd/drd_clientreq.h
===================================================================
--- trunk/exp-drd/drd_clientreq.h 2008-02-29 19:19:39 UTC (rev 7510)
+++ trunk/exp-drd/drd_clientreq.h 2008-02-29 19:28:15 UTC (rev 7511)
@@ -63,7 +63,7 @@
/* args: Addr, SizeT, MutexT */
/* to notify the drd tool of pthread_mutex_lock calls */
VG_USERREQ__POST_PTHREAD_MUTEX_LOCK,
- /* args: Addr, SizeT, MutexT */
+ /* args: Addr, SizeT, MutexT, Bool */
/* to notify the drd tool of pthread_mutex_unlock calls */
VG_USERREQ__PRE_PTHREAD_MUTEX_UNLOCK,
/* args: Addr */
@@ -76,11 +76,11 @@
/* args: Addr */
/* to notify the drd tool of a pthread_cond_destroy call. */
VG_USERREQ__PRE_PTHREAD_COND_DESTROY,
- /* args: Addr cond, SizeT cond_size, Addr mutex, SizeT mutex_size, MutexT mt */
+ /* args: Addr cond, SizeT cond_size, Addr mutex, SizeT mutex_size,MutexT mt*/
VG_USERREQ__PRE_PTHREAD_COND_WAIT,
/* args: Addr cond, SizeT cond_size, Addr mutex, MutexT mt */
VG_USERREQ__POST_PTHREAD_COND_WAIT,
- /* args: Addr cond, Addr mutex, SizeT mutex_size, MutexT mt */
+ /* args: Addr cond, Addr mutex, SizeT mutex_size, MutexT mt, Bool took_lock*/
VG_USERREQ__PRE_PTHREAD_COND_SIGNAL,
/* args: Addr cond */
VG_USERREQ__PRE_PTHREAD_COND_BROADCAST,
Modified: trunk/exp-drd/drd_cond.c
===================================================================
--- trunk/exp-drd/drd_cond.c 2008-02-29 19:19:39 UTC (rev 7510)
+++ trunk/exp-drd/drd_cond.c 2008-02-29 19:28:15 UTC (rev 7511)
@@ -77,10 +77,16 @@
{
struct mutex_info* q;
q = &drd_clientobj_get(p->mutex, ClientMutex)->mutex;
- VG_(message)(Vg_UserMsg,
- "Error: destroying condition variable 0x%lx while thread %d"
- " is waiting on it.\n",
- p->a1, q ? q->owner : -1);
+ tl_assert(q);
+ {
+ CondDestrErrInfo cde = { p->a1, q->a1, q->owner };
+ VG_(maybe_record_error)(VG_(get_running_tid)(),
+ CondDestrErr,
+ VG_(get_IP)(VG_(get_running_tid)()),
+ "Destroying condition variable that is being"
+ " waited upon",
+ &cde);
+ }
}
}
@@ -110,8 +116,11 @@
{
if (s_trace_cond)
{
- VG_(message)(Vg_UserMsg, "Initializing condition variable 0x%lx", cond);
- VG_(get_and_pp_StackTrace)(VG_(get_running_tid)(), VG_(clo_backtrace_size));
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] cond_init 0x%lx",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
+ cond);
}
tl_assert(cond_get(cond) == 0);
tl_assert(size > 0);
@@ -123,8 +132,11 @@
{
if (s_trace_cond)
{
- VG_(message)(Vg_UserMsg, "Destroying condition variable 0x%lx", p->a1);
- VG_(get_and_pp_StackTrace)(VG_(get_running_tid)(), VG_(clo_backtrace_size));
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] cond_destroy 0x%lx",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
+ p->a1);
}
// TO DO: print a proper error message if waiter_count != 0.
@@ -138,7 +150,18 @@
{
struct cond_info* p;
+ if (s_trace_cond)
+ {
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] cond_pre_wait 0x%lx",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
+ cond);
+ }
+
p = cond_get_or_allocate(cond, cond_size);
+ tl_assert(p);
+
if (p->waiter_count == 0)
{
p->mutex = mutex;
@@ -158,6 +181,15 @@
{
struct cond_info* p;
+ if (s_trace_cond)
+ {
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] cond_post_wait 0x%lx",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
+ cond);
+ }
+
p = cond_get(cond);
tl_assert(p);
tl_assert(p->waiter_count > 0);
@@ -169,12 +201,12 @@
return p->waiter_count;
}
-/** Called before pthread_cond_signal(). */
-void cond_pre_signal(Addr const cond)
+static void cond_signal(Addr const cond)
{
const ThreadId vg_tid = VG_(get_running_tid)();
const DrdThreadId drd_tid = VgThreadIdToDrdThreadId(vg_tid);
struct cond_info* const cond_p = cond_get(cond);
+
if (cond_p && cond_p->waiter_count > 0)
{
if (! mutex_is_locked_by(cond_p->mutex, drd_tid))
@@ -196,10 +228,34 @@
}
}
+/** Called before pthread_cond_signal(). */
+void cond_pre_signal(Addr const cond)
+{
+ if (s_trace_cond)
+ {
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] cond_signal 0x%lx",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
+ cond);
+ }
+
+ cond_signal(cond);
+}
+
/** Called before pthread_cond_broadcast(). */
void cond_pre_broadcast(Addr const cond)
{
- cond_pre_signal(cond);
+ if (s_trace_cond)
+ {
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] cond_broadcast 0x%lx",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
+ cond);
+ }
+
+ cond_signal(cond);
}
/** Called after pthread_cond_destroy(). */
Modified: trunk/exp-drd/drd_error.c
===================================================================
--- trunk/exp-drd/drd_error.c 2008-02-29 19:19:39 UTC (rev 7510)
+++ trunk/exp-drd/drd_error.c 2008-02-29 19:28:15 UTC (rev 7511)
@@ -269,25 +269,53 @@
VG_(pp_ExeContext)(VG_(get_error_where)(e));
break;
}
+ case CondErr: {
+ CondErrInfo* cdei =(CondErrInfo*)(VG_(get_error_extra)(e));
+ VG_(message)(Vg_UserMsg,
+ "cond 0x%lx: %s",
+ cdei->cond,
+ VG_(get_error_string)(e));
+ VG_(pp_ExeContext)(VG_(get_error_where)(e));
+ break;
+ }
case CondRaceErr: {
CondRaceErrInfo* cei = (CondRaceErrInfo*)(VG_(get_error_extra)(e));
VG_(message)(Vg_UserMsg,
- "Race condition: condition variable 0x%lx has been signalled"
- " but the associated mutex 0x%lx is not locked by the"
- " signalling thread",
+ "Race condition: condition variable 0x%lx has been"
+ " signalled but the associated mutex 0x%lx is not locked"
+ " by the signalling thread",
cei->cond, cei->mutex);
VG_(pp_ExeContext)(VG_(get_error_where)(e));
break;
}
- case CondErr: {
- CondErrInfo* cdei =(CondErrInfo*)(VG_(get_error_extra)(e));
+ case CondDestrErr: {
+ CondDestrErrInfo* cdi = (CondDestrErrInfo*)(VG_(get_error_extra)(e));
VG_(message)(Vg_UserMsg,
- "cond 0x%lx: %s",
- cdei->cond,
- VG_(get_error_string)(e));
+ "%s: cond 0x%lx, mutex 0x%lx locked by thread %d",
+ cdi->cond, cdi->mutex, cdi->tid);
VG_(pp_ExeContext)(VG_(get_error_where)(e));
break;
}
+ case SemaphoreErr: {
+ SemaphoreErrInfo* sei =(SemaphoreErrInfo*)(VG_(get_error_extra)(e));
+ tl_assert(sei);
+ VG_(message)(Vg_UserMsg,
+ "%s 0x%lx",
+ VG_(get_error_string)(e),
+ sei->semaphore);
+ VG_(pp_ExeContext)(VG_(get_error_where)(e));
+ break;
+ }
+ case BarrierErr: {
+ BarrierErrInfo* sei =(BarrierErrInfo*)(VG_(get_error_extra)(e));
+ tl_assert(sei);
+ VG_(message)(Vg_UserMsg,
+ "%s: barrier 0x%lx",
+ VG_(get_error_string)(e),
+ sei->barrier);
+ VG_(pp_ExeContext)(VG_(get_error_where)(e));
+ break;
+ }
case GenericErr: {
//GenericErrInfo* gei =(GenericErrInfo*)(VG_(get_error_extra)(e));
VG_(message)(Vg_UserMsg, "%s", VG_(get_error_string)(e));
@@ -311,10 +339,16 @@
return sizeof(DataRaceErrInfo);
case MutexErr:
return sizeof(MutexErrInfo);
+ case CondErr:
+ return sizeof(CondErrInfo);
case CondRaceErr:
return sizeof(CondRaceErrInfo);
- case CondErr:
- return sizeof(CondErrInfo);
+ case CondDestrErr:
+ return sizeof(CondDestrErrInfo);
+ case SemaphoreErr:
+ return sizeof(SemaphoreErrInfo);
+ case BarrierErr:
+ return sizeof(BarrierErrInfo);
case GenericErr:
return sizeof(GenericErrInfo);
default:
Modified: trunk/exp-drd/drd_error.h
===================================================================
--- trunk/exp-drd/drd_error.h 2008-02-29 19:19:39 UTC (rev 7510)
+++ trunk/exp-drd/drd_error.h 2008-02-29 19:28:15 UTC (rev 7511)
@@ -39,9 +39,12 @@
typedef enum {
DataRaceErr = 1,
MutexErr = 2,
- CondRaceErr = 3,
- CondErr = 4,
- GenericErr = 5,
+ CondErr = 3,
+ CondRaceErr = 4,
+ CondDestrErr = 5,
+ SemaphoreErr = 6,
+ BarrierErr = 7,
+ GenericErr = 8,
} DrdErrorKind;
/* The classification of a faulting address. */
@@ -88,14 +91,28 @@
typedef struct {
Addr cond;
+} CondErrInfo;
+
+typedef struct {
+ Addr cond;
Addr mutex;
} CondRaceErrInfo;
typedef struct {
- Addr cond;
-} CondErrInfo;
+ Addr cond;
+ Addr mutex;
+ DrdThreadId tid;
+} CondDestrErrInfo;
typedef struct {
+ Addr semaphore;
+} SemaphoreErrInfo;
+
+typedef struct {
+ Addr barrier;
+} BarrierErrInfo;
+
+typedef struct {
} GenericErrInfo;
void describe_addr(Addr const a, SizeT const len, AddrInfo* const ai);
Modified: trunk/exp-drd/drd_intercepts.c
===================================================================
--- trunk/exp-drd/drd_intercepts.c 2008-02-29 19:19:39 UTC (rev 7510)
+++ trunk/exp-drd/drd_intercepts.c 2008-02-29 19:28:15 UTC (rev 7511)
@@ -343,9 +343,9 @@
write(1, "", 0);
#endif
CALL_FN_W_W(ret, fn, mutex);
- if (ret == 0)
- VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__POST_PTHREAD_MUTEX_LOCK,
- mutex, sizeof(*mutex), mutex_type(mutex), 0, 0);
+ VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__POST_PTHREAD_MUTEX_LOCK,
+ mutex, sizeof(*mutex), mutex_type(mutex),
+ ret == 0, 0);
return ret;
}
@@ -358,11 +358,9 @@
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
CALL_FN_W_W(ret, fn, mutex);
- if (ret == 0)
- {
- VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_PTHREAD_MUTEX_LOCK,
- mutex, sizeof(*mutex), mutex_type(mutex), 0, 0);
- }
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_PTHREAD_MUTEX_LOCK,
+ mutex, sizeof(*mutex), mutex_type(mutex),
+ ret == 0, 0);
return ret;
}
@@ -376,11 +374,9 @@
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
CALL_FN_W_WW(ret, fn, mutex, abs_timeout);
- if (ret == 0)
- {
- VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_PTHREAD_MUTEX_LOCK,
- mutex, sizeof(*mutex), mutex_type(mutex), 0, 0);
- }
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_PTHREAD_MUTEX_LOCK,
+ mutex, sizeof(*mutex), mutex_type(mutex),
+ ret == 0, 0);
return ret;
}
@@ -438,10 +434,12 @@
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_PTHREAD_COND_WAIT,
- cond, sizeof(*cond), mutex, mutex_type(mutex), 0);
+ cond, sizeof(*cond), mutex, mutex_type(mutex),
+ 0);
CALL_FN_W_WW(ret, fn, cond, mutex);
VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_PTHREAD_COND_WAIT,
- cond, mutex, sizeof(*mutex), mutex_type(mutex), 0);
+ cond, mutex, sizeof(*mutex), mutex_type(mutex),
+ ret == 0);
return ret;
}
@@ -456,10 +454,12 @@
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_PTHREAD_COND_WAIT,
- cond, sizeof(*cond), mutex, mutex_type(mutex), 0);
+ cond, sizeof(*cond), mutex, mutex_type(mutex),
+ 0);
CALL_FN_W_WWW(ret, fn, cond, mutex, abstime);
VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_PTHREAD_COND_WAIT,
- cond, mutex, sizeof(*mutex), mutex_type(mutex), 0);
+ cond, mutex, sizeof(*mutex), mutex_type(mutex),
+ ret == 0);
return ret;
}
@@ -531,12 +531,9 @@
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
CALL_FN_W_W(ret, fn, spinlock);
- if (ret == 0)
- {
- VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_PTHREAD_MUTEX_LOCK,
- spinlock, sizeof(*spinlock),
- mutex_type_spinlock, 0, 0);
- }
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_PTHREAD_MUTEX_LOCK,
+ spinlock, sizeof(*spinlock),
+ mutex_type_spinlock, ret == 0, 0);
return ret;
}
@@ -549,12 +546,9 @@
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
CALL_FN_W_W(ret, fn, spinlock);
- if (ret == 0)
- {
- VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_PTHREAD_MUTEX_LOCK,
- spinlock, sizeof(*spinlock),
- mutex_type_spinlock, 0, 0);
- }
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_PTHREAD_MUTEX_LOCK,
+ spinlock, sizeof(*spinlock),
+ mutex_type_spinlock, ret == 0, 0);
return ret;
}
Modified: trunk/exp-drd/drd_main.c
===================================================================
--- trunk/exp-drd/drd_main.c 2008-02-29 19:19:39 UTC (rev 7510)
+++ trunk/exp-drd/drd_main.c 2008-02-29 19:28:15 UTC (rev 7511)
@@ -428,9 +428,10 @@
void drd_post_mutex_lock(const DrdThreadId drd_tid,
const Addr mutex,
const SizeT size,
- const MutexT mutex_type)
+ const MutexT mutex_type,
+ const Bool took_lock)
{
- mutex_post_lock(mutex, size, mutex_type);
+ mutex_post_lock(mutex, size, mutex_type, took_lock);
}
void drd_pre_mutex_unlock(const DrdThreadId drd_tid,
Modified: trunk/exp-drd/drd_mutex.c
===================================================================
--- trunk/exp-drd/drd_mutex.c 2008-02-29 19:19:39 UTC (rev 7510)
+++ trunk/exp-drd/drd_mutex.c 2008-02-29 19:28:15 UTC (rev 7511)
@@ -78,11 +78,10 @@
{
if (s_trace_mutex)
{
- const ThreadId vg_tid = VG_(get_running_tid)();
- const DrdThreadId drd_tid = VgThreadIdToDrdThreadId(vg_tid);
- VG_(message)(Vg_DebugMsg,
- "drd_pre_mutex_destroy tid = %d/%d, %s 0x%lx",
- vg_tid, drd_tid,
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] mutex_destroy %s 0x%lx",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
mutex_get_typename(p),
p->a1);
}
@@ -133,6 +132,12 @@
return p;
}
+struct mutex_info* mutex_get(const Addr mutex)
+{
+ tl_assert(offsetof(DrdClientobj, mutex) == 0);
+ return &drd_clientobj_get(mutex, ClientMutex)->mutex;
+}
+
struct mutex_info*
mutex_init(const Addr mutex, const SizeT size, const MutexT mutex_type)
{
@@ -140,11 +145,10 @@
if (s_trace_mutex)
{
- const ThreadId vg_tid = VG_(get_running_tid)();
- const DrdThreadId drd_tid = VgThreadIdToDrdThreadId(vg_tid);
- VG_(message)(Vg_DebugMsg,
- "drd_post_mutex_init tid = %d/%d, %s 0x%lx",
- vg_tid, drd_tid,
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] mutex_init %s 0x%lx",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
mutex_type_name(mutex_type),
mutex);
}
@@ -185,12 +189,6 @@
}
}
-struct mutex_info* mutex_get(const Addr mutex)
-{
- tl_assert(offsetof(DrdClientobj, mutex) == 0);
- return &drd_clientobj_get(mutex, ClientMutex)->mutex;
-}
-
/** Called before pthread_mutex_lock() is invoked. If a data structure for
* the client-side object was not yet created, do this now. Also check whether
* an attempt is made to lock recursively a synchronization object that must
@@ -227,17 +225,17 @@
* Note: this function must be called after pthread_mutex_lock() has been
* called, or a race condition is triggered !
*/
-int mutex_post_lock(const Addr mutex, const SizeT size, MutexT mutex_type)
+int mutex_post_lock(const Addr mutex, const SizeT size, MutexT mutex_type,
+ const Bool took_lock)
{
- const DrdThreadId drd_tid = VgThreadIdToDrdThreadId(VG_(get_running_tid)());
+ const DrdThreadId drd_tid = thread_get_running_tid();
struct mutex_info* const p = mutex_get_or_allocate(mutex, size, mutex_type);
if (s_trace_mutex)
{
- const ThreadId tid = DrdThreadIdToVgThreadId(drd_tid);
- VG_(message)(Vg_DebugMsg,
- "drd_post_mutex_lock tid = %d/%d, %s 0x%lx rc %d owner %d",
- tid,
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] post_mutex_lock %s 0x%lx rc %d owner %d",
+ VG_(get_running_tid)(),
drd_tid,
mutex_get_typename(p),
mutex,
@@ -266,10 +264,8 @@
return 0;
}
-#if 0
- tl_assert(mutex_type == mutex_type_mutex
- || mutex_type == mutex_type_spinlock);
-#endif
+ if (! took_lock)
+ return p->recursion_count;
tl_assert(p->mutex_type == mutex_type);
tl_assert(p->a2 - p->a1 == size);
@@ -281,7 +277,7 @@
}
else if (p->owner != drd_tid)
{
- VG_(message)(Vg_DebugMsg,
+ VG_(message)(Vg_UserMsg,
"The impossible happened: mutex 0x%lx is locked"
" simultaneously by two threads (recursion count %d,"
" owners %d and %d) !",
@@ -320,9 +316,10 @@
if (s_trace_mutex && p != 0)
{
- VG_(message)(Vg_DebugMsg,
- "drd_pre_mutex_unlock tid = %d/%d, %s 0x%lx rc %d",
- vg_tid, drd_tid,
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] mutex_unlock %s 0x%lx rc %d",
+ vg_tid,
+ drd_tid,
mutex_get_typename(p),
mutex,
p->recursion_count,
@@ -364,7 +361,7 @@
tl_assert(p);
if (p->mutex_type != mutex_type)
{
- VG_(message)(Vg_DebugMsg, "??? mutex %p: type changed from %d into %d",
+ VG_(message)(Vg_UserMsg, "??? mutex %p: type changed from %d into %d",
p->a1, p->mutex_type, mutex_type);
}
tl_assert(p->mutex_type == mutex_type);
Modified: trunk/exp-drd/drd_mutex.h
===================================================================
--- trunk/exp-drd/drd_mutex.h 2008-02-29 19:19:39 UTC (rev 7510)
+++ trunk/exp-drd/drd_mutex.h 2008-02-29 19:28:15 UTC (rev 7511)
@@ -44,8 +44,10 @@
const MutexT mutex_type);
void mutex_post_destroy(const Addr mutex);
struct mutex_info* mutex_get(const Addr mutex);
-void mutex_pre_lock(const Addr mutex, const SizeT size, const MutexT mutex_type);
-int mutex_post_lock(const Addr mutex, const SizeT size, const MutexT mutex_type);
+void mutex_pre_lock(const Addr mutex, const SizeT size,
+ const MutexT mutex_type);
+int mutex_post_lock(const Addr mutex, const SizeT size,
+ const MutexT mutex_type, const Bool took_lock);
int mutex_unlock(const Addr mutex, const MutexT mutex_type);
const char* mutex_get_typename(struct mutex_info* const p);
const char* mutex_type_name(const MutexT mt);
Modified: trunk/exp-drd/drd_semaphore.c
===================================================================
--- trunk/exp-drd/drd_semaphore.c 2008-02-29 19:19:39 UTC (rev 7510)
+++ trunk/exp-drd/drd_semaphore.c 2008-02-29 19:28:15 UTC (rev 7511)
@@ -78,8 +78,13 @@
{
if (p->waiters > 0)
{
- VG_(message)(Vg_UserMsg, "Error: destroying semaphore while %d threads are"
- "still waiting on the semaphore.\n", p->waiters);
+ SemaphoreErrInfo sei = { p->a1 };
+ VG_(maybe_record_error)(VG_(get_running_tid)(),
+ SemaphoreErr,
+ VG_(get_IP)(VG_(get_running_tid)()),
+ "Destruction of semaphore that is being waited"
+ " upon",
+ &sei);
}
vc_cleanup(&p->vc);
}
@@ -114,6 +119,14 @@
{
struct semaphore_info* p;
+ if (s_trace_semaphore)
+ {
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] semaphore_init 0x%lx",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
+ semaphore);
+ }
tl_assert(semaphore_get(semaphore) == 0);
p = semaphore_get_or_allocate(semaphore, size);
p->value = value;
@@ -123,6 +136,17 @@
/** Called after sem_destroy(). */
void semaphore_destroy(struct semaphore_info* const p)
{
+ tl_assert(p);
+
+ if (s_trace_semaphore)
+ {
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] semaphore_destroy 0x%lx",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
+ p->a1);
+ }
+
drd_clientobj_remove(p->a1, ClientSemaphore);
}
@@ -134,7 +158,11 @@
p = semaphore_get_or_allocate(semaphore, size);
if (s_trace_semaphore)
{
- VG_(message)(Vg_UserMsg, "semaphore_pre_wait(0x%lx, %d)", semaphore, size);
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] semaphore_pre_wait 0x%lx",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
+ semaphore);
}
tl_assert(p);
tl_assert(p->waiters >= 0);
@@ -154,7 +182,11 @@
p = semaphore_get(semaphore);
if (s_trace_semaphore)
{
- VG_(message)(Vg_UserMsg, "semaphore_post_wait(0x%lx, %d)", semaphore);
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] semaphore_post_wait 0x%lx",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
+ semaphore);
}
tl_assert(p->waiters > 0);
p->waiters--;
@@ -162,7 +194,12 @@
tl_assert(p->value >= 0);
if (p->value == 0)
{
- VG_(message)(Vg_UserMsg, "Invalid semaphore 0x%lx", semaphore);
+ SemaphoreErrInfo sei = { semaphore };
+ VG_(maybe_record_error)(VG_(get_running_tid)(),
+ SemaphoreErr,
+ VG_(get_IP)(VG_(get_running_tid)()),
+ "Invalid semaphore",
+ &sei);
return;
}
p->value--;
@@ -178,6 +215,14 @@
{
struct semaphore_info* p;
+ if (s_trace_semaphore)
+ {
+ VG_(message)(Vg_UserMsg,
+ "[%d/%d] semaphore_post 0x%lx",
+ VG_(get_running_tid)(),
+ thread_get_running_tid(),
+ semaphore);
+ }
p = semaphore_get_or_allocate(semaphore, size);
p->value++;
if (p->value == 1)
Modified: trunk/exp-drd/drd_track.h
===================================================================
--- trunk/exp-drd/drd_track.h 2008-02-29 19:19:39 UTC (rev 7510)
+++ trunk/exp-drd/drd_track.h 2008-02-29 19:28:15 UTC (rev 7511)
@@ -30,7 +30,7 @@
void drd_pre_mutex_lock(DrdThreadId tid, Addr mutex, const SizeT size,
const MutexT mutex_type);
void drd_post_mutex_lock(DrdThreadId tid, Addr mutex, const SizeT size,
- const MutexT mutex_type);
+ const MutexT mutex_type, const Bool took_lock);
void drd_pre_mutex_unlock(const DrdThreadId tid, const Addr mutex,
const MutexT mutex_type);
Modified: trunk/exp-drd/tests/Makefile.am
===================================================================
--- trunk/exp-drd/tests/Makefile.am 2008-02-29 19:19:39 UTC (rev 7510)
+++ trunk/exp-drd/tests/Makefile.am 2008-02-29 19:28:15 UTC (rev 7511)
@@ -91,8 +91,9 @@
tc19_shadowmem.vgtest \
tc19_shadowmem.stderr.exp \
tc20_verifywrap.vgtest \
- tc20_verifywrap.stderr.exp \
- tc20_verifywrap.stderr.exp2 \
+ tc20_verifywrap.stderr.exp tc20_verifywrap.stderr.exp2 \
+ tc20_verifywrap2.vgtest \
+ tc20_verifywrap2.stderr.exp tc20_verifywrap2.stderr.exp2\
tc21_pthonce.vgtest \
tc21_pthonce.stderr.exp tc21_pthonce.stdout.exp \
tc22_exit_w_lock.vgtest \
Modified: trunk/exp-drd/tests/tc18_semabuse.stderr.exp
===================================================================
--- trunk/exp-drd/tests/tc18_semabuse.stderr.exp 2008-02-29 19:19:39 UTC (rev 7510)
+++ trunk/exp-drd/tests/tc18_semabuse.stderr.exp 2008-02-29 19:28:15 UTC (rev 7511)
@@ -1,3 +1,6 @@
+Invalid semaphore 0x........
+ at 0x........: sem_wait* (drd_intercepts.c:?)
+ by 0x........: main (tc18_semabuse.c:34)
-ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Modified: trunk/exp-drd/tests/tc20_verifywrap.stderr.exp2
===================================================================
--- trunk/exp-drd/tests/tc20_verifywrap.stderr.exp2 2008-02-29 19:19:39 UTC (rev 7510)
+++ trunk/exp-drd/tests/tc20_verifywrap.stderr.exp2 2008-02-29 19:28:15 UTC (rev 7511)
@@ -21,6 +21,18 @@
by 0x........: main (tc20_verifywrap.c:102)
Invalid mutex
+ at 0x........: pthread_mutex_lock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:108)
+
+Invalid mutex
+ at 0x........: pthread_mutex_trylock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:116)
+
+Invalid mutex
+ at 0x........: pthread_mutex_timedlock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:121)
+
+Invalid mutex
at 0x........: pthread_mutex_unlock (drd_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:125)
@@ -41,6 +53,10 @@
FIXME: can't figure out how to verify wrap of pthread_broadcast_signal
+Mutex not locked: address 0x........, recursion count 0, owner 0.
+ at 0x........: pthread_cond_timedwait* (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:165)
+
---------------- pthread_rwlock_* ----------------
(1) no error on next line
@@ -58,6 +74,10 @@
FIXME: can't figure out how to verify wrap of sem_destroy
+Invalid semaphore 0x........
+ at 0x........: sem_wait* (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:242)
+
FIXME: can't figure out how to verify wrap of sem_post
@@ -67,4 +87,4 @@
Destroying locked mutex: address 0x........, recursion count 1, owner 1.
at 0x........: main (tc20_verifywrap.c:262)
-ERROR SUMMARY: 6 errors from 6 contexts (suppressed: 0 from 0)
+ERROR SUMMARY: 10 errors from 10 contexts (suppressed: 0 from 0)
Added: trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp
===================================================================
Added: trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp2
===================================================================
--- trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp2 (rev 0)
+++ trunk/exp-drd/tests/tc20_verifywrap2.stderr.exp2 2008-02-29 19:28:15 UTC (rev 7511)
@@ -0,0 +1,151 @@
+
+
+
+------ This is output for >= glibc 2.4 ------
+
+---------------- pthread_create/join ----------------
+
+[1/1] mutex_init recursive mutex 0x........
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 0
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+Conflicting store by thread 1 at 0x........ size 2
+ at 0x........: main (tc20_verifywrap.c:78)
+Allocation context: unknown
+Other segment start (thread 2)
+ (thread finished, call stack no longer available)
+Other segment end (thread 2)
+ (thread finished, call stack no longer available)
+
+---------------- pthread_mutex_lock et al ----------------
+
+[1/1] mutex_init invalid mutex 0x........
+[1/1] mutex_init mutex 0x........
+[1/1] post_mutex_lock mutex 0x........ rc 0 owner 0
+[1/1] mutex_destroy mutex 0x........
+
+Destroying locked mutex: address 0x........, recursion count 1, owner 1.
+ at 0x........: pthread_mutex_destroy (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:102)
+[1/1] mutex_init invalid mutex 0x........
+[1/1] post_mutex_lock invalid mutex 0x........ rc 0 owner 0
+
+Invalid mutex
+ at 0x........: pthread_mutex_lock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:108)
+[1/1] post_mutex_lock invalid mutex 0x........ rc 0 owner 0
+
+Invalid mutex
+ at 0x........: pthread_mutex_trylock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:116)
+[1/1] post_mutex_lock invalid mutex 0x........ rc 0 owner 0
+
+Invalid mutex
+ at 0x........: pthread_mutex_timedlock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:121)
+[1/1] mutex_unlock invalid mutex 0x........ rc 0
+
+Invalid mutex
+ at 0x........: pthread_mutex_unlock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:125)
+
+Mutex not locked: address 0x........, recursion count 0, owner 0.
+ at 0x........: pthread_mutex_unlock (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:125)
+
+---------------- pthread_cond_wait et al ----------------
+
+[1/1] mutex_init error checking mutex 0x........
+[1/1] cond_init 0x........
+[1/1] mutex_unlock error checking mutex 0x........ rc 0
+
+Mutex not locked: address 0x........, recursion count 0, owner 0.
+ at 0x........: pthread_cond_wait* (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:147)
+[1/1] cond_pre_wait 0x........
+[1/1] cond_post_wait 0x........
+[1/1] post_mutex_lock error checking mutex 0x........ rc 0 owner 0
+[1/1] cond_signal 0x........
+
+FIXME: can't figure out how to verify wrap of pthread_cond_signal
+
+[1/1] cond_broadcast 0x........
+
+FIXME: can't figure out how to verify wrap of pthread_broadcast_signal
+
+[1/1] mutex_unlock error checking mutex 0x........ rc 0
+
+Mutex not locked: address 0x........, recursion count 0, owner 0.
+ at 0x........: pthread_cond_timedwait* (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:165)
+[1/1] cond_pre_wait 0x........
+[1/1] cond_post_wait 0x........
+[1/1] post_mutex_lock error checking mutex 0x........ rc 0 owner 0
+
+---------------- pthread_rwlock_* ----------------
+
+(1) no error on next line
+(2) no error on next line
+(3) ERROR on next line
+(4) no error on next line
+(5) no error on next line
+(6) no error on next line
+(7) no error on next line
+(8) ERROR on next line
+
+---------------- sem_* ----------------
+
+[1/1] semaphore_init 0x........
+
+FIXME: can't figure out how to verify wrap of sem_destroy
+
+[1/1] semaphore_pre_wait 0x........
+[1/1] semaphore_post_wait 0x........
+
+Invalid semaphore 0x........
+ at 0x........: sem_wait* (drd_intercepts.c:?)
+ by 0x........: main (tc20_verifywrap.c:242)
+[1/1] semaphore_post 0x........
+
+FIXME: can't figure out how to verify wrap of sem_post
+
+[1/1] semaphore_destroy 0x........
+
+------------ dealloc of mem holding locks ------------
+
+[1/1] mutex_destroy error checking mutex 0x........
+[1/1] mutex_destroy invalid mutex 0x........
+[1/1] mutex_destroy invalid mutex 0x........
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_unlock recursive mutex 0x........ rc 1
+
+ERROR SUMMARY: 10 errors from 10 contexts (suppressed: 0 from 0)
Added: trunk/exp-drd/tests/tc20_verifywrap2.vgtest
===================================================================
--- trunk/exp-drd/tests/tc20_verifywrap2.vgtest (rev 0)
+++ trunk/exp-drd/tests/tc20_verifywrap2.vgtest 2008-02-29 19:28:15 UTC (rev 7511)
@@ -0,0 +1,2 @@
+prog: tc20_verifywrap
+vgopts: --trace-mutex=yes --trace-cond=yes --trace-semaphore=yes
|
|
From: <sv...@va...> - 2008-02-29 19:19:35
|
Author: bart
Date: 2008-02-29 19:19:39 +0000 (Fri, 29 Feb 2008)
New Revision: 7510
Log:
Removed debugging code.
Modified:
trunk/exp-drd/drd_clientobj.c
Modified: trunk/exp-drd/drd_clientobj.c
===================================================================
--- trunk/exp-drd/drd_clientobj.c 2008-02-29 19:17:28 UTC (rev 7509)
+++ trunk/exp-drd/drd_clientobj.c 2008-02-29 19:19:39 UTC (rev 7510)
@@ -104,11 +104,7 @@
tl_assert(a1 < a2 && a1 + 4096 > a2);
tl_assert(! drd_clientobj_present(a1, a2));
tl_assert(VG_(OSetGen_Lookup)(s_clientobj, &a1) == 0);
-#if 0
- VG_(message)(Vg_DebugMsg,
- "registering client obj [0x%lx,0x%lx[ of type %d",
- a1, a2, t);
-#endif
+
p = VG_(OSetGen_AllocNode)(s_clientobj, sizeof(*p));
VG_(memset)(p, 0, sizeof(*p));
p->any.a1 = a1;
@@ -129,10 +125,6 @@
p = VG_(OSetGen_Remove)(s_clientobj, &addr);
if (p)
{
-#if 0
- VG_(message)(Vg_DebugMsg, "removing client obj [0x%lx,0x%lx[ of type %d",
- p->any.a1, p->any.a2, p->any.type);
-#endif
tl_assert(VG_(OSetGen_Lookup)(s_clientobj, &addr) == 0);
drd_finish_suppression(p->any.a1, p->any.a2);
tl_assert(p->any.cleanup);
@@ -148,10 +140,6 @@
Addr removed_at;
DrdClientobj* p;
-#if 0
- VG_(message)(Vg_DebugMsg, "drd_clientobj_stop_using_mem [0x%lx,0x%lx[",
- a1, a2);
-#endif
tl_assert(s_clientobj);
VG_(OSetGen_ResetIter)(s_clientobj);
p = VG_(OSetGen_Next)(s_clientobj);
@@ -160,14 +148,10 @@
if ((a1 <= p->any.a1 && p->any.a1 < a2)
|| (a1 < p->any.a2 && p->any.a2 <= a2))
{
-#if 0
- VG_(message)(Vg_DebugMsg, "drd_clientobj_stop_using_mem [0x%lx,0x%lx[",
- a1, a2);
-#endif
removed_at = p->any.a1;
drd_clientobj_remove(p->any.a1, p->any.type);
- /* The above call removes an element from the oset and hence invalidates */
- /* the iterator. Set the iterator back. */
+ /* The above call removes an element from the oset and hence */
+ /* invalidates the iterator. Set the iterator back. */
VG_(OSetGen_ResetIter)(s_clientobj);
while ((p = VG_(OSetGen_Next)(s_clientobj)) != 0
&& p->any.a1 <= removed_at)
|
|
From: <sv...@va...> - 2008-02-29 19:17:26
|
Author: bart
Date: 2008-02-29 19:17:28 +0000 (Fri, 29 Feb 2008)
New Revision: 7509
Log:
Converted type of trace messages from Vg_DebugMsg to Vg_UserMsg.
Modified:
trunk/exp-drd/drd_segment.c
Modified: trunk/exp-drd/drd_segment.c
===================================================================
--- trunk/exp-drd/drd_segment.c 2008-02-29 17:27:03 UTC (rev 7508)
+++ trunk/exp-drd/drd_segment.c 2008-02-29 19:17:28 UTC (rev 7509)
@@ -85,7 +85,7 @@
creator);
vc_snprint(msg + VG_(strlen)(msg), sizeof(msg) - VG_(strlen)(msg),
&sg->vc);
- VG_(message)(Vg_DebugMsg, "%s", msg);
+ VG_(message)(Vg_UserMsg, "%s", msg);
}
}
@@ -122,7 +122,7 @@
"Discarding the segment with vector clock ");
vc_snprint(msg + VG_(strlen)(msg), sizeof(msg) - VG_(strlen)(msg),
&sg->vc);
- VG_(message)(Vg_DebugMsg, "%s", msg);
+ VG_(message)(Vg_UserMsg, "%s", msg);
}
#endif
|
|
From: <sv...@va...> - 2008-02-29 17:27:03
|
Author: bart
Date: 2008-02-29 17:27:03 +0000 (Fri, 29 Feb 2008)
New Revision: 7508
Log:
Eliminated upper bounds on the number of condition variables, semaphores and barriers. Added command-line option --trace-semaphore.
Modified:
trunk/exp-drd/TODO.txt
trunk/exp-drd/drd_barrier.c
trunk/exp-drd/drd_barrier.h
trunk/exp-drd/drd_clientobj.c
trunk/exp-drd/drd_clientobj.h
trunk/exp-drd/drd_clientreq.c
trunk/exp-drd/drd_clientreq.h
trunk/exp-drd/drd_cond.c
trunk/exp-drd/drd_cond.h
trunk/exp-drd/drd_intercepts.c
trunk/exp-drd/drd_main.c
trunk/exp-drd/drd_mutex.c
trunk/exp-drd/drd_semaphore.c
trunk/exp-drd/drd_semaphore.h
trunk/exp-drd/drd_track.h
Modified: trunk/exp-drd/TODO.txt
===================================================================
--- trunk/exp-drd/TODO.txt 2008-02-29 13:15:57 UTC (rev 7507)
+++ trunk/exp-drd/TODO.txt 2008-02-29 17:27:03 UTC (rev 7508)
@@ -8,8 +8,6 @@
- Print an error message when memory is freed that contains a locked
reader-writer synchronization object.
- Print an error message when a semaphore is freed that is being waited upon.
-- Eliminate the upper bounds on the number of condition variables,
- semaphores, barriers and threads by converting arrays into OSet's.
- Implement segment merging, such that the number of segments per thread
remains limited even when there is no synchronization between threads.
- Add locking order checking.
@@ -33,6 +31,9 @@
a crash on AMD64. Is this an exp-drd or a VEX bug ?
- On x86 and amd64 platforms, add support for implicit locking arising from
the use of the LOCK instruction prefix.
+- Add test programs for freeing memory that contains a condition variable /
+ destroying a condition variable being waited upon.
+- Convert the array in drd_thread.c with thread information into an OSet.
Testing
Modified: trunk/exp-drd/drd_barrier.c
===================================================================
--- trunk/exp-drd/drd_barrier.c 2008-02-29 13:15:57 UTC (rev 7507)
+++ trunk/exp-drd/drd_barrier.c 2008-02-29 17:27:03 UTC (rev 7508)
@@ -24,6 +24,7 @@
#include "drd_barrier.h"
+#include "drd_clientobj.h"
#include "drd_error.h"
#include "drd_suppression.h"
#include "priv_drd_clientreq.h"
@@ -38,19 +39,6 @@
// Type definitions.
-/* Information associated with a client-side pthread_barrier_t object. */
-struct barrier_info
-{
- Addr barrier; // Client address of barrier.
- SizeT size; // Size in bytes of client-side object.
- Word count; // Participant count in a barrier wait.
- Word pre_iteration; // pthread_barrier_wait() call count modulo two.
- Word post_iteration; // pthread_barrier_wait() call count modulo two.
- Word pre_waiters_left; // number of waiters left for a complete barrier.
- Word post_waiters_left; // number of waiters left for a complete barrier.
- OSet* oset; // Thread-specific barrier information.
-};
-
/* Information associated with one thread participating in a barrier. */
struct barrier_thread_info
{
@@ -62,11 +50,14 @@
};
+// Local functions.
+
+void barrier_cleanup(struct barrier_info* p);
+
+
// Local variables.
static Bool s_trace_barrier = False;
-/* To do: eliminate the upper limit on the number of barriers (4). */
-struct barrier_info s_barrier[4];
// Function definitions.
@@ -106,9 +97,10 @@
tl_assert(barrier != 0);
tl_assert(size > 0);
tl_assert(count > 0);
+ tl_assert(p->a1 == barrier);
+ tl_assert(p->a2 - p->a1 == size);
- p->barrier = barrier;
- p->size = size;
+ p->cleanup = (void(*)(DrdClientobj*))barrier_cleanup;
p->count = count;
p->pre_iteration = 0;
p->post_iteration = 0;
@@ -120,14 +112,20 @@
p->oset = VG_(OSetGen_Create)(0, 0, VG_(malloc), VG_(free));
}
-/** Deallocate the memory allocated by barrier_initialize() and in p->oset. */
-void barrier_destroy(struct barrier_info* const p)
+/** Deallocate the memory allocated by barrier_initialize() and in p->oset.
+ * Called by drd_clientobj_destroy().
+ */
+void barrier_cleanup(struct barrier_info* p)
{
struct barrier_thread_info* q;
tl_assert(p);
- drd_finish_suppression(p->barrier, p->barrier + p->size);
+ if (p->pre_waiters_left != p->count || p->post_waiters_left != p->count)
+ {
+ VG_(message)(Vg_UserMsg, "Destruction of barrier 0x%lx being waited upon",
+ p->a1);
+ }
VG_(OSetGen_ResetIter)(p->oset);
for ( ; (q = VG_(OSetGen_Next)(p->oset)) != 0; )
@@ -135,13 +133,6 @@
barrier_thread_destroy(q);
}
VG_(OSetGen_Destroy)(p->oset);
- p->barrier = 0;
- p->size = 0;
- p->count = 0;
- p->pre_iteration = 0;
- p->post_iteration = 0;
- p->pre_waiters_left = 0;
- p->post_waiters_left = 0;
}
/** Look up the client-side barrier address barrier in s_barrier[]. If not
@@ -150,31 +141,30 @@
struct barrier_info*
barrier_get_or_allocate(const Addr barrier, const SizeT size, const Word count)
{
- int i;
+ struct barrier_info *p;
- for (i = 0; i < sizeof(s_barrier)/sizeof(s_barrier[0]); i++)
+ tl_assert(offsetof(DrdClientobj, barrier) == 0);
+ p = &drd_clientobj_get(barrier, ClientBarrier)->barrier;
+ if (p == 0)
{
- if (s_barrier[i].barrier == barrier)
- {
- tl_assert(s_barrier[i].size == size);
- return &s_barrier[i];
- }
+ p = &drd_clientobj_add(barrier, barrier + size, ClientBarrier)->barrier;
+ barrier_initialize(p, barrier, size, count);
}
- for (i = 0; i < sizeof(s_barrier)/sizeof(s_barrier[0]); i++)
- {
- if (s_barrier[i].barrier == 0)
- {
- barrier_initialize(&s_barrier[i], barrier, size, count);
- drd_start_suppression(barrier, barrier + size, "barrier");
- return &s_barrier[i];
- }
- }
- tl_assert(0);
- return 0;
+ return p;
}
+/** Look up the address of the information associated with the client-side
+ * barrier object. */
+struct barrier_info* barrier_get(const Addr barrier)
+{
+ tl_assert(offsetof(DrdClientobj, barrier) == 0);
+ return &drd_clientobj_get(barrier, ClientBarrier)->barrier;
+}
+
/** Initialize a barrier with client address barrier, client size size, and
- * where count threads participate in each barrier. */
+ * where count threads participate in each barrier.
+ * Called before pthread_barrier_init().
+ */
struct barrier_info*
barrier_init(const Addr barrier, const SizeT size, const Word count)
{
@@ -182,17 +172,14 @@
return barrier_get_or_allocate(barrier, size, count);
}
-/** Look up the address of the information associated with the client-side
- * barrier object. */
-struct barrier_info* barrier_get(const Addr barrier)
+/** Called after pthread_barrier_destroy(). */
+void barrier_destroy(struct barrier_info* const p)
{
- int i;
- for (i = 0; i < sizeof(s_barrier)/sizeof(s_barrier[0]); i++)
- if (s_barrier[i].barrier == barrier)
- return &s_barrier[i];
- return 0;
+ tl_assert(p);
+ drd_clientobj_remove(p->a1, ClientBarrier);
}
+/** Called before pthread_barrier_wait(). */
void barrier_pre_wait(const DrdThreadId tid, const Addr barrier)
{
struct barrier_info* p;
@@ -227,6 +214,7 @@
}
}
+/** Called after pthread_barrier_wait(). */
void barrier_post_wait(const DrdThreadId tid, const Addr barrier,
const Bool waited)
{
@@ -286,31 +274,15 @@
/** Call this function when thread tid stops to exist. */
void barrier_thread_delete(const DrdThreadId tid)
{
- int i;
+ struct barrier_info* p;
- for (i = 0; i < sizeof(s_barrier)/sizeof(s_barrier[0]); i++)
+ drd_clientobj_resetiter();
+ for ( ; (p = &drd_clientobj_next(ClientBarrier)->barrier) != 0; )
{
- struct barrier_info* const p = &s_barrier[i];
- if (p->barrier)
- {
- struct barrier_thread_info* q;
- const UWord word_tid = tid;
- q = VG_(OSetGen_Remove)(p->oset, &word_tid);
- barrier_thread_destroy(q);
- VG_(OSetGen_FreeNode)(p->oset, q);
- }
+ struct barrier_thread_info* q;
+ const UWord word_tid = tid;
+ q = VG_(OSetGen_Remove)(p->oset, &word_tid);
+ barrier_thread_destroy(q);
+ VG_(OSetGen_FreeNode)(p->oset, q);
}
}
-
-void barrier_stop_using_mem(const Addr a1, const Addr a2)
-{
- unsigned i;
- for (i = 0; i < sizeof(s_barrier)/sizeof(s_barrier[0]); i++)
- {
- if (a1 <= s_barrier[i].barrier && s_barrier[i].barrier < a2)
- {
- tl_assert(s_barrier[i].barrier + s_barrier[i].size <= a2);
- barrier_destroy(&s_barrier[i]);
- }
- }
-}
Modified: trunk/exp-drd/drd_barrier.h
===================================================================
--- trunk/exp-drd/drd_barrier.h 2008-02-29 13:15:57 UTC (rev 7507)
+++ trunk/exp-drd/drd_barrier.h 2008-02-29 17:27:03 UTC (rev 7508)
@@ -26,8 +26,8 @@
// Barrier state information.
-#ifndef __BARRIER_H
-#define __BARRIER_H
+#ifndef __DRD_BARRIER_H
+#define __DRD_BARRIER_H
#include "drd_thread.h" // DrdThreadId
@@ -50,4 +50,4 @@
void barrier_stop_using_mem(const Addr a1, const Addr a2);
-#endif /* __BARRIER_H */
+#endif /* __DRD_BARRIER_H */
Modified: trunk/exp-drd/drd_clientobj.c
===================================================================
--- trunk/exp-drd/drd_clientobj.c 2008-02-29 13:15:57 UTC (rev 7507)
+++ trunk/exp-drd/drd_clientobj.c 2008-02-29 17:27:03 UTC (rev 7508)
@@ -120,10 +120,12 @@
return p;
}
-Bool drd_clientobj_remove(const Addr addr)
+Bool drd_clientobj_remove(const Addr addr, const ObjType t)
{
DrdClientobj* p;
+ p = VG_(OSetGen_Lookup)(s_clientobj, &addr);
+ tl_assert(p->any.type == t);
p = VG_(OSetGen_Remove)(s_clientobj, &addr);
if (p)
{
@@ -163,7 +165,7 @@
a1, a2);
#endif
removed_at = p->any.a1;
- drd_clientobj_remove(p->any.a1);
+ drd_clientobj_remove(p->any.a1, p->any.type);
/* The above call removes an element from the oset and hence invalidates */
/* the iterator. Set the iterator back. */
VG_(OSetGen_ResetIter)(s_clientobj);
Modified: trunk/exp-drd/drd_clientobj.h
===================================================================
--- trunk/exp-drd/drd_clientobj.h 2008-02-29 13:15:57 UTC (rev 7507)
+++ trunk/exp-drd/drd_clientobj.h 2008-02-29 17:27:03 UTC (rev 7508)
@@ -30,6 +30,7 @@
#include "drd_clientreq.h" /* MutexT */
#include "drd_thread.h" /* DrdThreadId */
#include "pub_tool_basics.h"
+#include "pub_tool_oset.h"
// Forward declarations.
@@ -39,7 +40,12 @@
// Type definitions.
-typedef enum { ClientMutex = 1, } ObjType;
+typedef enum {
+ ClientMutex = 1,
+ ClientCondvar = 2,
+ ClientSemaphore = 3,
+ ClientBarrier = 4,
+} ObjType;
struct any
{
@@ -61,10 +67,50 @@
VectorClock vc; // vector clock associated with last unlock.
};
+struct cond_info
+{
+ Addr a1;
+ Addr a2;
+ ObjType type;
+ void (*cleanup)(union drd_clientobj*);
+ int waiter_count;
+ Addr mutex; // Client mutex specified in pthread_cond_wait() call, and null
+ // if no client threads are currently waiting on this cond.var.
+};
+
+struct semaphore_info
+{
+ Addr a1;
+ Addr a2;
+ ObjType type;
+ void (*cleanup)(union drd_clientobj*);
+ UWord value; // Semaphore value.
+ UWord waiters; // Number of threads inside sem_wait().
+ DrdThreadId last_sem_post_tid; // Thread ID associated with last sem_post().
+ VectorClock vc; // Vector clock of last sem_post() call.
+};
+
+struct barrier_info
+{
+ Addr a1;
+ Addr a2;
+ ObjType type;
+ void (*cleanup)(union drd_clientobj*);
+ Word count; // Participant count in a barrier wait.
+ Word pre_iteration; // pthread_barrier_wait() call count modulo two.
+ Word post_iteration; // pthread_barrier_wait() call count modulo two.
+ Word pre_waiters_left; // number of waiters left for a complete barrier.
+ Word post_waiters_left; // number of waiters left for a complete barrier.
+ OSet* oset; // Thread-specific barrier information.
+};
+
typedef union drd_clientobj
{
- struct any any;
- struct mutex_info mutex;
+ struct any any;
+ struct mutex_info mutex;
+ struct cond_info cond;
+ struct semaphore_info semaphore;
+ struct barrier_info barrier;
} DrdClientobj;
@@ -75,7 +121,7 @@
DrdClientobj* drd_clientobj_get(const Addr addr, const ObjType t);
Bool drd_clientobj_present(const Addr a1, const Addr a2);
DrdClientobj* drd_clientobj_add(const Addr a1, const Addr a2, const ObjType t);
-Bool drd_clientobj_remove(const Addr addr);
+Bool drd_clientobj_remove(const Addr addr, const ObjType t);
void drd_clientobj_stop_using_mem(const Addr a1, const Addr a2);
void drd_clientobj_resetiter(void);
DrdClientobj* drd_clientobj_next(const ObjType t);
Modified: trunk/exp-drd/drd_clientreq.c
===================================================================
--- trunk/exp-drd/drd_clientreq.c 2008-02-29 13:15:57 UTC (rev 7507)
+++ trunk/exp-drd/drd_clientreq.c 2008-02-29 17:27:03 UTC (rev 7508)
@@ -189,6 +189,10 @@
drd_semaphore_destroy(arg[1]);
break;
+ case VG_USERREQ__PRE_SEM_WAIT:
+ drd_semaphore_pre_wait(thread_get_running_tid(), arg[1], arg[2]);
+ break;
+
case VG_USERREQ__POST_SEM_WAIT:
drd_semaphore_post_wait(thread_get_running_tid(), arg[1], arg[2]);
break;
Modified: trunk/exp-drd/drd_clientreq.h
===================================================================
--- trunk/exp-drd/drd_clientreq.h 2008-02-29 13:15:57 UTC (rev 7507)
+++ trunk/exp-drd/drd_clientreq.h 2008-02-29 17:27:03 UTC (rev 7508)
@@ -93,8 +93,11 @@
VG_USERREQ__SEM_DESTROY,
/* args: Addr sem */
/* To notify the drd tool of a sem_wait call. */
+ VG_USERREQ__PRE_SEM_WAIT,
+ /* args: Addr sem, SizeT sem_size */
+ /* To notify the drd tool of a sem_wait call. */
VG_USERREQ__POST_SEM_WAIT,
- /* args: Addr sem, SizeT sem_size */
+ /* args: Addr sem, Bool waited */
/* To notify the drd tool before a sem_post call. */
VG_USERREQ__PRE_SEM_POST,
/* args: Addr sem, SizeT sem_size */
Modified: trunk/exp-drd/drd_cond.c
===================================================================
--- trunk/exp-drd/drd_cond.c 2008-02-29 13:15:57 UTC (rev 7507)
+++ trunk/exp-drd/drd_cond.c 2008-02-29 17:27:03 UTC (rev 7508)
@@ -23,6 +23,7 @@
*/
+#include "drd_clientobj.h"
#include "drd_cond.h"
#include "drd_error.h"
#include "drd_mutex.h"
@@ -35,10 +36,18 @@
#include "pub_tool_threadstate.h" // VG_(get_running_tid)()
-static struct cond_info s_cond[256];
+// Local functions.
+
+static void cond_cleanup(struct cond_info* p);
+
+
+// Local variables.
+
static Bool s_trace_cond;
+// Function definitions.
+
void cond_set_trace(const Bool trace_cond)
{
s_trace_cond = trace_cond;
@@ -49,81 +58,82 @@
const SizeT size)
{
tl_assert(cond != 0);
+ tl_assert(p->a1 == cond);
+ tl_assert(p->a2 - p->a1 == size);
+ tl_assert(p->type == ClientCondvar);
- p->cond = cond;
- p->size = size;
+ p->cleanup = (void(*)(DrdClientobj*))cond_cleanup;
p->waiter_count = 0;
p->mutex = 0;
}
+/** Free the memory that was allocated by cond_initialize(). Called by
+ * drd_clientobj_remove().
+ */
+static void cond_cleanup(struct cond_info* p)
+{
+ tl_assert(p);
+ if (p->mutex)
+ {
+ struct mutex_info* q;
+ q = &drd_clientobj_get(p->mutex, ClientMutex)->mutex;
+ VG_(message)(Vg_UserMsg,
+ "Error: destroying condition variable 0x%lx while thread %d"
+ " is waiting on it.\n",
+ p->a1, q ? q->owner : -1);
+ }
+}
+
static struct cond_info*
cond_get_or_allocate(const Addr cond, const SizeT size)
{
- int i;
- for (i = 0; i < sizeof(s_cond)/sizeof(s_cond[0]); i++)
+ struct cond_info *p;
+
+ tl_assert(offsetof(DrdClientobj, cond) == 0);
+ p = &drd_clientobj_get(cond, ClientCondvar)->cond;
+ if (p == 0)
{
- if (s_cond[i].cond == cond)
- {
- tl_assert(s_cond[i].size == size);
- return &s_cond[i];
- }
+ p = &drd_clientobj_add(cond, cond + size, ClientCondvar)->cond;
+ cond_initialize(p, cond, size);
}
- for (i = 0; i < sizeof(s_cond)/sizeof(s_cond[0]); i++)
- {
- if (s_cond[i].cond == 0)
- {
- cond_initialize(&s_cond[i], cond, size);
- /* TO DO: replace the constant below by a symbolic constant referring */
- /* to sizeof(pthread_cond_t). */
- drd_start_suppression(cond, cond + size, "cond");
- return &s_cond[i];
- }
- }
- tl_assert(0);
- return 0;
+ return p;
}
+struct cond_info* cond_get(const Addr cond)
+{
+ tl_assert(offsetof(DrdClientobj, cond) == 0);
+ return &drd_clientobj_get(cond, ClientCondvar)->cond;
+}
+
+/** Called before pthread_cond_init(). */
void cond_init(const Addr cond, const SizeT size)
{
if (s_trace_cond)
{
VG_(message)(Vg_UserMsg, "Initializing condition variable 0x%lx", cond);
- VG_(get_and_pp_StackTrace)(VG_(get_running_tid)(),
- VG_(clo_backtrace_size));
+ VG_(get_and_pp_StackTrace)(VG_(get_running_tid)(), VG_(clo_backtrace_size));
}
tl_assert(cond_get(cond) == 0);
tl_assert(size > 0);
cond_get_or_allocate(cond, size);
}
+/** Called after pthread_cond_destroy(). */
void cond_destroy(struct cond_info* const p)
{
if (s_trace_cond)
{
- VG_(message)(Vg_UserMsg, "Destroying condition variable 0x%lx", p->cond);
- VG_(get_and_pp_StackTrace)(VG_(get_running_tid)(),
- VG_(clo_backtrace_size));
+ VG_(message)(Vg_UserMsg, "Destroying condition variable 0x%lx", p->a1);
+ VG_(get_and_pp_StackTrace)(VG_(get_running_tid)(), VG_(clo_backtrace_size));
}
// TO DO: print a proper error message if waiter_count != 0.
tl_assert(p->waiter_count == 0);
- drd_finish_suppression(p->cond, p->cond + p->size);
-
- p->cond = 0;
- p->waiter_count = 0;
- p->mutex = 0;
+ drd_clientobj_remove(p->a1, ClientCondvar);
}
-struct cond_info* cond_get(const Addr cond)
-{
- int i;
- for (i = 0; i < sizeof(s_cond)/sizeof(s_cond[0]); i++)
- if (s_cond[i].cond == cond)
- return &s_cond[i];
- return 0;
-}
-
+/** Called before pthread_cond_wait(). */
int cond_pre_wait(const Addr cond, const SizeT cond_size, const Addr mutex)
{
struct cond_info* p;
@@ -143,6 +153,7 @@
return ++p->waiter_count;
}
+/** Called after pthread_cond_wait(). */
int cond_post_wait(const Addr cond)
{
struct cond_info* p;
@@ -158,17 +169,12 @@
return p->waiter_count;
}
+/** Called before pthread_cond_signal(). */
void cond_pre_signal(Addr const cond)
{
const ThreadId vg_tid = VG_(get_running_tid)();
const DrdThreadId drd_tid = VgThreadIdToDrdThreadId(vg_tid);
struct cond_info* const cond_p = cond_get(cond);
-#if 0
- VG_(message)(Vg_DebugMsg, "cond_pre_signal cond %d, w.c. %d, mutex %d",
- cond,
- cond_p ? cond_p->waiter_count : 0,
- cond_p ? cond_p->mutex : 0);
-#endif
if (cond_p && cond_p->waiter_count > 0)
{
if (! mutex_is_locked_by(cond_p->mutex, drd_tid))
@@ -190,23 +196,12 @@
}
}
+/** Called before pthread_cond_broadcast(). */
void cond_pre_broadcast(Addr const cond)
{
cond_pre_signal(cond);
}
+/** Called after pthread_cond_destroy(). */
void cond_thread_delete(const DrdThreadId tid)
{ }
-
-void cond_stop_using_mem(const Addr a1, const Addr a2)
-{
- unsigned i;
- for (i = 0; i < sizeof(s_cond)/sizeof(s_cond[0]); i++)
- {
- if (a1 <= s_cond[i].cond && s_cond[i].cond < a2)
- {
- tl_assert(s_cond[i].cond + s_cond[i].size <= a2);
- cond_destroy(&s_cond[i]);
- }
- }
-}
Modified: trunk/exp-drd/drd_cond.h
===================================================================
--- trunk/exp-drd/drd_cond.h 2008-02-29 13:15:57 UTC (rev 7507)
+++ trunk/exp-drd/drd_cond.h 2008-02-29 17:27:03 UTC (rev 7508)
@@ -27,24 +27,17 @@
// call.
-#ifndef __COND_H
-#define __COND_H
+#ifndef __DRD_COND_H
+#define __DRD_COND_H
-#include "pub_tool_basics.h" // Addr, SizeT
-#include "drd_vc.h"
-#include "drd_thread.h" // DrdThreadId
+#include "drd_thread.h" // DrdThreadid
+#include "pub_tool_basics.h" // Addr, SizeT
-struct cond_info
-{
- Addr cond; // Pointer to client condition variable.
- SizeT size; // sizeof(pthread_cond_t)
- int waiter_count;
- Addr mutex; // Client mutex specified in pthread_cond_wait() call, and null
- // if no client threads are currently waiting on this cond.var.
-};
+struct cond_info;
+
void cond_set_trace(const Bool trace_cond);
void cond_init(const Addr cond, const SizeT size);
void cond_destroy(struct cond_info* const p);
@@ -54,7 +47,6 @@
void cond_pre_signal(const Addr cond);
void cond_pre_broadcast(const Addr cond);
void cond_thread_delete(const DrdThreadId tid);
-void cond_stop_using_mem(const Addr a1, const Addr a2);
-#endif /* __COND_H */
+#endif /* __DRD_COND_H */
Modified: trunk/exp-drd/drd_intercepts.c
===================================================================
--- trunk/exp-drd/drd_intercepts.c 2008-02-29 13:15:57 UTC (rev 7507)
+++ trunk/exp-drd/drd_intercepts.c 2008-02-29 17:27:03 UTC (rev 7508)
@@ -706,15 +706,15 @@
int res;
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_SEM_WAIT,
+ sem, 0, 0, 0, 0);
CALL_FN_W_W(ret, fn, sem);
- if (ret == 0)
- {
- VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_WAIT,
- sem, sizeof(*sem), 0, 0, 0);
- }
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_WAIT,
+ sem, ret == 0, 0, 0, 0);
return ret;
}
+// sem_wait
PTH_FUNC(int, sem_waitZa, // sem_wait*
sem_t *sem)
{
@@ -722,12 +722,11 @@
int res;
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_SEM_WAIT,
+ sem, 0, 0, 0, 0);
CALL_FN_W_W(ret, fn, sem);
- if (ret == 0)
- {
- VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_WAIT,
- sem, sizeof(*sem), 0, 0, 0);
- }
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_WAIT,
+ sem, ret == 0, 0, 0, 0);
return ret;
}
@@ -739,12 +738,11 @@
int res;
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_SEM_WAIT,
+ sem, 0, 0, 0, 0);
CALL_FN_W_W(ret, fn, sem);
- if (ret == 0)
- {
- VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_WAIT,
- sem, sizeof(*sem), 0, 0, 0);
- }
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_WAIT,
+ sem, ret == 0, 0, 0, 0);
return ret;
}
@@ -755,12 +753,11 @@
int res;
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_SEM_WAIT,
+ sem, 0, 0, 0, 0);
CALL_FN_W_W(ret, fn, sem);
- if (ret == 0)
- {
- VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_WAIT,
- sem, sizeof(*sem), 0, 0, 0);
- }
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_WAIT,
+ sem, ret == 0, 0, 0, 0);
return ret;
}
@@ -772,12 +769,11 @@
int res;
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_SEM_WAIT,
+ sem, 0, 0, 0, 0);
CALL_FN_W_WW(ret, fn, sem, abs_timeout);
- if (ret == 0)
- {
- VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_WAIT,
- sem, sizeof(*sem), 0, 0, 0);
- }
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_WAIT,
+ sem, ret == 0, 0, 0, 0);
return ret;
}
Modified: trunk/exp-drd/drd_main.c
===================================================================
--- trunk/exp-drd/drd_main.c 2008-02-29 13:15:57 UTC (rev 7507)
+++ trunk/exp-drd/drd_main.c 2008-02-29 17:27:03 UTC (rev 7508)
@@ -82,6 +82,7 @@
Bool trace_danger_set = False;
Bool trace_mutex = False;
Bool trace_segment = False;
+ Bool trace_semaphore = False;
Bool trace_suppression = False;
Char* trace_address = 0;
@@ -94,6 +95,7 @@
else VG_BOOL_CLO(arg, "--trace-mem", drd_trace_mem)
else VG_BOOL_CLO(arg, "--trace-mutex", trace_mutex)
else VG_BOOL_CLO(arg, "--trace-segment", trace_segment)
+ else VG_BOOL_CLO(arg, "--trace-semaphore", trace_semaphore)
else VG_BOOL_CLO(arg, "--trace-suppression", trace_suppression)
else VG_STR_CLO (arg, "--trace-address", trace_address)
else
@@ -115,6 +117,8 @@
mutex_set_trace(trace_mutex);
if (trace_segment)
sg_set_trace(trace_segment);
+ if (trace_semaphore)
+ semaphore_set_trace(trace_semaphore);
if (trace_suppression)
suppression_set_trace(trace_suppression);
@@ -277,9 +281,6 @@
}
thread_stop_using_mem(a1, a2);
drd_clientobj_stop_using_mem(a1, a2);
- cond_stop_using_mem(a1, a2);
- semaphore_stop_using_mem(a1, a2);
- barrier_stop_using_mem(a1, a2);
drd_suppression_stop_using_mem(a1, a2);
}
@@ -491,10 +492,16 @@
}
}
+void drd_semaphore_pre_wait(const DrdThreadId tid, const Addr semaphore,
+ const SizeT size)
+{
+ semaphore_pre_wait(semaphore, size);
+}
+
void drd_semaphore_post_wait(const DrdThreadId tid, const Addr semaphore,
- const SizeT size)
+ const Bool waited)
{
- semaphore_post_wait(tid, semaphore, size);
+ semaphore_post_wait(tid, semaphore, waited);
}
void drd_semaphore_pre_post(const DrdThreadId tid, const Addr semaphore,
Modified: trunk/exp-drd/drd_mutex.c
===================================================================
--- trunk/exp-drd/drd_mutex.c 2008-02-29 13:15:57 UTC (rev 7507)
+++ trunk/exp-drd/drd_mutex.c 2008-02-29 17:27:03 UTC (rev 7508)
@@ -169,7 +169,7 @@
static void mutex_destroy(struct mutex_info* const p)
{
- drd_clientobj_remove(p->a1);
+ drd_clientobj_remove(p->a1, ClientMutex);
}
/** Called after pthread_mutex_destroy(). */
Modified: trunk/exp-drd/drd_semaphore.c
===================================================================
--- trunk/exp-drd/drd_semaphore.c 2008-02-29 13:15:57 UTC (rev 7507)
+++ trunk/exp-drd/drd_semaphore.c 2008-02-29 17:27:03 UTC (rev 7508)
@@ -23,6 +23,7 @@
*/
+#include "drd_clientobj.h"
#include "drd_error.h"
#include "drd_semaphore.h"
#include "drd_suppression.h"
@@ -34,22 +35,14 @@
#include "pub_tool_threadstate.h" // VG_(get_running_tid)()
-// Type definitions.
+// Local functions.
-struct semaphore_info
-{
- Addr semaphore; // Pointer to client semaphore.
- SizeT size; // Size in bytes of client-side object.
- UWord value; // Semaphore value.
- DrdThreadId last_sem_post_tid; // Thread ID associated with last sem_post().
- VectorClock vc; // Vector clock of last sem_post() call.
-};
+static void semaphore_cleanup(struct semaphore_info* p);
// Local variables.
static Bool s_trace_semaphore;
-struct semaphore_info s_semaphore[256];
// Function definitions.
@@ -67,41 +60,55 @@
{
tl_assert(semaphore != 0);
tl_assert(size > 0);
+ tl_assert(p->a1 == semaphore);
+ tl_assert(p->a2 - p->a1 == size);
+ tl_assert(p->type == ClientSemaphore);
- p->semaphore = semaphore;
- p->size = size;
+ p->cleanup = (void(*)(DrdClientobj*))semaphore_cleanup;
p->value = value;
+ p->waiters = 0;
p->last_sem_post_tid = DRD_INVALID_THREADID;
vc_init(&p->vc, 0, 0);
}
+/** Free the memory that was allocated by semaphore_initialize(). Called by
+ * drd_clientobj_remove().
+ */
+static void semaphore_cleanup(struct semaphore_info* p)
+{
+ if (p->waiters > 0)
+ {
+ VG_(message)(Vg_UserMsg, "Error: destroying semaphore while %d threads are"
+ "still waiting on the semaphore.\n", p->waiters);
+ }
+ vc_cleanup(&p->vc);
+}
+
static
struct semaphore_info*
semaphore_get_or_allocate(const Addr semaphore, const SizeT size)
{
- int i;
+ struct semaphore_info *p;
- for (i = 0; i < sizeof(s_semaphore)/sizeof(s_semaphore[0]); i++)
+ tl_assert(offsetof(DrdClientobj, semaphore) == 0);
+ p = &drd_clientobj_get(semaphore, ClientSemaphore)->semaphore;
+ if (p == 0)
{
- if (s_semaphore[i].semaphore == semaphore)
- {
- tl_assert(s_semaphore[i].size == size);
- return &s_semaphore[i];
- }
+ tl_assert(offsetof(DrdClientobj, semaphore) == 0);
+ p = &drd_clientobj_add(semaphore, semaphore + size,
+ ClientSemaphore)->semaphore;
+ semaphore_initialize(p, semaphore, size, 0);
}
- for (i = 0; i < sizeof(s_semaphore)/sizeof(s_semaphore[0]); i++)
- {
- if (s_semaphore[i].semaphore == 0)
- {
- semaphore_initialize(&s_semaphore[i], semaphore, size, 0);
- drd_start_suppression(semaphore, semaphore + size, "semaphore");
- return &s_semaphore[i];
- }
- }
- tl_assert(0);
- return 0;
+ return p;
}
+struct semaphore_info* semaphore_get(const Addr semaphore)
+{
+ tl_assert(offsetof(DrdClientobj, semaphore) == 0);
+ return &drd_clientobj_get(semaphore, ClientSemaphore)->semaphore;
+}
+
+/** Called before sem_init(). */
struct semaphore_info* semaphore_init(const Addr semaphore, const SizeT size,
const Word pshared, const UWord value)
{
@@ -113,31 +120,51 @@
return p;
}
+/** Called after sem_destroy(). */
void semaphore_destroy(struct semaphore_info* const p)
{
- drd_finish_suppression(p->semaphore, p->semaphore + p->size);
-
- vc_cleanup(&p->vc);
- p->semaphore = 0;
+ drd_clientobj_remove(p->a1, ClientSemaphore);
}
-struct semaphore_info* semaphore_get(const Addr semaphore)
+/** Called before sem_wait(). */
+void semaphore_pre_wait(const Addr semaphore, const SizeT size)
{
- int i;
- for (i = 0; i < sizeof(s_semaphore)/sizeof(s_semaphore[0]); i++)
- if (s_semaphore[i].semaphore == semaphore)
- return &s_semaphore[i];
- return 0;
+ struct semaphore_info* p;
+
+ p = semaphore_get_or_allocate(semaphore, size);
+ if (s_trace_semaphore)
+ {
+ VG_(message)(Vg_UserMsg, "semaphore_pre_wait(0x%lx, %d)", semaphore, size);
+ }
+ tl_assert(p);
+ tl_assert(p->waiters >= 0);
+ p->waiters++;
+ tl_assert(p->waiters > 0);
}
-/** Called after sem_wait() finished successfully. */
+/** Called after sem_wait() finished.
+ * @note Do not rely on the value of 'waited' -- some glibc versions do
+ * not set it correctly.
+ */
void semaphore_post_wait(const DrdThreadId tid, const Addr semaphore,
- const SizeT size)
+ const Bool waited)
{
struct semaphore_info* p;
- p = semaphore_get_or_allocate(semaphore, size);
+ p = semaphore_get(semaphore);
+ if (s_trace_semaphore)
+ {
+ VG_(message)(Vg_UserMsg, "semaphore_post_wait(0x%lx, %d)", semaphore);
+ }
+ tl_assert(p->waiters > 0);
+ p->waiters--;
+ tl_assert(p->waiters >= 0);
tl_assert(p->value >= 0);
+ if (p->value == 0)
+ {
+ VG_(message)(Vg_UserMsg, "Invalid semaphore 0x%lx", semaphore);
+ return;
+ }
p->value--;
tl_assert(p->value >= 0);
if (p->last_sem_post_tid != tid)
@@ -178,16 +205,3 @@
void semaphore_thread_delete(const DrdThreadId threadid)
{ }
-
-void semaphore_stop_using_mem(const Addr a1, const Addr a2)
-{
- unsigned i;
- for (i = 0; i < sizeof(s_semaphore)/sizeof(s_semaphore[0]); i++)
- {
- if (a1 <= s_semaphore[i].semaphore && s_semaphore[i].semaphore < a2)
- {
- tl_assert(s_semaphore[i].semaphore + s_semaphore[i].size <= a2);
- semaphore_destroy(&s_semaphore[i]);
- }
- }
-}
Modified: trunk/exp-drd/drd_semaphore.h
===================================================================
--- trunk/exp-drd/drd_semaphore.h 2008-02-29 13:15:57 UTC (rev 7507)
+++ trunk/exp-drd/drd_semaphore.h 2008-02-29 17:27:03 UTC (rev 7508)
@@ -26,8 +26,8 @@
// Semaphore state information: owner thread and recursion count.
-#ifndef __SEMAPHORE_H
-#define __SEMAPHORE_H
+#ifndef __DRD_SEMAPHORE_H
+#define __DRD_SEMAPHORE_H
#include "drd_thread.h" // DrdThreadId
@@ -43,14 +43,14 @@
const Word pshared, const UWord value);
void semaphore_destroy(struct semaphore_info* const p);
struct semaphore_info* semaphore_get(const Addr semaphore);
+void semaphore_pre_wait(const Addr semaphore, const SizeT size);
void semaphore_post_wait(const DrdThreadId tid, const Addr semaphore,
- const SizeT size);
+ const Bool waited);
void semaphore_pre_post(const DrdThreadId tid, const Addr semaphore,
const SizeT size);
void semaphore_post_post(const DrdThreadId tid, const Addr semaphore,
const SizeT size, const Bool waited);
void semaphore_thread_delete(const DrdThreadId tid);
-void semaphore_stop_using_mem(const Addr a1, const Addr a2);
-#endif /* __SEMAPHORE_H */
+#endif /* __DRD_SEMAPHORE_H */
Modified: trunk/exp-drd/drd_track.h
===================================================================
--- trunk/exp-drd/drd_track.h 2008-02-29 13:15:57 UTC (rev 7507)
+++ trunk/exp-drd/drd_track.h 2008-02-29 17:27:03 UTC (rev 7508)
@@ -40,8 +40,10 @@
void drd_semaphore_init(const Addr semaphore, const SizeT size,
const Word pshared, const Word value);
void drd_semaphore_destroy(const Addr semaphore);
+void drd_semaphore_pre_wait(const DrdThreadId tid, const Addr semaphore,
+ const SizeT size);
void drd_semaphore_post_wait(const DrdThreadId tid, const Addr semaphore,
- const SizeT size);
+ const Bool waited);
void drd_semaphore_pre_post(const DrdThreadId tid, const Addr semaphore,
const SizeT size);
void drd_semaphore_post_post(const DrdThreadId tid, const Addr semaphore,
|
|
From: Ashley P. <api...@co...> - 2008-02-29 15:54:48
|
I've been looking at my output aggregation tool again this week and have spotted a problem with the new output qualifier, in the old system with the --log-file-qualifier option the name and value of the variable are put into the xml file, under the new system this information is no longer available so my tool isn't able to sort the output from multiple files. An example of the old output is shown below, does anybody have any comments on this before I work up a patch to re-instate the old behaviour? <logfilequalifier> <var>SCORE_SELF_NODE</var> <value>0</value> </logfilequalifier> Ashley, |
|
From: <sv...@va...> - 2008-02-29 13:15:52
|
Author: bart Date: 2008-02-29 13:15:57 +0000 (Fri, 29 Feb 2008) New Revision: 7507 Log: Updated after renaming / removing regression test output files. Modified: trunk/exp-drd/tests/Makefile.am Modified: trunk/exp-drd/tests/Makefile.am =================================================================== --- trunk/exp-drd/tests/Makefile.am 2008-02-29 11:00:17 UTC (rev 7506) +++ trunk/exp-drd/tests/Makefile.am 2008-02-29 13:15:57 UTC (rev 7507) @@ -68,11 +68,6 @@ tc05_simple_race.stderr.exp \ tc06_two_races.vgtest \ tc06_two_races.stderr.exp \ - tc07_hbl1.vgtest \ - tc07_hbl1.stderr.exp tc07_hbl1.stdout.exp \ - tc07_hbl1.stderr.exp2 \ - tc08_hbl2.vgtest \ - tc08_hbl2.stderr.exp \ tc09_bad_unlock.vgtest \ tc09_bad_unlock.stderr.exp \ tc10_rec_lock.vgtest \ @@ -101,8 +96,8 @@ tc21_pthonce.vgtest \ tc21_pthonce.stderr.exp tc21_pthonce.stdout.exp \ tc22_exit_w_lock.vgtest \ - tc22_exit_w_lock.stderr.exp \ tc22_exit_w_lock.stderr.exp-32bit \ + tc22_exit_w_lock.stderr.exp-64bit \ tc23_bogus_condwait.vgtest \ tc23_bogus_condwait.stderr.exp \ tc24_nonzero_sem.vgtest \ @@ -110,6 +105,12 @@ sigalrm.vgtest \ sigalrm.stdout.exp sigalrm.stderr.exp +# tc07_hbl1.vgtest +# tc07_hbl1.stderr.exp tc07_hbl1.stdout.exp +# tc07_hbl1.stderr.exp +# tc08_hbl2.vgtest +# tc08_hbl2.stderr.exp + AM_CFLAGS = $(WERROR) -Winline -Wall -Wshadow -g $(AM_FLAG_M3264_PRI) AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/include -I$(top_builddir)/include AM_CXXFLAGS = $(AM_CFLAGS) |
|
From: <sv...@va...> - 2008-02-29 11:00:24
|
Author: bart
Date: 2008-02-29 11:00:17 +0000 (Fri, 29 Feb 2008)
New Revision: 7506
Log:
Bug fix: "mutex reinitialization" error message is no longer printed for the tc09_bad_unlock test.
Modified:
trunk/exp-drd/TODO.txt
trunk/exp-drd/drd_clientobj.c
trunk/exp-drd/drd_clientobj.h
trunk/exp-drd/drd_mutex.c
trunk/exp-drd/drd_suppression.c
trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp
Modified: trunk/exp-drd/TODO.txt
===================================================================
--- trunk/exp-drd/TODO.txt 2008-02-28 20:36:25 UTC (rev 7505)
+++ trunk/exp-drd/TODO.txt 2008-02-29 11:00:17 UTC (rev 7506)
@@ -65,10 +65,6 @@
-- VG_(find_seginfo)() returns NULL for BSS symbols on x86_64. Not yet in
the KDE bug tracking system.
- tc04_free_lock fails on AMD64 + openSUSE 10.3 (free() locked mutex).
-- tc09_bad_unlock: the 'Mutex reinitialization' message should not be printed.
-- --trace-mem=yes can cause crashes. This might be caused by the code that
- prints backtraces. An example (AMD64):
- ./vg-in-place --tool=exp-drd --trace-mem=yes exp-drd/tests/pth_barrier 2 2 1
Known performance issues:
- According to cachegrind, VG_(OSet_Next)() is taking up most CPU cycles.
Modified: trunk/exp-drd/drd_clientobj.c
===================================================================
--- trunk/exp-drd/drd_clientobj.c 2008-02-28 20:36:25 UTC (rev 7505)
+++ trunk/exp-drd/drd_clientobj.c 2008-02-29 11:00:17 UTC (rev 7506)
@@ -104,6 +104,11 @@
tl_assert(a1 < a2 && a1 + 4096 > a2);
tl_assert(! drd_clientobj_present(a1, a2));
tl_assert(VG_(OSetGen_Lookup)(s_clientobj, &a1) == 0);
+#if 0
+ VG_(message)(Vg_DebugMsg,
+ "registering client obj [0x%lx,0x%lx[ of type %d",
+ a1, a2, t);
+#endif
p = VG_(OSetGen_AllocNode)(s_clientobj, sizeof(*p));
VG_(memset)(p, 0, sizeof(*p));
p->any.a1 = a1;
@@ -123,8 +128,8 @@
if (p)
{
#if 0
- VG_(message)(Vg_DebugMsg, "removing client obj [%p,%p[\n",
- p->any.a1, p->any.a2);
+ VG_(message)(Vg_DebugMsg, "removing client obj [0x%lx,0x%lx[ of type %d",
+ p->any.a1, p->any.a2, p->any.type);
#endif
tl_assert(VG_(OSetGen_Lookup)(s_clientobj, &addr) == 0);
drd_finish_suppression(p->any.a1, p->any.a2);
@@ -138,16 +143,38 @@
void drd_clientobj_stop_using_mem(const Addr a1, const Addr a2)
{
+ Addr removed_at;
DrdClientobj* p;
+
+#if 0
+ VG_(message)(Vg_DebugMsg, "drd_clientobj_stop_using_mem [0x%lx,0x%lx[",
+ a1, a2);
+#endif
tl_assert(s_clientobj);
VG_(OSetGen_ResetIter)(s_clientobj);
- for ( ; (p = VG_(OSetGen_Next)(s_clientobj)) != 0; )
+ p = VG_(OSetGen_Next)(s_clientobj);
+ for ( ; p != 0; )
{
if ((a1 <= p->any.a1 && p->any.a1 < a2)
|| (a1 < p->any.a2 && p->any.a2 <= a2))
{
+#if 0
+ VG_(message)(Vg_DebugMsg, "drd_clientobj_stop_using_mem [0x%lx,0x%lx[",
+ a1, a2);
+#endif
+ removed_at = p->any.a1;
drd_clientobj_remove(p->any.a1);
+ /* The above call removes an element from the oset and hence invalidates */
+ /* the iterator. Set the iterator back. */
+ VG_(OSetGen_ResetIter)(s_clientobj);
+ while ((p = VG_(OSetGen_Next)(s_clientobj)) != 0
+ && p->any.a1 <= removed_at)
+ { }
}
+ else
+ {
+ p = VG_(OSetGen_Next)(s_clientobj);
+ }
}
}
Modified: trunk/exp-drd/drd_clientobj.h
===================================================================
--- trunk/exp-drd/drd_clientobj.h 2008-02-28 20:36:25 UTC (rev 7505)
+++ trunk/exp-drd/drd_clientobj.h 2008-02-29 11:00:17 UTC (rev 7506)
@@ -39,7 +39,7 @@
// Type definitions.
-typedef enum { ClientMutex, } ObjType;
+typedef enum { ClientMutex = 1, } ObjType;
struct any
{
Modified: trunk/exp-drd/drd_mutex.c
===================================================================
--- trunk/exp-drd/drd_mutex.c 2008-02-28 20:36:25 UTC (rev 7505)
+++ trunk/exp-drd/drd_mutex.c 2008-02-29 11:00:17 UTC (rev 7506)
@@ -76,6 +76,17 @@
/** Deallocate the memory that was allocated by mutex_initialize(). */
static void mutex_cleanup(struct mutex_info* p)
{
+ if (s_trace_mutex)
+ {
+ const ThreadId vg_tid = VG_(get_running_tid)();
+ const DrdThreadId drd_tid = VgThreadIdToDrdThreadId(vg_tid);
+ VG_(message)(Vg_DebugMsg,
+ "drd_pre_mutex_destroy tid = %d/%d, %s 0x%lx",
+ vg_tid, drd_tid,
+ mutex_get_typename(p),
+ p->a1);
+ }
+
if (mutex_is_locked(p))
{
MutexErrInfo MEI = { p->a1, p->recursion_count, p->owner };
@@ -149,7 +160,7 @@
VG_(get_IP)(vg_tid),
"Mutex reinitialization",
&MEI);
- mutex_destroy(mutex_p);
+ return mutex_p;
}
mutex_p = mutex_get_or_allocate(mutex, size, mutex_type);
@@ -158,17 +169,6 @@
static void mutex_destroy(struct mutex_info* const p)
{
- if (s_trace_mutex)
- {
- const ThreadId vg_tid = VG_(get_running_tid)();
- const DrdThreadId drd_tid = VgThreadIdToDrdThreadId(vg_tid);
- VG_(message)(Vg_DebugMsg,
- "drd_pre_mutex_destroy tid = %d/%d, %s 0x%lx",
- vg_tid, drd_tid,
- mutex_get_typename(p),
- p->a1);
- }
-
drd_clientobj_remove(p->a1);
}
@@ -306,18 +306,19 @@
* Update mutex_info state when unlocking the pthread_mutex_t mutex.
* Note: this function must be called before pthread_mutex_unlock() is called,
* or a race condition is triggered !
+ * @return New value of the mutex recursion count.
* @param mutex Pointer to pthread_mutex_t data structure in the client space.
* @param tid ThreadId of the thread calling pthread_mutex_unlock().
* @param vc Pointer to the current vector clock of thread tid.
*/
int mutex_unlock(const Addr mutex, const MutexT mutex_type)
{
- const DrdThreadId drd_tid = VgThreadIdToDrdThreadId(VG_(get_running_tid)());
- const ThreadId vg_tid = DrdThreadIdToVgThreadId(drd_tid);
+ const DrdThreadId drd_tid = thread_get_running_tid();
+ const ThreadId vg_tid = VG_(get_running_tid)();
const VectorClock* const vc = thread_get_vc(drd_tid);
struct mutex_info* const p = mutex_get(mutex);
- if (s_trace_mutex)
+ if (s_trace_mutex && p != 0)
{
VG_(message)(Vg_DebugMsg,
"drd_pre_mutex_unlock tid = %d/%d, %s 0x%lx rc %d",
@@ -368,10 +369,6 @@
}
tl_assert(p->mutex_type == mutex_type);
tl_assert(p->owner != DRD_INVALID_THREADID);
-#if 0
- tl_assert(mutex_type == mutex_type_mutex
- || mutex_type == mutex_type_spinlock);
-#endif
if (p->owner != drd_tid)
{
Modified: trunk/exp-drd/drd_suppression.c
===================================================================
--- trunk/exp-drd/drd_suppression.c 2008-02-28 20:36:25 UTC (rev 7505)
+++ trunk/exp-drd/drd_suppression.c 2008-02-29 11:00:17 UTC (rev 7506)
@@ -75,14 +75,12 @@
}
tl_assert(a1 < a2);
-#if 0
if (! drd_is_suppressed(a1, a2))
{
- VG_(message)(Vg_DebugMsg, "?? not suppressed ??");
+ VG_(message)(Vg_DebugMsg, "?? [0x%lx,0x%lx[ not suppressed ??", a1, a2);
VG_(get_and_pp_StackTrace)(VG_(get_running_tid)(), 12);
tl_assert(False);
}
-#endif
bm_clear(s_suppressed, a1, a2);
}
Modified: trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp
===================================================================
--- trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp 2008-02-28 20:36:25 UTC (rev 7505)
+++ trunk/exp-drd/tests/tc09_bad_unlock.stderr.exp 2008-02-29 11:00:17 UTC (rev 7506)
@@ -23,11 +23,6 @@
by 0x........: nearly_main (tc09_bad_unlock.c:41)
by 0x........: main (tc09_bad_unlock.c:49)
-Mutex reinitialization: address 0x........, recursion count 0, owner 1.
- at 0x........: pthread_mutex_init (drd_intercepts.c:?)
- by 0x........: nearly_main (tc09_bad_unlock.c:23)
- by 0x........: main (tc09_bad_unlock.c:50)
-
Attempt to unlock a mutex that is not locked: address 0x........, recursion count -1, owner 1.
at 0x........: pthread_mutex_unlock (drd_intercepts.c:?)
by 0x........: nearly_main (tc09_bad_unlock.c:27)
@@ -52,4 +47,4 @@
by 0x........: nearly_main (tc09_bad_unlock.c:41)
by 0x........: main (tc09_bad_unlock.c:50)
-ERROR SUMMARY: 9 errors from 9 contexts (suppressed: 0 from 0)
+ERROR SUMMARY: 8 errors from 8 contexts (suppressed: 0 from 0)
|
|
From: Bart V. A. <bar...@gm...> - 2008-02-29 10:45:26
|
On Fri, Feb 29, 2008 at 9:36 AM, Nicholas Nethercote
<nj...@cs...> wrote:
> On Thu, 28 Feb 2008 sv...@va... wrote:
>
> > Modified: trunk/exp-drd/drd_intercepts.c
> > ===================================================================
> > --- trunk/exp-drd/drd_intercepts.c 2008-02-28 01:36:38 UTC (rev 7495)
> > +++ trunk/exp-drd/drd_intercepts.c 2008-02-28 07:36:04 UTC (rev 7496)
> > @@ -116,7 +116,17 @@
> >
> > static MutexT mutex_type(pthread_mutex_t* mutex)
> > {
> > - return pthread_to_drd_mutex_type(mutex->__data.__kind);
> > +#if defined(_PTHREAD_DESCR_DEFINED)
> > + // Linuxthreads.
> > + const int kind = mutex->__m_kind;
> > +#elif defined(__SIZEOF_PTHREAD_MUTEX_T)
> > + // NPTL.
> > + const int kind = mutex->__data.__kind;
> > +#else
> > + // Another POSIX threads implementation. Regression tests will fail.
> > + const int kind = PTHREAD_MUTEX_DEFAULT;
> > +#endif
> > + return pthread_to_drd_mutex_type(kind);
> > }
>
> I'd be inclined to make the 'else' case abort -- if you don't know what it
> is, don't pretend to know...
I'm not entirely happy myself with the above code -- there is e.g. no
standard that guarantees that if the macro _PTHREAD_DESCR_DEFINED is
defined, that pthread_mutex_t has a data member with the name
__m_kind. And in the code above the name PTHREAD_MUTEX_ADAPTIVE_NP is
used, which also may cause portability issues. One possible solution
is that I add configure test that check for the following:
* If the expression &((pthread_mutex_t*)0)->__m_kind compiles, define
HAVE_PTHREAD_MUTEX_T__M_KIND.
* If the expression &((pthread_mutex_t*)0)->__data.__kind compiles,
define HAVE_PTHREAD_MUTEX_T__DATA__KIND.
* If the expression PTHREAD_MUTEX_ADAPTIVE_NP compiles, define
HAVE_PTHREAD_MUTEX_ADAPTIVE_NP.
Since the above tests only test whether or not compilation succeeds,
these tests should also work fine when cross-compiling Valgrind.
Bart.
|
|
From: Nicholas N. <nj...@cs...> - 2008-02-29 08:36:17
|
On Thu, 28 Feb 2008 sv...@va... wrote:
> Author: bart
> Date: 2008-02-28 07:36:04 +0000 (Thu, 28 Feb 2008)
> New Revision: 7496
>
> Log:
> Should compile again with linuxthreads header files.
>
> Modified:
> trunk/exp-drd/drd_intercepts.c
>
>
> Modified: trunk/exp-drd/drd_intercepts.c
> ===================================================================
> --- trunk/exp-drd/drd_intercepts.c 2008-02-28 01:36:38 UTC (rev 7495)
> +++ trunk/exp-drd/drd_intercepts.c 2008-02-28 07:36:04 UTC (rev 7496)
> @@ -116,7 +116,17 @@
>
> static MutexT mutex_type(pthread_mutex_t* mutex)
> {
> - return pthread_to_drd_mutex_type(mutex->__data.__kind);
> +#if defined(_PTHREAD_DESCR_DEFINED)
> + // Linuxthreads.
> + const int kind = mutex->__m_kind;
> +#elif defined(__SIZEOF_PTHREAD_MUTEX_T)
> + // NPTL.
> + const int kind = mutex->__data.__kind;
> +#else
> + // Another POSIX threads implementation. Regression tests will fail.
> + const int kind = PTHREAD_MUTEX_DEFAULT;
> +#endif
> + return pthread_to_drd_mutex_type(kind);
> }
I'd be inclined to make the 'else' case abort -- if you don't know what it
is, don't pretend to know...
Nick
|
|
From: Tom H. <th...@cy...> - 2008-02-29 05:05:13
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2008-02-29 03:15:08 GMT
Results differ from 24 hours ago
Checking out valgrind source tree ... done
Configuring valgrind ... done
Building valgrind ... done
Running regression tests ... failed
Regression test results follow
== 366 tests, 101 stderr failures, 1 stdout failure, 29 post failures ==
memcheck/tests/addressable (stderr)
memcheck/tests/badjump (stderr)
memcheck/tests/describe-block (stderr)
memcheck/tests/erringfds (stderr)
memcheck/tests/leak-0 (stderr)
memcheck/tests/leak-cycle (stderr)
memcheck/tests/leak-pool-0 (stderr)
memcheck/tests/leak-pool-1 (stderr)
memcheck/tests/leak-pool-2 (stderr)
memcheck/tests/leak-pool-3 (stderr)
memcheck/tests/leak-pool-4 (stderr)
memcheck/tests/leak-pool-5 (stderr)
memcheck/tests/leak-regroot (stderr)
memcheck/tests/leak-tree (stderr)
memcheck/tests/long_namespace_xml (stderr)
memcheck/tests/lsframe1 (stderr)
memcheck/tests/lsframe2 (stderr)
memcheck/tests/malloc_free_fill (stderr)
memcheck/tests/match-overrun (stderr)
memcheck/tests/noisy_child (stderr)
memcheck/tests/partial_load_dflt (stderr)
memcheck/tests/partial_load_ok (stderr)
memcheck/tests/partiallydefinedeq (stderr)
memcheck/tests/pointer-trace (stderr)
memcheck/tests/sigkill (stderr)
memcheck/tests/stack_changes (stderr)
memcheck/tests/x86/bug152022 (stderr)
memcheck/tests/x86/scalar (stderr)
memcheck/tests/x86/scalar_supp (stderr)
memcheck/tests/x86/xor-undef-x86 (stderr)
memcheck/tests/xml1 (stderr)
massif/tests/alloc-fns-A (post)
massif/tests/alloc-fns-B (post)
massif/tests/basic (post)
massif/tests/basic2 (post)
massif/tests/big-alloc (post)
massif/tests/culling1 (stderr)
massif/tests/culling2 (stderr)
massif/tests/custom_alloc (post)
massif/tests/deep-A (post)
massif/tests/deep-B (stderr)
massif/tests/deep-B (post)
massif/tests/deep-C (stderr)
massif/tests/deep-C (post)
massif/tests/deep-D (post)
massif/tests/ignoring (post)
massif/tests/insig (post)
massif/tests/long-names (post)
massif/tests/long-time (post)
massif/tests/new-cpp (post)
massif/tests/null (post)
massif/tests/one (post)
massif/tests/overloaded-new (post)
massif/tests/peak (post)
massif/tests/peak2 (stderr)
massif/tests/peak2 (post)
massif/tests/realloc (stderr)
massif/tests/realloc (post)
massif/tests/thresholds_0_0 (post)
massif/tests/thresholds_0_10 (post)
massif/tests/thresholds_10_0 (post)
massif/tests/thresholds_10_10 (post)
massif/tests/thresholds_5_0 (post)
massif/tests/thresholds_5_10 (post)
massif/tests/zero1 (post)
massif/tests/zero2 (post)
none/tests/blockfault (stderr)
none/tests/mremap (stderr)
none/tests/mremap2 (stdout)
helgrind/tests/hg01_all_ok (stderr)
helgrind/tests/hg02_deadlock (stderr)
helgrind/tests/hg03_inherit (stderr)
helgrind/tests/hg04_race (stderr)
helgrind/tests/hg05_race2 (stderr)
helgrind/tests/hg06_readshared (stderr)
helgrind/tests/tc01_simple_race (stderr)
helgrind/tests/tc02_simple_tls (stderr)
helgrind/tests/tc03_re_excl (stderr)
helgrind/tests/tc05_simple_race (stderr)
helgrind/tests/tc06_two_races (stderr)
helgrind/tests/tc07_hbl1 (stderr)
helgrind/tests/tc08_hbl2 (stderr)
helgrind/tests/tc09_bad_unlock (stderr)
helgrind/tests/tc11_XCHG (stderr)
helgrind/tests/tc12_rwl_trivial (stderr)
helgrind/tests/tc14_laog_dinphils (stderr)
helgrind/tests/tc16_byterace (stderr)
helgrind/tests/tc17_sembar (stderr)
helgrind/tests/tc18_semabuse (stderr)
helgrind/tests/tc19_shadowmem (stderr)
helgrind/tests/tc20_verifywrap (stderr)
helgrind/tests/tc21_pthonce (stderr)
helgrind/tests/tc22_exit_w_lock (stderr)
helgrind/tests/tc23_bogus_condwait (stderr)
helgrind/tests/tc24_nonzero_sem (stderr)
exp-drd/tests/fp_race (stderr)
exp-drd/tests/fp_race2 (stderr)
exp-drd/tests/hg01_all_ok (stderr)
exp-drd/tests/hg02_deadlock (stderr)
exp-drd/tests/hg03_inherit (stderr)
exp-drd/tests/hg04_race (stderr)
exp-drd/tests/hg05_race2 (stderr)
exp-drd/tests/hg06_readshared (stderr)
exp-drd/tests/matinv (stderr)
exp-drd/tests/pth_barrier (stderr)
exp-drd/tests/pth_barrier2 (stderr)
exp-drd/tests/pth_barrier3 (stderr)
exp-drd/tests/pth_broadcast (stderr)
exp-drd/tests/pth_cond_race (stderr)
exp-drd/tests/pth_cond_race2 (stderr)
exp-drd/tests/pth_create_chain (stderr)
exp-drd/tests/pth_detached (stderr)
exp-drd/tests/pth_detached2 (stderr)
exp-drd/tests/sem_as_mutex (stderr)
exp-drd/tests/sem_as_mutex2 (stderr)
exp-drd/tests/sigalrm (stderr)
exp-drd/tests/tc01_simple_race (stderr)
exp-drd/tests/tc02_simple_tls (stderr)
exp-drd/tests/tc03_re_excl (stderr)
exp-drd/tests/tc05_simple_race (stderr)
exp-drd/tests/tc06_two_races (stderr)
exp-drd/tests/tc09_bad_unlock (stderr)
exp-drd/tests/tc11_XCHG (stderr)
exp-drd/tests/tc12_rwl_trivial (stderr)
exp-drd/tests/tc16_byterace (stderr)
exp-drd/tests/tc17_sembar (stderr)
exp-drd/tests/tc18_semabuse (stderr)
exp-drd/tests/tc20_verifywrap (stderr)
exp-drd/tests/tc21_pthonce (stderr)
exp-drd/tests/tc22_exit_w_lock (stderr)
exp-drd/tests/tc23_bogus_condwait (stderr)
=================================================
== Results from 24 hours ago ==
=================================================
Checking out valgrind source tree ... done
Configuring valgrind ... done
Building valgrind ... failed
Last 20 lines of verbose log follow echo
if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -m32 -mpreferred-stack-boundary=2 -O2 -g -Wmissing-prototypes -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -fno-strict-aliasing -I../coregrind -Wno-long-long -MT exp_drd_x86_linux-drd_vc.o -MD -MP -MF ".deps/exp_drd_x86_linux-drd_vc.Tpo" \
-c -o exp_drd_x86_linux-drd_vc.o `test -f 'drd_vc.c' || echo './'`drd_vc.c; \
then mv -f ".deps/exp_drd_x86_linux-drd_vc.Tpo" ".deps/exp_drd_x86_linux-drd_vc.Po"; \
else rm -f ".deps/exp_drd_x86_linux-drd_vc.Tpo"; exit 1; \
fi
gcc -Wno-long-long -o exp-drd-x86-linux -static -Wl,-defsym,valt_load_address=0x38000000 -nodefaultlibs -nostartfiles -u _start -m32 -Wl,-T,../valt_load_address_x86_linux.lds exp_drd_x86_linux-drd_barrier.o exp_drd_x86_linux-drd_bitmap.o exp_drd_x86_linux-drd_clientreq.o exp_drd_x86_linux-drd_cond.o exp_drd_x86_linux-drd_error.o exp_drd_x86_linux-drd_main.o exp_drd_x86_linux-drd_malloc_wrappers.o exp_drd_x86_linux-drd_mutex.o exp_drd_x86_linux-drd_segment.o exp_drd_x86_linux-drd_semaphore.o exp_drd_x86_linux-drd_suppression.o exp_drd_x86_linux-drd_thread.o exp_drd_x86_linux-drd_vc.o ../coregrind/libcoregrind_x86_linux.a ../VEX/libvex_x86_linux.a -lgcc
if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -m32 -mpreferred-stack-boundary=2 -O2 -g -Wmissing-prototypes -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -fno-strict-aliasing -I../coregrind -O -g -fpic -fno-omit-frame-pointer -fno-strict-aliasing -Wno-long-long -MT vgpreload_exp_drd_x86_linux_so-drd_intercepts.o -MD -MP -MF ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Tpo" \
-c -o vgpreload_exp_drd_x86_linux_so-drd_intercepts.o `test -f 'drd_intercepts.c' || echo './'`drd_intercepts.c; \
then mv -f ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Tpo" ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Po"; \
else rm -f ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Tpo"; exit 1; \
fi
drd_intercepts.c: In function `mutex_type':
drd_intercepts.c:119: structure has no member named `__data'
make[3]: *** [vgpreload_exp_drd_x86_linux_so-drd_intercepts.o] Error 1
make[3]: Leaving directory `/tmp/vgtest/2008-02-29/valgrind/exp-drd'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/tmp/vgtest/2008-02-29/valgrind/exp-drd'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/tmp/vgtest/2008-02-29/valgrind'
make: *** [all] Error 2
=================================================
== Difference between 24 hours ago and now ==
=================================================
*** old.short Fri Feb 29 03:33:03 2008
--- new.short Fri Feb 29 05:05:17 2008
***************
*** 3,26 ****
Configuring valgrind ... done
! Building valgrind ... failed
- Last 20 lines of verbose log follow echo
- if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -m32 -mpreferred-stack-boundary=2 -O2 -g -Wmissing-prototypes -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -fno-strict-aliasing -I../coregrind -Wno-long-long -MT exp_drd_x86_linux-drd_vc.o -MD -MP -MF ".deps/exp_drd_x86_linux-drd_vc.Tpo" \
- -c -o exp_drd_x86_linux-drd_vc.o `test -f 'drd_vc.c' || echo './'`drd_vc.c; \
- then mv -f ".deps/exp_drd_x86_linux-drd_vc.Tpo" ".deps/exp_drd_x86_linux-drd_vc.Po"; \
- else rm -f ".deps/exp_drd_x86_linux-drd_vc.Tpo"; exit 1; \
- fi
- gcc -Wno-long-long -o exp-drd-x86-linux -static -Wl,-defsym,valt_load_address=0x38000000 -nodefaultlibs -nostartfiles -u _start -m32 -Wl,-T,../valt_load_address_x86_linux.lds exp_drd_x86_linux-drd_barrier.o exp_drd_x86_linux-drd_bitmap.o exp_drd_x86_linux-drd_clientreq.o exp_drd_x86_linux-drd_cond.o exp_drd_x86_linux-drd_error.o exp_drd_x86_linux-drd_main.o exp_drd_x86_linux-drd_malloc_wrappers.o exp_drd_x86_linux-drd_mutex.o exp_drd_x86_linux-drd_segment.o exp_drd_x86_linux-drd_semaphore.o exp_drd_x86_linux-drd_suppression.o exp_drd_x86_linux-drd_thread.o exp_drd_x86_linux-drd_vc.o ../coregrind/libcoregrind_x86_linux.a ../VEX/libvex_x86_linux.a -lgcc
- if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -m32 -mpreferred-stack-boundary=2 -O2 -g -Wmissing-prototypes -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -fno-strict-aliasing -I../coregrind -O -g -fpic -fno-omit-frame-pointer -fno-strict-aliasing -Wno-long-long -MT vgpreload_exp_drd_x86_linux_so-drd_intercepts.o -MD -MP -MF ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Tpo" \
- -c -o vgpreload_exp_drd_x86_linux_so-drd_intercepts.o `test -f 'drd_intercepts.c' || echo './'`drd_intercepts.c; \
- then mv -f ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Tpo" ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Po"; \
- else rm -f ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Tpo"; exit 1; \
- fi
- drd_intercepts.c: In function `mutex_type':
- drd_intercepts.c:119: structure has no member named `__data'
- make[3]: *** [vgpreload_exp_drd_x86_linux_so-drd_intercepts.o] Error 1
- make[3]: Leaving directory `/tmp/vgtest/2008-02-29/valgrind/exp-drd'
- make[2]: *** [all-recursive] Error 1
- make[2]: Leaving directory `/tmp/vgtest/2008-02-29/valgrind/exp-drd'
- make[1]: *** [all-recursive] Error 1
- make[1]: Leaving directory `/tmp/vgtest/2008-02-29/valgrind'
- make: *** [all] Error 2
--- 3,141 ----
Configuring valgrind ... done
! Building valgrind ... done
! Running regression tests ... failed
!
! Regression test results follow
!
! == 366 tests, 101 stderr failures, 1 stdout failure, 29 post failures ==
! memcheck/tests/addressable (stderr)
! memcheck/tests/badjump (stderr)
! memcheck/tests/describe-block (stderr)
! memcheck/tests/erringfds (stderr)
! memcheck/tests/leak-0 (stderr)
! memcheck/tests/leak-cycle (stderr)
! memcheck/tests/leak-pool-0 (stderr)
! memcheck/tests/leak-pool-1 (stderr)
! memcheck/tests/leak-pool-2 (stderr)
! memcheck/tests/leak-pool-3 (stderr)
! memcheck/tests/leak-pool-4 (stderr)
! memcheck/tests/leak-pool-5 (stderr)
! memcheck/tests/leak-regroot (stderr)
! memcheck/tests/leak-tree (stderr)
! memcheck/tests/long_namespace_xml (stderr)
! memcheck/tests/lsframe1 (stderr)
! memcheck/tests/lsframe2 (stderr)
! memcheck/tests/malloc_free_fill (stderr)
! memcheck/tests/match-overrun (stderr)
! memcheck/tests/noisy_child (stderr)
! memcheck/tests/partial_load_dflt (stderr)
! memcheck/tests/partial_load_ok (stderr)
! memcheck/tests/partiallydefinedeq (stderr)
! memcheck/tests/pointer-trace (stderr)
! memcheck/tests/sigkill (stderr)
! memcheck/tests/stack_changes (stderr)
! memcheck/tests/x86/bug152022 (stderr)
! memcheck/tests/x86/scalar (stderr)
! memcheck/tests/x86/scalar_supp (stderr)
! memcheck/tests/x86/xor-undef-x86 (stderr)
! memcheck/tests/xml1 (stderr)
! massif/tests/alloc-fns-A (post)
! massif/tests/alloc-fns-B (post)
! massif/tests/basic (post)
! massif/tests/basic2 (post)
! massif/tests/big-alloc (post)
! massif/tests/culling1 (stderr)
! massif/tests/culling2 (stderr)
! massif/tests/custom_alloc (post)
! massif/tests/deep-A (post)
! massif/tests/deep-B (stderr)
! massif/tests/deep-B (post)
! massif/tests/deep-C (stderr)
! massif/tests/deep-C (post)
! massif/tests/deep-D (post)
! massif/tests/ignoring (post)
! massif/tests/insig (post)
! massif/tests/long-names (post)
! massif/tests/long-time (post)
! massif/tests/new-cpp (post)
! massif/tests/null (post)
! massif/tests/one (post)
! massif/tests/overloaded-new (post)
! massif/tests/peak (post)
! massif/tests/peak2 (stderr)
! massif/tests/peak2 (post)
! massif/tests/realloc (stderr)
! massif/tests/realloc (post)
! massif/tests/thresholds_0_0 (post)
! massif/tests/thresholds_0_10 (post)
! massif/tests/thresholds_10_0 (post)
! massif/tests/thresholds_10_10 (post)
! massif/tests/thresholds_5_0 (post)
! massif/tests/thresholds_5_10 (post)
! massif/tests/zero1 (post)
! massif/tests/zero2 (post)
! none/tests/blockfault (stderr)
! none/tests/mremap (stderr)
! none/tests/mremap2 (stdout)
! helgrind/tests/hg01_all_ok (stderr)
! helgrind/tests/hg02_deadlock (stderr)
! helgrind/tests/hg03_inherit (stderr)
! helgrind/tests/hg04_race (stderr)
! helgrind/tests/hg05_race2 (stderr)
! helgrind/tests/hg06_readshared (stderr)
! helgrind/tests/tc01_simple_race (stderr)
! helgrind/tests/tc02_simple_tls (stderr)
! helgrind/tests/tc03_re_excl (stderr)
! helgrind/tests/tc05_simple_race (stderr)
! helgrind/tests/tc06_two_races (stderr)
! helgrind/tests/tc07_hbl1 (stderr)
! helgrind/tests/tc08_hbl2 (stderr)
! helgrind/tests/tc09_bad_unlock (stderr)
! helgrind/tests/tc11_XCHG (stderr)
! helgrind/tests/tc12_rwl_trivial (stderr)
! helgrind/tests/tc14_laog_dinphils (stderr)
! helgrind/tests/tc16_byterace (stderr)
! helgrind/tests/tc17_sembar (stderr)
! helgrind/tests/tc18_semabuse (stderr)
! helgrind/tests/tc19_shadowmem (stderr)
! helgrind/tests/tc20_verifywrap (stderr)
! helgrind/tests/tc21_pthonce (stderr)
! helgrind/tests/tc22_exit_w_lock (stderr)
! helgrind/tests/tc23_bogus_condwait (stderr)
! helgrind/tests/tc24_nonzero_sem (stderr)
! exp-drd/tests/fp_race (stderr)
! exp-drd/tests/fp_race2 (stderr)
! exp-drd/tests/hg01_all_ok (stderr)
! exp-drd/tests/hg02_deadlock (stderr)
! exp-drd/tests/hg03_inherit (stderr)
! exp-drd/tests/hg04_race (stderr)
! exp-drd/tests/hg05_race2 (stderr)
! exp-drd/tests/hg06_readshared (stderr)
! exp-drd/tests/matinv (stderr)
! exp-drd/tests/pth_barrier (stderr)
! exp-drd/tests/pth_barrier2 (stderr)
! exp-drd/tests/pth_barrier3 (stderr)
! exp-drd/tests/pth_broadcast (stderr)
! exp-drd/tests/pth_cond_race (stderr)
! exp-drd/tests/pth_cond_race2 (stderr)
! exp-drd/tests/pth_create_chain (stderr)
! exp-drd/tests/pth_detached (stderr)
! exp-drd/tests/pth_detached2 (stderr)
! exp-drd/tests/sem_as_mutex (stderr)
! exp-drd/tests/sem_as_mutex2 (stderr)
! exp-drd/tests/sigalrm (stderr)
! exp-drd/tests/tc01_simple_race (stderr)
! exp-drd/tests/tc02_simple_tls (stderr)
! exp-drd/tests/tc03_re_excl (stderr)
! exp-drd/tests/tc05_simple_race (stderr)
! exp-drd/tests/tc06_two_races (stderr)
! exp-drd/tests/tc09_bad_unlock (stderr)
! exp-drd/tests/tc11_XCHG (stderr)
! exp-drd/tests/tc12_rwl_trivial (stderr)
! exp-drd/tests/tc16_byterace (stderr)
! exp-drd/tests/tc17_sembar (stderr)
! exp-drd/tests/tc18_semabuse (stderr)
! exp-drd/tests/tc20_verifywrap (stderr)
! exp-drd/tests/tc21_pthonce (stderr)
! exp-drd/tests/tc22_exit_w_lock (stderr)
! exp-drd/tests/tc23_bogus_condwait (stderr)
|
|
From: Tom H. <th...@cy...> - 2008-02-29 04:09:09
|
Nightly build on lloyd ( x86_64, Fedora 7 ) started at 2008-02-29 03:05:05 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 400 tests, 10 stderr failures, 2 stdout failures, 0 post failures == memcheck/tests/malloc_free_fill (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/vcpu_fnfns (stdout) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) exp-drd/tests/hg03_inherit (stderr) exp-drd/tests/tc04_free_lock (stderr) exp-drd/tests/tc22_exit_w_lock (stderr) |
|
From: Tom H. <th...@cy...> - 2008-02-29 03:50:04
|
Nightly build on aston ( x86_64, Fedora Core 5 ) started at 2008-02-29 03:20:09 GMT Results differ from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 406 tests, 12 stderr failures, 1 stdout failure, 0 post failures == memcheck/tests/malloc_free_fill (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/blockfault (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) exp-drd/tests/hg03_inherit (stderr) exp-drd/tests/tc04_free_lock (stderr) exp-drd/tests/tc05_simple_race (stderr) exp-drd/tests/tc22_exit_w_lock (stderr) ================================================= == Results from 24 hours ago == ================================================= Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 406 tests, 11 stderr failures, 1 stdout failure, 0 post failures == memcheck/tests/malloc_free_fill (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/blockfault (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) exp-drd/tests/hg03_inherit (stderr) exp-drd/tests/tc04_free_lock (stderr) exp-drd/tests/tc22_exit_w_lock (stderr) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Fri Feb 29 03:35:02 2008 --- new.short Fri Feb 29 03:50:07 2008 *************** *** 8,10 **** ! == 406 tests, 11 stderr failures, 1 stdout failure, 0 post failures == memcheck/tests/malloc_free_fill (stderr) --- 8,10 ---- ! == 406 tests, 12 stderr failures, 1 stdout failure, 0 post failures == memcheck/tests/malloc_free_fill (stderr) *************** *** 20,21 **** --- 20,22 ---- exp-drd/tests/tc04_free_lock (stderr) + exp-drd/tests/tc05_simple_race (stderr) exp-drd/tests/tc22_exit_w_lock (stderr) |
|
From: Tom H. <th...@cy...> - 2008-02-29 03:10:41
|
Nightly build on gill ( x86_64, Fedora Core 2 ) started at 2008-02-29 03:00:04 GMT
Results differ from 24 hours ago
Checking out valgrind source tree ... done
Configuring valgrind ... done
Building valgrind ... done
Running regression tests ... failed
Regression test results follow
== 406 tests, 32 stderr failures, 3 stdout failures, 0 post failures ==
memcheck/tests/malloc_free_fill (stderr)
memcheck/tests/pointer-trace (stderr)
memcheck/tests/stack_switch (stderr)
memcheck/tests/x86/scalar (stderr)
memcheck/tests/x86/scalar_supp (stderr)
none/tests/amd64/insn_ssse3 (stdout)
none/tests/amd64/insn_ssse3 (stderr)
none/tests/amd64/ssse3_misaligned (stderr)
none/tests/blockfault (stderr)
none/tests/fdleak_fcntl (stderr)
none/tests/mremap (stderr)
none/tests/mremap2 (stdout)
none/tests/x86/insn_ssse3 (stdout)
none/tests/x86/insn_ssse3 (stderr)
none/tests/x86/ssse3_misaligned (stderr)
helgrind/tests/hg01_all_ok (stderr)
helgrind/tests/hg02_deadlock (stderr)
helgrind/tests/hg03_inherit (stderr)
helgrind/tests/hg04_race (stderr)
helgrind/tests/hg05_race2 (stderr)
helgrind/tests/tc01_simple_race (stderr)
helgrind/tests/tc05_simple_race (stderr)
helgrind/tests/tc06_two_races (stderr)
helgrind/tests/tc09_bad_unlock (stderr)
helgrind/tests/tc14_laog_dinphils (stderr)
helgrind/tests/tc16_byterace (stderr)
helgrind/tests/tc17_sembar (stderr)
helgrind/tests/tc19_shadowmem (stderr)
helgrind/tests/tc20_verifywrap (stderr)
helgrind/tests/tc21_pthonce (stderr)
helgrind/tests/tc22_exit_w_lock (stderr)
helgrind/tests/tc23_bogus_condwait (stderr)
exp-drd/tests/tc04_free_lock (stderr)
exp-drd/tests/tc20_verifywrap (stderr)
exp-drd/tests/tc22_exit_w_lock (stderr)
=================================================
== Results from 24 hours ago ==
=================================================
Checking out valgrind source tree ... done
Configuring valgrind ... done
Building valgrind ... failed
Last 20 lines of verbose log follow echo
if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -m32 -O2 -g -Wmissing-prototypes -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -fno-strict-aliasing -I../coregrind -Wno-long-long -Wdeclaration-after-statement -MT exp_drd_x86_linux-drd_semaphore.o -MD -MP -MF ".deps/exp_drd_x86_linux-drd_semaphore.Tpo" -c -o exp_drd_x86_linux-drd_semaphore.o `test -f 'drd_semaphore.c' || echo './'`drd_semaphore.c; \
then mv -f ".deps/exp_drd_x86_linux-drd_semaphore.Tpo" ".deps/exp_drd_x86_linux-drd_semaphore.Po"; else rm -f ".deps/exp_drd_x86_linux-drd_semaphore.Tpo"; exit 1; fi
if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -m32 -O2 -g -Wmissing-prototypes -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -fno-strict-aliasing -I../coregrind -Wno-long-long -Wdeclaration-after-statement -MT exp_drd_x86_linux-drd_suppression.o -MD -MP -MF ".deps/exp_drd_x86_linux-drd_suppression.Tpo" -c -o exp_drd_x86_linux-drd_suppression.o `test -f 'drd_suppression.c' || echo './'`drd_suppression.c; \
then mv -f ".deps/exp_drd_x86_linux-drd_suppression.Tpo" ".deps/exp_drd_x86_linux-drd_suppression.Po"; else rm -f ".deps/exp_drd_x86_linux-drd_suppression.Tpo"; exit 1; fi
if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -m32 -O2 -g -Wmissing-prototypes -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -fno-strict-aliasing -I../coregrind -Wno-long-long -Wdeclaration-after-statement -MT exp_drd_x86_linux-drd_thread.o -MD -MP -MF ".deps/exp_drd_x86_linux-drd_thread.Tpo" -c -o exp_drd_x86_linux-drd_thread.o `test -f 'drd_thread.c' || echo './'`drd_thread.c; \
then mv -f ".deps/exp_drd_x86_linux-drd_thread.Tpo" ".deps/exp_drd_x86_linux-drd_thread.Po"; else rm -f ".deps/exp_drd_x86_linux-drd_thread.Tpo"; exit 1; fi
if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -m32 -O2 -g -Wmissing-prototypes -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -fno-strict-aliasing -I../coregrind -Wno-long-long -Wdeclaration-after-statement -MT exp_drd_x86_linux-drd_vc.o -MD -MP -MF ".deps/exp_drd_x86_linux-drd_vc.Tpo" -c -o exp_drd_x86_linux-drd_vc.o `test -f 'drd_vc.c' || echo './'`drd_vc.c; \
then mv -f ".deps/exp_drd_x86_linux-drd_vc.Tpo" ".deps/exp_drd_x86_linux-drd_vc.Po"; else rm -f ".deps/exp_drd_x86_linux-drd_vc.Tpo"; exit 1; fi
gcc -Wno-long-long -Wdeclaration-after-statement -o exp-drd-x86-linux -static -Wl,-defsym,valt_load_address=0x38000000 -nodefaultlibs -nostartfiles -u _start -m32 -Wl,-T,../valt_load_address_x86_linux.lds exp_drd_x86_linux-drd_barrier.o exp_drd_x86_linux-drd_bitmap.o exp_drd_x86_linux-drd_clientreq.o exp_drd_x86_linux-drd_cond.o exp_drd_x86_linux-drd_error.o exp_drd_x86_linux-drd_main.o exp_drd_x86_linux-drd_malloc_wrappers.o exp_drd_x86_linux-drd_mutex.o exp_drd_x86_linux-drd_segment.o exp_drd_x86_linux-drd_semaphore.o exp_drd_x86_linux-drd_suppression.o exp_drd_x86_linux-drd_thread.o exp_drd_x86_linux-drd_vc.o ../coregrind/libcoregrind_x86_linux.a ../VEX/libvex_x86_linux.a -lgcc
if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -m32 -O2 -g -Wmissing-prototypes -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -fno-strict-aliasing -I../coregrind -O -g -fpic -fno-omit-frame-pointer -fno-strict-aliasing -Wno-long-long -Wdeclaration-after-statement -MT vgpreload_exp_drd_x86_linux_so-drd_intercepts.o -MD -MP -MF ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Tpo" -c -o vgpreload_exp_drd_x86_linux_so-drd_intercepts.o `test -f 'drd_intercepts.c' || echo './'`drd_intercepts.c; \
then mv -f ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Tpo" ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Po"; else rm -f ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Tpo"; exit 1; fi
drd_intercepts.c: In function `mutex_type':
drd_intercepts.c:119: error: structure has no member named `__data'
make[3]: *** [vgpreload_exp_drd_x86_linux_so-drd_intercepts.o] Error 1
make[3]: Leaving directory `/tmp/vgtest/2008-02-29/valgrind/exp-drd'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/tmp/vgtest/2008-02-29/valgrind/exp-drd'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/tmp/vgtest/2008-02-29/valgrind'
make: *** [all] Error 2
=================================================
== Difference between 24 hours ago and now ==
=================================================
*** old.short Fri Feb 29 03:03:06 2008
--- new.short Fri Feb 29 03:10:45 2008
***************
*** 3,26 ****
Configuring valgrind ... done
! Building valgrind ... failed
- Last 20 lines of verbose log follow echo
- if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -m32 -O2 -g -Wmissing-prototypes -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -fno-strict-aliasing -I../coregrind -Wno-long-long -Wdeclaration-after-statement -MT exp_drd_x86_linux-drd_semaphore.o -MD -MP -MF ".deps/exp_drd_x86_linux-drd_semaphore.Tpo" -c -o exp_drd_x86_linux-drd_semaphore.o `test -f 'drd_semaphore.c' || echo './'`drd_semaphore.c; \
- then mv -f ".deps/exp_drd_x86_linux-drd_semaphore.Tpo" ".deps/exp_drd_x86_linux-drd_semaphore.Po"; else rm -f ".deps/exp_drd_x86_linux-drd_semaphore.Tpo"; exit 1; fi
- if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -m32 -O2 -g -Wmissing-prototypes -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -fno-strict-aliasing -I../coregrind -Wno-long-long -Wdeclaration-after-statement -MT exp_drd_x86_linux-drd_suppression.o -MD -MP -MF ".deps/exp_drd_x86_linux-drd_suppression.Tpo" -c -o exp_drd_x86_linux-drd_suppression.o `test -f 'drd_suppression.c' || echo './'`drd_suppression.c; \
- then mv -f ".deps/exp_drd_x86_linux-drd_suppression.Tpo" ".deps/exp_drd_x86_linux-drd_suppression.Po"; else rm -f ".deps/exp_drd_x86_linux-drd_suppression.Tpo"; exit 1; fi
- if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -m32 -O2 -g -Wmissing-prototypes -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -fno-strict-aliasing -I../coregrind -Wno-long-long -Wdeclaration-after-statement -MT exp_drd_x86_linux-drd_thread.o -MD -MP -MF ".deps/exp_drd_x86_linux-drd_thread.Tpo" -c -o exp_drd_x86_linux-drd_thread.o `test -f 'drd_thread.c' || echo './'`drd_thread.c; \
- then mv -f ".deps/exp_drd_x86_linux-drd_thread.Tpo" ".deps/exp_drd_x86_linux-drd_thread.Po"; else rm -f ".deps/exp_drd_x86_linux-drd_thread.Tpo"; exit 1; fi
- if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -m32 -O2 -g -Wmissing-prototypes -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -fno-strict-aliasing -I../coregrind -Wno-long-long -Wdeclaration-after-statement -MT exp_drd_x86_linux-drd_vc.o -MD -MP -MF ".deps/exp_drd_x86_linux-drd_vc.Tpo" -c -o exp_drd_x86_linux-drd_vc.o `test -f 'drd_vc.c' || echo './'`drd_vc.c; \
- then mv -f ".deps/exp_drd_x86_linux-drd_vc.Tpo" ".deps/exp_drd_x86_linux-drd_vc.Po"; else rm -f ".deps/exp_drd_x86_linux-drd_vc.Tpo"; exit 1; fi
- gcc -Wno-long-long -Wdeclaration-after-statement -o exp-drd-x86-linux -static -Wl,-defsym,valt_load_address=0x38000000 -nodefaultlibs -nostartfiles -u _start -m32 -Wl,-T,../valt_load_address_x86_linux.lds exp_drd_x86_linux-drd_barrier.o exp_drd_x86_linux-drd_bitmap.o exp_drd_x86_linux-drd_clientreq.o exp_drd_x86_linux-drd_cond.o exp_drd_x86_linux-drd_error.o exp_drd_x86_linux-drd_main.o exp_drd_x86_linux-drd_malloc_wrappers.o exp_drd_x86_linux-drd_mutex.o exp_drd_x86_linux-drd_segment.o exp_drd_x86_linux-drd_semaphore.o exp_drd_x86_linux-drd_suppression.o exp_drd_x86_linux-drd_thread.o exp_drd_x86_linux-drd_vc.o ../coregrind/libcoregrind_x86_linux.a ../VEX/libvex_x86_linux.a -lgcc
- if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../include -I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1 -m32 -O2 -g -Wmissing-prototypes -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-declarations -fno-strict-aliasing -I../coregrind -O -g -fpic -fno-omit-frame-pointer -fno-strict-aliasing -Wno-long-long -Wdeclaration-after-statement -MT vgpreload_exp_drd_x86_linux_so-drd_intercepts.o -MD -MP -MF ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Tpo" -c -o vgpreload_exp_drd_x86_linux_so-drd_intercepts.o `test -f 'drd_intercepts.c' || echo './'`drd_intercepts.c; \
- then mv -f ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Tpo" ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Po"; else rm -f ".deps/vgpreload_exp_drd_x86_linux_so-drd_intercepts.Tpo"; exit 1; fi
- drd_intercepts.c: In function `mutex_type':
- drd_intercepts.c:119: error: structure has no member named `__data'
- make[3]: *** [vgpreload_exp_drd_x86_linux_so-drd_intercepts.o] Error 1
- make[3]: Leaving directory `/tmp/vgtest/2008-02-29/valgrind/exp-drd'
- make[2]: *** [all-recursive] Error 1
- make[2]: Leaving directory `/tmp/vgtest/2008-02-29/valgrind/exp-drd'
- make[1]: *** [all-recursive] Error 1
- make[1]: Leaving directory `/tmp/vgtest/2008-02-29/valgrind'
- make: *** [all] Error 2
--- 3,45 ----
Configuring valgrind ... done
! Building valgrind ... done
! Running regression tests ... failed
!
! Regression test results follow
!
! == 406 tests, 32 stderr failures, 3 stdout failures, 0 post failures ==
! memcheck/tests/malloc_free_fill (stderr)
! memcheck/tests/pointer-trace (stderr)
! memcheck/tests/stack_switch (stderr)
! memcheck/tests/x86/scalar (stderr)
! memcheck/tests/x86/scalar_supp (stderr)
! none/tests/amd64/insn_ssse3 (stdout)
! none/tests/amd64/insn_ssse3 (stderr)
! none/tests/amd64/ssse3_misaligned (stderr)
! none/tests/blockfault (stderr)
! none/tests/fdleak_fcntl (stderr)
! none/tests/mremap (stderr)
! none/tests/mremap2 (stdout)
! none/tests/x86/insn_ssse3 (stdout)
! none/tests/x86/insn_ssse3 (stderr)
! none/tests/x86/ssse3_misaligned (stderr)
! helgrind/tests/hg01_all_ok (stderr)
! helgrind/tests/hg02_deadlock (stderr)
! helgrind/tests/hg03_inherit (stderr)
! helgrind/tests/hg04_race (stderr)
! helgrind/tests/hg05_race2 (stderr)
! helgrind/tests/tc01_simple_race (stderr)
! helgrind/tests/tc05_simple_race (stderr)
! helgrind/tests/tc06_two_races (stderr)
! helgrind/tests/tc09_bad_unlock (stderr)
! helgrind/tests/tc14_laog_dinphils (stderr)
! helgrind/tests/tc16_byterace (stderr)
! helgrind/tests/tc17_sembar (stderr)
! helgrind/tests/tc19_shadowmem (stderr)
! helgrind/tests/tc20_verifywrap (stderr)
! helgrind/tests/tc21_pthonce (stderr)
! helgrind/tests/tc22_exit_w_lock (stderr)
! helgrind/tests/tc23_bogus_condwait (stderr)
! exp-drd/tests/tc04_free_lock (stderr)
! exp-drd/tests/tc20_verifywrap (stderr)
! exp-drd/tests/tc22_exit_w_lock (stderr)
|