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
(33) |
2
(15) |
3
(20) |
4
(22) |
5
(13) |
|
6
(12) |
7
(32) |
8
(17) |
9
(31) |
10
(21) |
11
(7) |
12
(13) |
|
13
(13) |
14
(12) |
15
(10) |
16
(8) |
17
(7) |
18
(28) |
19
(5) |
|
20
(5) |
21
(7) |
22
(11) |
23
(7) |
24
(13) |
25
(7) |
26
(7) |
|
27
(7) |
28
(15) |
29
(30) |
30
(21) |
31
(6) |
|
|
|
From: <sv...@va...> - 2008-07-07 22:00:54
|
Author: sewardj
Date: 2008-07-07 23:00:56 +0100 (Mon, 07 Jul 2008)
New Revision: 8392
Log:
* on amd64-linux, handle guest_FS_ZERO and the arch_prctl syscall
correctly. This reduces the false error rate for simple programs
to zero and means it is usable on this platform for the first time.
* some tidying up of the check_store* functions
Modified:
branches/PTRCHECK/exp-ptrcheck/pc_main.c
Modified: branches/PTRCHECK/exp-ptrcheck/pc_main.c
===================================================================
--- branches/PTRCHECK/exp-ptrcheck/pc_main.c 2008-07-07 19:09:11 UTC (rev 8391)
+++ branches/PTRCHECK/exp-ptrcheck/pc_main.c 2008-07-07 22:00:56 UTC (rev 8392)
@@ -1386,6 +1386,8 @@
#if defined(VGA_amd64)
# include "libvex_guest_amd64.h"
# define MC_SIZEOF_GUEST_STATE sizeof(VexGuestAMD64State)
+# define PC_OFF_FS_ZERO offsetof(VexGuestAMD64State,guest_FS_ZERO)
+# define PC_SZB_FS_ZERO sizeof( ((VexGuestAMD64State*)0)->guest_FS_ZERO)
#endif
/* See description on definition of type IntRegInfo. */
@@ -1505,7 +1507,7 @@
if (o == GOF(R14) && is421) { o -= 0; goto contains_o; }
if (o == GOF(R15) && is421) { o -= 0; goto contains_o; }
- if (o == GOF(FS_ZERO) && is8) goto none;
+ if (o == GOF(FS_ZERO) && is8) goto exactly1;
if (o == GOF(SSEROUND) && is8) goto none;
if (o == GOF(XMM0) && isXmmF) goto none;
@@ -1764,6 +1766,8 @@
/*--- System calls ---*/
/*--------------------------------------------------------------------*/
+static __inline__ VG_REGPARM(1) Seg nonptr_or_unknown(UWord x); /*fwds*/
+
static void pre_syscall ( ThreadId tid, UInt syscallno )
{
//zz #if 0
@@ -1799,9 +1803,6 @@
/* For the most part, syscalls don't return pointers. So set
the return shadow to unknown. */
case __NR_access:
-# if defined(__NR_arch_prctl)
- case __NR_arch_prctl:
-# endif
case __NR_clock_gettime:
case __NR_close:
# if defined(__NR_connect)
@@ -1898,6 +1899,18 @@
VG_(set_syscall_return_shadows)( tid, (UWord)NONPTR, 0 );
break;
+# if defined(__NR_arch_prctl)
+ case __NR_arch_prctl: {
+ put_guest_intreg(
+ tid, 1/*shadowno*/, PC_OFF_FS_ZERO, PC_SZB_FS_ZERO,
+ (UWord)
+ nonptr_or_unknown(
+ get_guest_intreg( tid, 0/*shadowno*/,
+ PC_OFF_FS_ZERO, PC_SZB_FS_ZERO )));
+ VG_(set_syscall_return_shadows)( tid, (UWord)NONPTR, 0 );
+ }
+# endif
+
//zz // These ones don't return a pointer, so don't do anything -- already set
//zz // the segment to UNKNOWN in post_reg_write_default().
//zz // 1: // exit (never seen by skin)
@@ -2234,15 +2247,29 @@
// ------------------ Store handlers ------------------ //
/* On 32 bit targets, we will use:
- check_store1 check_store2 check_store4W
+ check_store1 check_store2 check_store4_P
On 64 bit targets, we will use:
- check_store1 check_store2 check_store4 check_store8W
+ check_store1 check_store2 check_store4 check_store8_P
*/
+/* Apply nonptr_or_unknown to all the words intersecting
+ [a, a+len). */
+static void pessimise_words_intersecting ( Addr a, SizeT len )
+{
+ const SizeT wszB = sizeof(UWord);
+ Addr wfirst = VG_ROUNDDN(a, wszB);
+ Addr wlast = VG_ROUNDDN(a+len-1, wszB);
+ Addr a2;
+ tl_assert(wfirst <= wlast);
+ for (a2 = wfirst ; a2 <= wlast; a2 += wszB) {
+ set_mem_vseg( a2, nonptr_or_unknown( *(UWord*)a2 ));
+ }
+}
+
// This handles 64 bit stores on 64 bit targets. It must
// not be called on 32 bit targets.
static VG_REGPARM(3)
-void check_store8W(Addr m, Seg mptr_vseg, UWord t, Seg t_vseg)
+void check_store8_P(Addr m, Seg mptr_vseg, UWord t, Seg t_vseg)
{
tl_assert(sizeof(UWord) == 8); /* DO NOT REMOVE */
checkSeg(t_vseg);
@@ -2254,17 +2281,14 @@
set_mem_vseg( m, t_vseg );
} else {
// straddling two words
- m = VG_ROUNDDN(m,8);
- set_mem_vseg( m, nonptr_or_unknown( *(ULong*)m ) );
- m += 8;
- set_mem_vseg( m, nonptr_or_unknown( *(ULong*)m ) );
+ pessimise_words_intersecting(m, 8);
}
}
// This handles 32 bit stores on 32 bit targets. It must
// not be called on 64 bit targets.
static VG_REGPARM(3)
-void check_store4W(Addr m, Seg mptr_vseg, UWord t, Seg t_vseg)
+void check_store4_P(Addr m, Seg mptr_vseg, UWord t, Seg t_vseg)
{
tl_assert(sizeof(UWord) == 4); /* DO NOT REMOVE */
checkSeg(t_vseg);
@@ -2276,10 +2300,7 @@
set_mem_vseg( m, t_vseg );
} else {
// straddling two words
- m = VG_ROUNDDN(m,4);
- set_mem_vseg( m, nonptr_or_unknown( *(UInt*)m ) );
- m += 4;
- set_mem_vseg( m, nonptr_or_unknown( *(UInt*)m ) );
+ pessimise_words_intersecting(m, 4);
}
}
@@ -2293,19 +2314,7 @@
check_load_or_store(/*is_write*/True, m, 4, mptr_vseg);
// Actually *do* the STORE here (Nb: cast must be to 4-byte type!)
*(UInt*)m = t;
- if (0 == (m & 4)) {
- // within one word. This happens if the address ends in
- // 000, 001, 010, 011. If it ends in 100, 101, 110, 111
- // then it overlaps two adjacent 64 bit words.
- m = VG_ROUNDDN(m,8);
- set_mem_vseg( m, nonptr_or_unknown( *(ULong*)m ) );
- } else {
- // straddling two words
- m = VG_ROUNDDN(m,8);
- set_mem_vseg( m, nonptr_or_unknown( *(ULong*)m ) );
- m += 8;
- set_mem_vseg( m, nonptr_or_unknown( *(ULong*)m ) );
- }
+ pessimise_words_intersecting(m, 4);
}
// Used for both 32 bit and 64 bit targets.
@@ -2316,33 +2325,7 @@
check_load_or_store(/*is_write*/True, m, 2, mptr_vseg);
// Actually *do* the STORE here (Nb: cast must be to 2-byte type!)
*(UShort*)m = t;
- if (sizeof(UWord) == 4) {
- /* 32-bit host */
- if (3 != (m & 3)) {
- // within one word
- m = VG_ROUNDDN(m,4);
- set_mem_vseg( m, nonptr_or_unknown( *(UInt*)m ) );
- } else {
- // straddling two words
- m = VG_ROUNDDN(m,4);
- set_mem_vseg( m, nonptr_or_unknown( *(UInt*)m ) );
- m += 4;
- set_mem_vseg( m, nonptr_or_unknown( *(UInt*)m ) );
- }
- } else {
- /* 64-bit host */
- if (7 != (m & 7)) {
- // within one word
- m = VG_ROUNDDN(m,8);
- set_mem_vseg( m, nonptr_or_unknown( *(ULong*)m ) );
- } else {
- // straddling two words
- m = VG_ROUNDDN(m,8);
- set_mem_vseg( m, nonptr_or_unknown( *(ULong*)m ) );
- m += 8;
- set_mem_vseg( m, nonptr_or_unknown( *(ULong*)m ) );
- }
- }
+ pessimise_words_intersecting(m, 2);
}
// Used for both 32 bit and 64 bit targets.
@@ -2353,15 +2336,7 @@
check_load_or_store(/*is_write*/True, m, 1, mptr_vseg);
// Actually *do* the STORE here (Nb: cast must be to 1-byte type!)
*(UChar*)m = t;
- if (sizeof(UWord) == 4) {
- /* 32-bit host */
- m = VG_ROUNDDN(m,4);
- set_mem_vseg( m, nonptr_or_unknown( *(UInt*)m ) );
- } else {
- /* 64-bit host */
- m = VG_ROUNDDN(m,8);
- set_mem_vseg( m, nonptr_or_unknown( *(ULong*)m ) );
- }
+ pessimise_words_intersecting(m, 1);
}
//zz
@@ -3540,8 +3515,8 @@
if (pce->gWordTy == Ity_I32) {
/* 32 bit host/guest (cough, cough) */
switch (d_ty) {
- case Ity_I32: h_fn = &check_store4W;
- h_nm = "check_store4W"; break;
+ case Ity_I32: h_fn = &check_store4_P;
+ h_nm = "check_store4_P"; break;
case Ity_I16: h_fn = &check_store2;
h_nm = "check_store2"; break;
case Ity_I8: h_fn = &check_store1;
@@ -3560,8 +3535,8 @@
} else {
/* 64 bit host/guest (cough, cough) */
switch (d_ty) {
- case Ity_I64: h_fn = &check_store8W;
- h_nm = "check_store8W"; break;
+ case Ity_I64: h_fn = &check_store8_P;
+ h_nm = "check_store8_P"; break;
case Ity_I32: h_fn = &check_store4;
h_nm = "check_store4"; break;
case Ity_I16: h_fn = &check_store2;
|
|
From: <sv...@va...> - 2008-07-07 19:09:03
|
Author: bart
Date: 2008-07-07 20:09:11 +0100 (Mon, 07 Jul 2008)
New Revision: 8391
Log:
Updated expected output.
Modified:
trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc
Modified: trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc
===================================================================
--- trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc 2008-07-07 19:07:36 UTC (rev 8390)
+++ trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc 2008-07-07 19:09:11 UTC (rev 8391)
@@ -163,60 +163,60 @@
------------ dealloc of mem holding locks ------------
-[1/1] mutex_destroy invalid mutex 0x........
-[1/1] mutex_destroy error checking mutex 0x........
+[1/1] mutex_destroy invalid mutex 0x........ rc 0 owner 0
+[1/1] mutex_destroy error checking mutex 0x........ rc 1 owner 1
Destroying locked mutex: mutex 0x........, recursion count 1, owner 1.
at 0x........: main (tc20_verifywrap.c:262)
Destroying locked rwlock: rwlock 0x.........
at 0x........: main (tc20_verifywrap.c:262)
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 0
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 0
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 0
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
|
|
From: <sv...@va...> - 2008-07-07 19:07:29
|
Author: bart Date: 2008-07-07 20:07:36 +0100 (Mon, 07 Jul 2008) New Revision: 8390 Log: Added prereq clause. Modified: trunk/drd/tests/qt4_mutex.vgtest trunk/drd/tests/qt4_rwlock.vgtest trunk/drd/tests/qt4_semaphore.vgtest Modified: trunk/drd/tests/qt4_mutex.vgtest =================================================================== --- trunk/drd/tests/qt4_mutex.vgtest 2008-07-07 18:50:39 UTC (rev 8389) +++ trunk/drd/tests/qt4_mutex.vgtest 2008-07-07 19:07:36 UTC (rev 8390) @@ -1,2 +1,3 @@ +prereq: test -e qt4_mutex vgopts: --check-stack-var=yes prog: qt4_mutex Modified: trunk/drd/tests/qt4_rwlock.vgtest =================================================================== --- trunk/drd/tests/qt4_rwlock.vgtest 2008-07-07 18:50:39 UTC (rev 8389) +++ trunk/drd/tests/qt4_rwlock.vgtest 2008-07-07 19:07:36 UTC (rev 8390) @@ -1,2 +1,3 @@ +prereq: test -e qt4_rwlock vgopts: --check-stack-var=yes prog: qt4_rwlock Modified: trunk/drd/tests/qt4_semaphore.vgtest =================================================================== --- trunk/drd/tests/qt4_semaphore.vgtest 2008-07-07 18:50:39 UTC (rev 8389) +++ trunk/drd/tests/qt4_semaphore.vgtest 2008-07-07 19:07:36 UTC (rev 8390) @@ -1,2 +1,3 @@ +prereq: test -e qt4_semaphore vgopts: --check-stack-var=yes prog: qt4_semaphore |
|
From: <sv...@va...> - 2008-07-07 18:50:32
|
Author: bart Date: 2008-07-07 19:50:39 +0100 (Mon, 07 Jul 2008) New Revision: 8389 Log: Fixed bug in test for Qt4. Modified: trunk/configure.in Modified: trunk/configure.in =================================================================== --- trunk/configure.in 2008-07-07 18:38:17 UTC (rev 8388) +++ trunk/configure.in 2008-07-07 18:50:39 UTC (rev 8389) @@ -1388,8 +1388,10 @@ AC_MSG_CHECKING([for Qt4 core library]) -if grep -q -w '^#define HAVE_LIBQTCORE 1$' config.h \ - && grep -q -w '^#define HAVE_QTCORE_QMUTEX 1$' config.h +# The test below looks up some symbol definitions in the temporary file generated by the +# configure script, namely confdefs.h. +if grep -q -w '^#define HAVE_LIBQTCORE 1$' confdefs.h \ + && grep -q -w '^#define HAVE_QTCORE_QMUTEX 1$' confdefs.h then ac_have_qtcore=yes AC_MSG_RESULT([yes]) |
|
From: <sv...@va...> - 2008-07-07 18:38:10
|
Author: bart Date: 2008-07-07 19:38:17 +0100 (Mon, 07 Jul 2008) New Revision: 8388 Log: Added paragraphs about the glib and Qt libraries. Modified: trunk/drd/docs/drd-manual.xml Modified: trunk/drd/docs/drd-manual.xml =================================================================== --- trunk/drd/docs/drd-manual.xml 2008-07-07 18:37:30 UTC (rev 8387) +++ trunk/drd/docs/drd-manual.xml 2008-07-07 18:38:17 UTC (rev 8388) @@ -989,6 +989,46 @@ </sect2> +<sect2 id="drd-manual.gnome" xreflabel="GNOME"> +<title>Debugging GNOME Programs With DRD</title> + +<para> +GNOME applications use the threading primitives provided by the +<computeroutput>glib</computeroutput> library. This library is built +on top of POSIX threads, and is hence directly supported by DRD. +</para> + +</sect2> + + +<sect2 id="drd-manual.qt" xreflabel="Qt"> +<title>Debugging Qt Programs With DRD</title> + +<para> +The Qt library is the GUI library used by the KDE project. Currently +there are two versions of the Qt library in use: Qt3 by KDE 3 and Qt4 +by KDE 4. If possible, use Qt4 instead of Qt3. Qt3 is no longer +supported, and there are known problems with multithreading support in +Qt3. As an example, using QString objects in more than one thread will +trigger race reports (this has been confirmed by Trolltech -- see also +Trolltech task <ulink +url="http://trolltech.com/developer/task-tracker/index_html?id=206152&method=entry">#206152</ulink>). +</para> + +<para> +Qt4 applications are supported by DRD, but only if the +<literal>libqt4-debuginfo</literal> package has been installed. Some +of the synchronization and threading primitives in Qt4 bypass the +POSIX threads library, and DRD can only intercept these if symbol +information for the Qt4 library is available. DRD won't tell you if it +has not been able to load the Qt4 debug information, but a huge number +of data races will be reported on data protected via +<literal>QMutex</literal> objects. +</para> + +</sect2> + + <sect2 id="drd-manual.openmp" xreflabel="OpenMP"> <title>Debugging OpenMP Programs With DRD</title> |
|
From: <sv...@va...> - 2008-07-07 18:37:23
|
Author: bart
Date: 2008-07-07 19:37:30 +0100 (Mon, 07 Jul 2008)
New Revision: 8387
Log:
Qt4 and GOMP intercepts are now always built, whether or not runtime support for these libraries is present on the build system.
Modified:
trunk/drd/Makefile.am
Modified: trunk/drd/Makefile.am
===================================================================
--- trunk/drd/Makefile.am 2008-07-07 18:36:45 UTC (rev 8386)
+++ trunk/drd/Makefile.am 2008-07-07 18:37:30 UTC (rev 8387)
@@ -21,17 +21,11 @@
endif
-VGPRELOAD_DRD_SOURCES = drd_strmem_intercepts.c drd_pthread_intercepts.c \
- $(VGPRELOAD_DRD_SOURCES_QT4) $(VGPRELOAD_DRD_SOURCES_OPENMP)
-
-if HAVE_QTCORE
+VGPRELOAD_DRD_SOURCES = drd_strmem_intercepts.c drd_pthread_intercepts.c
VGPRELOAD_DRD_SOURCES += drd_qtcore_intercepts.c
-endif
-
-if HAVE_OPENMP
VGPRELOAD_DRD_SOURCES += drd_gomp_intercepts.c
-endif
+
DRD_CFLAGS=@FLAG_W_EXTRA@ @FLAG_UNLIMITED_INLINE_UNIT_GROWTH@ \
-Wformat-nonliteral -Wno-inline -Wno-unused-parameter \
-O2
|
|
From: <sv...@va...> - 2008-07-07 18:36:37
|
Author: bart
Date: 2008-07-07 19:36:45 +0100 (Mon, 07 Jul 2008)
New Revision: 8386
Log:
Added support for Qt4 QMutex::tryLock(int).
Modified:
trunk/drd/drd_qtcore_intercepts.c
Modified: trunk/drd/drd_qtcore_intercepts.c
===================================================================
--- trunk/drd/drd_qtcore_intercepts.c 2008-07-07 18:35:55 UTC (rev 8385)
+++ trunk/drd/drd_qtcore_intercepts.c 2008-07-07 18:36:45 UTC (rev 8386)
@@ -180,10 +180,18 @@
// QMutex::tryLock(int) -- _ZN6QMutex7tryLockEi
QT4CORE_FUNC(int, _ZN6QMutex7tryLockEi,
void* mutex,
- int timeout)
+ int timeout_ms)
{
- // Not yet implemented.
- assert(0);
+ int ret;
+ int res;
+ OrigFn fn;
+ VALGRIND_GET_ORIG_FN(fn);
+ VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__PRE_MUTEX_LOCK,
+ mutex, mutex_type(mutex), 1, 0, 0);
+ CALL_FN_W_WW(ret, fn, mutex, timeout_ms);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_MUTEX_LOCK,
+ mutex, ret, 0, 0, 0);
+ return ret;
}
// QMutex::unlock() -- _ZN6QMutex6unlockEv
|
|
From: <sv...@va...> - 2008-07-07 18:35:48
|
Author: bart
Date: 2008-07-07 19:35:55 +0100 (Mon, 07 Jul 2008)
New Revision: 8385
Log:
Added code for triggering QMutex::tryLock(int).
Modified:
trunk/drd/tests/qt4_mutex.cpp
Modified: trunk/drd/tests/qt4_mutex.cpp
===================================================================
--- trunk/drd/tests/qt4_mutex.cpp 2008-07-07 18:35:13 UTC (rev 8384)
+++ trunk/drd/tests/qt4_mutex.cpp 2008-07-07 18:35:55 UTC (rev 8385)
@@ -4,8 +4,9 @@
#define _GNU_SOURCE
#endif
+#include <QtCore/QMutex> // class QMutex
#include <QtCore/QThread> // class QThread
-#include <QtCore/QMutex> // class QMutex
+#include <cassert>
#include <cstdio> // fprintf()
#include <cstdlib> // atoi()
#include <new>
@@ -51,10 +52,16 @@
// Stack-allocated mutex.
QMutex M(QMutex::Recursive);
M.lock();
- M.tryLock();
+ assert(M.tryLock());
M.unlock();
M.unlock();
}
+ {
+ QMutex M(QMutex::NonRecursive);
+ assert(M.tryLock(1));
+ assert(! M.tryLock(1));
+ M.unlock();
+ }
pthread_barrier_init(&s_barrier, 0, n_threads);
s_pMutex = new QMutex();
|
|
From: <sv...@va...> - 2008-07-07 18:35:06
|
Author: bart
Date: 2008-07-07 19:35:13 +0100 (Mon, 07 Jul 2008)
New Revision: 8384
Log:
Added Qt4 reader-writer lock test.
Added:
trunk/drd/tests/qt4_rwlock.cpp
trunk/drd/tests/qt4_rwlock.stderr.exp
trunk/drd/tests/qt4_rwlock.vgtest
Modified:
trunk/drd/tests/Makefile.am
Modified: trunk/drd/tests/Makefile.am
===================================================================
--- trunk/drd/tests/Makefile.am 2008-07-07 17:27:48 UTC (rev 8383)
+++ trunk/drd/tests/Makefile.am 2008-07-07 18:35:13 UTC (rev 8384)
@@ -94,6 +94,8 @@
pth_spinlock.vgtest \
qt4_mutex.stderr.exp \
qt4_mutex.vgtest \
+ qt4_rwlock.stderr.exp \
+ qt4_rwlock.vgtest \
qt4_semaphore.stderr.exp \
qt4_semaphore.vgtest \
recursive_mutex.stderr.exp \
@@ -234,7 +236,7 @@
trylock
if HAVE_QTCORE
-check_PROGRAMS += qt4_mutex qt4_semaphore
+check_PROGRAMS += qt4_mutex qt4_rwlock qt4_semaphore
endif
if HAVE_OPENMP
@@ -312,6 +314,9 @@
qt4_mutex_SOURCES = qt4_mutex.cpp
qt4_mutex_LDADD = -lQtCore -lpthread
+qt4_rwlock_SOURCES = qt4_rwlock.cpp
+qt4_rwlock_LDADD = -lQtCore -lpthread
+
qt4_semaphore_SOURCES = qt4_semaphore.cpp
qt4_semaphore_LDADD = -lQtCore -lpthread
endif
Added: trunk/drd/tests/qt4_rwlock.cpp
===================================================================
--- trunk/drd/tests/qt4_rwlock.cpp (rev 0)
+++ trunk/drd/tests/qt4_rwlock.cpp 2008-07-07 18:35:13 UTC (rev 8384)
@@ -0,0 +1,86 @@
+/// Qt4 reader-writer lock test.
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <QtCore/QThread> // class QThread
+#include <QtCore/QReadWriteLock> // class QReadWriteLock
+#include <cstdio> // fprintf()
+#include <cstdlib> // atoi()
+#include <new>
+#include <pthread.h> // pthread_barrier_t
+#include <vector>
+
+
+static pthread_barrier_t s_barrier;
+static QReadWriteLock* s_pRWlock;
+static int s_iterations;
+static int s_counter;
+
+
+class IncThread: public QThread
+{
+ virtual void run();
+};
+
+void IncThread::run()
+{
+ int i;
+
+ pthread_barrier_wait(&s_barrier);
+ for (i = s_iterations; i > 0; i--)
+ {
+ s_pRWlock->lockForWrite();
+ s_counter++;
+ s_pRWlock->unlock();
+ }
+}
+
+int main(int argc, char** argv)
+{
+ int i;
+ const int n_threads = 10;
+ std::vector<QThread*> tid(n_threads);
+
+ s_iterations = argc > 1 ? atoi(argv[1]) : 1000;
+
+ fprintf(stderr, "Start of test.\n");
+
+ {
+ // Stack-allocated reader-writer lock.
+ QReadWriteLock RWL(QReadWriteLock::Recursive);
+ RWL.lockForRead();
+ RWL.lockForRead();
+ RWL.unlock();
+ RWL.unlock();
+ RWL.lockForWrite();
+ RWL.lockForWrite();
+ RWL.unlock();
+ RWL.unlock();
+ }
+
+ pthread_barrier_init(&s_barrier, 0, n_threads);
+ s_pRWlock = new QReadWriteLock();
+ for (i = 0; i < n_threads; i++)
+ {
+ tid[i] = new IncThread;
+ tid[i]->start();
+ }
+ for (i = 0; i < n_threads; i++)
+ {
+ tid[i]->wait();
+ delete tid[i];
+ }
+ delete s_pRWlock;
+ s_pRWlock = 0;
+ pthread_barrier_destroy(&s_barrier);
+
+ if (s_counter == n_threads * s_iterations)
+ fprintf(stderr, "Test successful.\n");
+ else
+ fprintf(stderr, "Test failed: counter = %d, should be %d\n",
+ s_counter, n_threads * s_iterations);
+
+ return 0;
+}
Added: trunk/drd/tests/qt4_rwlock.stderr.exp
===================================================================
--- trunk/drd/tests/qt4_rwlock.stderr.exp (rev 0)
+++ trunk/drd/tests/qt4_rwlock.stderr.exp 2008-07-07 18:35:13 UTC (rev 8384)
@@ -0,0 +1,5 @@
+
+Start of test.
+Test successful.
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Added: trunk/drd/tests/qt4_rwlock.vgtest
===================================================================
--- trunk/drd/tests/qt4_rwlock.vgtest (rev 0)
+++ trunk/drd/tests/qt4_rwlock.vgtest 2008-07-07 18:35:13 UTC (rev 8384)
@@ -0,0 +1,2 @@
+vgopts: --check-stack-var=yes
+prog: qt4_rwlock
|
|
From: <sv...@va...> - 2008-07-07 17:27:41
|
Author: bart
Date: 2008-07-07 18:27:48 +0100 (Mon, 07 Jul 2008)
New Revision: 8383
Log:
Added intercepts for the public member functions of the Qt4 QMutex class.
Added:
trunk/drd/drd_qtcore_intercepts.c
Modified:
trunk/drd/Makefile.am
Modified: trunk/drd/Makefile.am
===================================================================
--- trunk/drd/Makefile.am 2008-07-07 17:22:41 UTC (rev 8382)
+++ trunk/drd/Makefile.am 2008-07-07 17:27:48 UTC (rev 8383)
@@ -2,7 +2,7 @@
noinst_PROGRAMS =
if VGP_X86_LINUX
- noinst_PROGRAMS += drd-x86-linux vgpreload_drd-x86-linux.so
+ noinst_PROGRAMS += drd-x86-linux vgpreload_drd-x86-linux.so
endif
if VGP_AMD64_LINUX
noinst_PROGRAMS += drd-amd64-linux vgpreload_drd-amd64-linux.so
@@ -14,17 +14,22 @@
noinst_PROGRAMS += drd-ppc64-linux vgpreload_drd-ppc64-linux.so
endif
if VGP_PPC32_AIX5
- noinst_PROGRAMS += drd-ppc32-aix5 vgpreload_drd-ppc32-aix5.so
+ noinst_PROGRAMS += drd-ppc32-aix5 vgpreload_drd-ppc32-aix5.so
endif
if VGP_PPC64_AIX5
- noinst_PROGRAMS += drd-ppc64-aix5 vgpreload_drd-ppc64-aix5.so
+ noinst_PROGRAMS += drd-ppc64-aix5 vgpreload_drd-ppc64-aix5.so
endif
+
+VGPRELOAD_DRD_SOURCES = drd_strmem_intercepts.c drd_pthread_intercepts.c \
+ $(VGPRELOAD_DRD_SOURCES_QT4) $(VGPRELOAD_DRD_SOURCES_OPENMP)
+
+if HAVE_QTCORE
+VGPRELOAD_DRD_SOURCES += drd_qtcore_intercepts.c
+endif
+
if HAVE_OPENMP
-VGPRELOAD_DRD_SOURCES_COMMON = \
- drd_strmem_intercepts.c drd_pthread_intercepts.c drd_gomp_intercepts.c
-else
-VGPRELOAD_DRD_SOURCES_COMMON = drd_strmem_intercepts.c drd_pthread_intercepts.c
+VGPRELOAD_DRD_SOURCES += drd_gomp_intercepts.c
endif
DRD_CFLAGS=@FLAG_W_EXTRA@ @FLAG_UNLIMITED_INLINE_UNIT_GROWTH@ \
@@ -38,7 +43,7 @@
AM_CFLAGS_PPC32_AIX5 += $(DRD_CFLAGS)
AM_CFLAGS_PPC64_AIX5 += $(DRD_CFLAGS)
-vgpreload_drd_x86_linux_so_SOURCES = $(VGPRELOAD_DRD_SOURCES_COMMON)
+vgpreload_drd_x86_linux_so_SOURCES = $(VGPRELOAD_DRD_SOURCES)
vgpreload_drd_x86_linux_so_CPPFLAGS = $(AM_CPPFLAGS_X86_LINUX)
vgpreload_drd_x86_linux_so_CFLAGS = $(AM_CFLAGS_X86_LINUX) $(AM_CFLAGS_PIC)
vgpreload_drd_x86_linux_so_CCASFLAGS = $(AM_CCASFLAGS_X86_LINUX)
@@ -46,7 +51,7 @@
vgpreload_drd_x86_linux_so_LDFLAGS = $(PRELOAD_LDFLAGS_X86_LINUX)\
$(LIBREPLACEMALLOC_LDFLAGS_X86_LINUX)
-vgpreload_drd_amd64_linux_so_SOURCES = $(VGPRELOAD_DRD_SOURCES_COMMON)
+vgpreload_drd_amd64_linux_so_SOURCES = $(VGPRELOAD_DRD_SOURCES)
vgpreload_drd_amd64_linux_so_CPPFLAGS = $(AM_CPPFLAGS_AMD64_LINUX)
vgpreload_drd_amd64_linux_so_CFLAGS = $(AM_CFLAGS_AMD64_LINUX) $(AM_CFLAGS_PIC)
vgpreload_drd_amd64_linux_so_CCASFLAGS = $(AM_CCASFLAGS_AMD64_LINUX)
@@ -54,7 +59,7 @@
vgpreload_drd_amd64_linux_so_LDFLAGS = $(PRELOAD_LDFLAGS_AMD64_LINUX)\
$(LIBREPLACEMALLOC_LDFLAGS_AMD64_LINUX)
-vgpreload_drd_ppc32_linux_so_SOURCES = $(VGPRELOAD_DRD_SOURCES_COMMON)
+vgpreload_drd_ppc32_linux_so_SOURCES = $(VGPRELOAD_DRD_SOURCES)
vgpreload_drd_ppc32_linux_so_CPPFLAGS = $(AM_CPPFLAGS_PPC32_LINUX)
vgpreload_drd_ppc32_linux_so_CFLAGS = $(AM_CFLAGS_PPC32_LINUX) $(AM_CFLAGS_PIC)
vgpreload_drd_ppc32_linux_so_CCASFLAGS = $(AM_CCASFLAGS_PPC32_LINUX)
@@ -62,7 +67,7 @@
vgpreload_drd_ppc32_linux_so_LDFLAGS = $(PRELOAD_LDFLAGS_PPC32_LINUX)\
$(LIBREPLACEMALLOC_LDFLAGS_PPC32_LINUX)
-vgpreload_drd_ppc64_linux_so_SOURCES = $(VGPRELOAD_DRD_SOURCES_COMMON)
+vgpreload_drd_ppc64_linux_so_SOURCES = $(VGPRELOAD_DRD_SOURCES)
vgpreload_drd_ppc64_linux_so_CPPFLAGS = $(AM_CPPFLAGS_PPC64_LINUX)
vgpreload_drd_ppc64_linux_so_CFLAGS = $(AM_CFLAGS_PPC64_LINUX) $(AM_CFLAGS_PIC)
vgpreload_drd_ppc64_linux_so_CCASFLAGS = $(AM_CCASFLAGS_PPC64_LINUX)
@@ -70,7 +75,7 @@
vgpreload_drd_ppc64_linux_so_LDFLAGS = $(PRELOAD_LDFLAGS_PPC64_LINUX)\
$(LIBREPLACEMALLOC_LDFLAGS_PPC64_LINUX)
-vgpreload_drd_ppc32_aix5_so_SOURCES = $(VGPRELOAD_DRD_SOURCES_COMMON)
+vgpreload_drd_ppc32_aix5_so_SOURCES = $(VGPRELOAD_DRD_SOURCES)
vgpreload_drd_ppc32_aix5_so_CPPFLAGS = $(AM_CPPFLAGS_PPC32_AIX5)
vgpreload_drd_ppc32_aix5_so_CFLAGS = $(AM_CFLAGS_PPC32_AIX5) $(AM_CFLAGS_PIC)
vgpreload_drd_ppc32_aix5_so_CCASFLAGS = $(AM_CCASFLAGS_PPC32_AIX5)
@@ -78,7 +83,7 @@
vgpreload_drd_ppc32_aix5_so_LDFLAGS = $(PRELOAD_LDFLAGS_PPC32_AIX5)\
$(LIBREPLACEMALLOC_LDFLAGS_PPC32_AIX5)
-vgpreload_drd_ppc64_aix5_so_SOURCES = $(VGPRELOAD_DRD_SOURCES_COMMON)
+vgpreload_drd_ppc64_aix5_so_SOURCES = $(VGPRELOAD_DRD_SOURCES)
vgpreload_drd_ppc64_aix5_so_CPPFLAGS = $(AM_CPPFLAGS_PPC64_AIX5)
vgpreload_drd_ppc64_aix5_so_CFLAGS = $(AM_CFLAGS_PPC64_AIX5) $(AM_CFLAGS_PIC)
vgpreload_drd_ppc64_aix5_so_CCASFLAGS = $(AM_CCASFLAGS_PPC64_AIX5)
@@ -87,7 +92,7 @@
$(LIBREPLACEMALLOC_LDFLAGS_PPC64_AIX5)
-DRD_SOURCES_COMMON = \
+DRD_SOURCES = \
drd_barrier.c \
drd_clientobj.c \
drd_clientreq.c \
@@ -122,42 +127,42 @@
drd_vc.h \
pub_drd_bitmap.h
-drd_x86_linux_SOURCES = $(DRD_SOURCES_COMMON)
+drd_x86_linux_SOURCES = $(DRD_SOURCES)
drd_x86_linux_CPPFLAGS = $(AM_CPPFLAGS_X86_LINUX)
drd_x86_linux_CFLAGS = $(AM_CFLAGS_X86_LINUX)
drd_x86_linux_DEPENDENCIES = $(COREGRIND_LIBS_X86_LINUX)
drd_x86_linux_LDADD = $(TOOL_LDADD_X86_LINUX)
drd_x86_linux_LDFLAGS = $(TOOL_LDFLAGS_X86_LINUX)
-drd_amd64_linux_SOURCES = $(DRD_SOURCES_COMMON)
+drd_amd64_linux_SOURCES = $(DRD_SOURCES)
drd_amd64_linux_CPPFLAGS = $(AM_CPPFLAGS_AMD64_LINUX)
drd_amd64_linux_CFLAGS = $(AM_CFLAGS_AMD64_LINUX)
drd_amd64_linux_DEPENDENCIES = $(COREGRIND_LIBS_AMD64_LINUX)
drd_amd64_linux_LDADD = $(TOOL_LDADD_AMD64_LINUX)
drd_amd64_linux_LDFLAGS = $(TOOL_LDFLAGS_AMD64_LINUX)
-drd_ppc32_linux_SOURCES = $(DRD_SOURCES_COMMON)
+drd_ppc32_linux_SOURCES = $(DRD_SOURCES)
drd_ppc32_linux_CPPFLAGS = $(AM_CPPFLAGS_PPC32_LINUX)
drd_ppc32_linux_CFLAGS = $(AM_CFLAGS_PPC32_LINUX)
drd_ppc32_linux_DEPENDENCIES = $(COREGRIND_LIBS_PPC32_LINUX)
drd_ppc32_linux_LDADD = $(TOOL_LDADD_PPC32_LINUX)
drd_ppc32_linux_LDFLAGS = $(TOOL_LDFLAGS_PPC32_LINUX)
-drd_ppc64_linux_SOURCES = $(DRD_SOURCES_COMMON)
+drd_ppc64_linux_SOURCES = $(DRD_SOURCES)
drd_ppc64_linux_CPPFLAGS = $(AM_CPPFLAGS_PPC64_LINUX)
drd_ppc64_linux_CFLAGS = $(AM_CFLAGS_PPC64_LINUX)
drd_ppc64_linux_DEPENDENCIES = $(COREGRIND_LIBS_PPC64_LINUX)
drd_ppc64_linux_LDADD = $(TOOL_LDADD_PPC64_LINUX)
drd_ppc64_linux_LDFLAGS = $(TOOL_LDFLAGS_PPC64_LINUX)
-drd_ppc32_aix5_SOURCES = $(DRD_SOURCES_COMMON)
+drd_ppc32_aix5_SOURCES = $(DRD_SOURCES)
drd_ppc32_aix5_CPPFLAGS = $(AM_CPPFLAGS_PPC32_AIX5)
drd_ppc32_aix5_CFLAGS = $(AM_CFLAGS_PPC32_AIX5)
drd_ppc32_aix5_DEPENDENCIES = $(COREGRIND_LIBS_PPC32_AIX5)
drd_ppc32_aix5_LDADD = $(TOOL_LDADD_PPC32_AIX5)
drd_ppc32_aix5_LDFLAGS = $(TOOL_LDFLAGS_PPC32_AIX5)
-drd_ppc64_aix5_SOURCES = $(DRD_SOURCES_COMMON)
+drd_ppc64_aix5_SOURCES = $(DRD_SOURCES)
drd_ppc64_aix5_CPPFLAGS = $(AM_CPPFLAGS_PPC64_AIX5)
drd_ppc64_aix5_CFLAGS = $(AM_CFLAGS_PPC64_AIX5)
drd_ppc64_aix5_DEPENDENCIES = $(COREGRIND_LIBS_PPC64_AIX5)
Added: trunk/drd/drd_qtcore_intercepts.c
===================================================================
--- trunk/drd/drd_qtcore_intercepts.c (rev 0)
+++ trunk/drd/drd_qtcore_intercepts.c 2008-07-07 17:27:48 UTC (rev 8383)
@@ -0,0 +1,204 @@
+
+/*--------------------------------------------------------------------*/
+/*--- Client-space code for drd. drd_qtcore_intercepts.c ---*/
+/*--------------------------------------------------------------------*/
+
+/*
+ This file is part of drd, a data race detector.
+
+ Copyright (C) 2006-2008 Bart Van Assche
+ bar...@gm...
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307, USA.
+
+ The GNU General Public License is contained in the file COPYING.
+*/
+
+/* ---------------------------------------------------------------------
+ ALL THE CODE IN THIS FILE RUNS ON THE SIMULATED CPU.
+
+ These functions are not called directly - they're the targets of code
+ redirection or load notifications (see pub_core_redir.h for info).
+ They're named weirdly so that the intercept code can find them when the
+ shared object is initially loaded.
+
+ Note that this filename has the "drd_" prefix because it can appear
+ in stack traces, and the "drd_" makes it a little clearer that it
+ originates from Valgrind.
+ ------------------------------------------------------------------ */
+
+#include <assert.h>
+#include "drd_clientreq.h"
+#include "pub_tool_redir.h"
+
+
+// Defines.
+
+#define QT4CORE_FUNC(ret_ty, f, args...) \
+ ret_ty VG_WRAP_FUNCTION_ZU(libQtCoreZdsoZd4,f)(args); \
+ ret_ty VG_WRAP_FUNCTION_ZU(libQtCoreZdsoZd4,f)(args)
+
+
+
+//////////////////////////////////////////////////////////////////
+// QMutex intercepts.
+//////////////////////////////////////////////////////////////////
+
+
+typedef enum { qt_nonrecursive = 0, qt_recursive = 1 } qt_mutex_mode;
+
+
+/** Convert a Qt4 mutex type to a DRD mutex type. */
+static MutexT qt_to_drd_mutex_type(qt_mutex_mode mode)
+{
+ switch (mode)
+ {
+ case qt_nonrecursive:
+ return mutex_type_default_mutex;
+ case qt_recursive:
+ return mutex_type_recursive_mutex;
+ }
+ return mutex_type_invalid_mutex;
+}
+
+/** Find out the type of a Qt4 mutex (recursive or not).
+ * Since it's not possible to do this in a portable way, return
+ * mutex_type_unknown and let drd_mutex.c look up the real mutex type.
+ */
+static MutexT mutex_type(void* qt4_mutex)
+{
+ return mutex_type_unknown;
+}
+
+
+// QMutex::QMutex(RecursionMode) -- _ZN6QMutexC1ENS_13RecursionModeE,
+QT4CORE_FUNC(void, _ZN6QMutexC1ENS_13RecursionModeE,
+ void* mutex,
+ qt_mutex_mode mode)
+{
+ int ret;
+ int res;
+ OrigFn fn;
+ VALGRIND_GET_ORIG_FN(fn);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_MUTEX_INIT,
+ mutex, qt_to_drd_mutex_type(mode), 0, 0, 0);
+ CALL_FN_W_WW(ret, fn, mutex, mode);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_MUTEX_INIT,
+ mutex, 0, 0, 0, 0);
+}
+
+// QMutex::QMutex(RecursionMode) -- _ZN6QMutexC2ENS_13RecursionModeE
+QT4CORE_FUNC(void, _ZN6QMutexC2ENS_13RecursionModeE,
+ void* mutex,
+ qt_mutex_mode mode)
+{
+ int ret;
+ int res;
+ OrigFn fn;
+ VALGRIND_GET_ORIG_FN(fn);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_MUTEX_INIT,
+ mutex, qt_to_drd_mutex_type(mode), 0, 0, 0);
+ CALL_FN_W_WW(ret, fn, mutex, mode);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_MUTEX_INIT,
+ mutex, 0, 0, 0, 0);
+}
+
+// QMutex::~QMutex() -- _ZN6QMutexD1Ev
+QT4CORE_FUNC(void, _ZN6QMutexD1Ev,
+ void* mutex)
+{
+ int ret;
+ int res;
+ OrigFn fn;
+ VALGRIND_GET_ORIG_FN(fn);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_MUTEX_DESTROY,
+ mutex, 0, 0, 0, 0);
+ CALL_FN_W_W(ret, fn, mutex);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_MUTEX_DESTROY,
+ mutex, mutex_type(mutex), 0, 0, 0);
+}
+
+// QMutex::~QMutex() -- _ZN6QMutexD2Ev
+QT4CORE_FUNC(void, _ZN6QMutexD2Ev,
+ void** mutex)
+{
+ int ret;
+ int res;
+ OrigFn fn;
+ VALGRIND_GET_ORIG_FN(fn);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_MUTEX_DESTROY,
+ mutex, 0, 0, 0, 0);
+ CALL_FN_W_W(ret, fn, mutex);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_MUTEX_DESTROY,
+ mutex, mutex_type(mutex), 0, 0, 0);
+}
+
+// QMutex::lock() -- _ZN6QMutex4lockEv
+QT4CORE_FUNC(void, _ZN6QMutex4lockEv,
+ void* mutex)
+{
+ int ret;
+ int res;
+ OrigFn fn;
+ VALGRIND_GET_ORIG_FN(fn);
+ VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__PRE_MUTEX_LOCK,
+ mutex, mutex_type(mutex), 0, 0, 0);
+ CALL_FN_W_W(ret, fn, mutex);
+ VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__POST_MUTEX_LOCK,
+ mutex, 1, 0, 0, 0);
+}
+
+// QMutex::tryLock() -- _ZN6QMutex7tryLockEv
+QT4CORE_FUNC(int, _ZN6QMutex7tryLockEv,
+ void* mutex)
+{
+ int ret;
+ int res;
+ OrigFn fn;
+ VALGRIND_GET_ORIG_FN(fn);
+ VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__PRE_MUTEX_LOCK,
+ mutex, mutex_type(mutex), 1, 0, 0);
+ CALL_FN_W_W(ret, fn, mutex);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_MUTEX_LOCK,
+ mutex, ret, 0, 0, 0);
+ return ret;
+}
+
+// QMutex::tryLock(int) -- _ZN6QMutex7tryLockEi
+QT4CORE_FUNC(int, _ZN6QMutex7tryLockEi,
+ void* mutex,
+ int timeout)
+{
+ // Not yet implemented.
+ assert(0);
+}
+
+// QMutex::unlock() -- _ZN6QMutex6unlockEv
+QT4CORE_FUNC(void, _ZN6QMutex6unlockEv,
+ void* mutex)
+{
+ int ret;
+ int res;
+ OrigFn fn;
+ VALGRIND_GET_ORIG_FN(fn);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1,
+ VG_USERREQ__PRE_MUTEX_UNLOCK,
+ mutex, mutex_type(mutex), 0, 0, 0);
+ CALL_FN_W_W(ret, fn, mutex);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1,
+ VG_USERREQ__POST_MUTEX_UNLOCK,
+ mutex, 0, 0, 0, 0);
+}
|
|
From: <sv...@va...> - 2008-07-07 17:22:32
|
Author: bart
Date: 2008-07-07 18:22:41 +0100 (Mon, 07 Jul 2008)
New Revision: 8382
Log:
Added Qt4 semaphore test.
Added:
trunk/drd/tests/qt4_semaphore.cpp
trunk/drd/tests/qt4_semaphore.stderr.exp
trunk/drd/tests/qt4_semaphore.vgtest
Modified:
trunk/drd/tests/Makefile.am
Modified: trunk/drd/tests/Makefile.am
===================================================================
--- trunk/drd/tests/Makefile.am 2008-07-07 17:19:17 UTC (rev 8381)
+++ trunk/drd/tests/Makefile.am 2008-07-07 17:22:41 UTC (rev 8382)
@@ -94,6 +94,8 @@
pth_spinlock.vgtest \
qt4_mutex.stderr.exp \
qt4_mutex.vgtest \
+ qt4_semaphore.stderr.exp \
+ qt4_semaphore.vgtest \
recursive_mutex.stderr.exp \
recursive_mutex.stdout.exp \
recursive_mutex.vgtest \
@@ -232,7 +234,7 @@
trylock
if HAVE_QTCORE
-check_PROGRAMS += qt4_mutex
+check_PROGRAMS += qt4_mutex qt4_semaphore
endif
if HAVE_OPENMP
@@ -308,7 +310,10 @@
if HAVE_QTCORE
qt4_mutex_SOURCES = qt4_mutex.cpp
-qt4_mutex_LDADD = -lpthread -lQtCore
+qt4_mutex_LDADD = -lQtCore -lpthread
+
+qt4_semaphore_SOURCES = qt4_semaphore.cpp
+qt4_semaphore_LDADD = -lQtCore -lpthread
endif
recursive_mutex_SOURCES = recursive_mutex.c
Added: trunk/drd/tests/qt4_semaphore.cpp
===================================================================
--- trunk/drd/tests/qt4_semaphore.cpp (rev 0)
+++ trunk/drd/tests/qt4_semaphore.cpp 2008-07-07 17:22:41 UTC (rev 8382)
@@ -0,0 +1,82 @@
+/// Qt4 semaphore test.
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <QtCore/QThread> // class QMutex
+#include <QtCore/QSemaphore> // class QSemaphore
+#include <cstdio> // fprintf()
+#include <cstdlib> // atoi()
+#include <new>
+#include <pthread.h> // pthread_barrier_t
+#include <vector>
+
+
+static pthread_barrier_t s_barrier;
+static QSemaphore* s_pSema;
+static int s_iterations;
+static int s_counter;
+
+
+class IncThread: public QThread
+{
+ virtual void run();
+};
+
+void IncThread::run()
+{
+ int i;
+
+ pthread_barrier_wait(&s_barrier);
+ for (i = s_iterations; i > 0; i--)
+ {
+ s_pSema->acquire();
+ s_counter++;
+ s_pSema->release();
+ }
+}
+
+int main(int argc, char** argv)
+{
+ int i;
+ const int n_threads = 10;
+ std::vector<QThread*> tid(n_threads);
+
+ s_iterations = argc > 1 ? atoi(argv[1]) : 1000;
+
+ fprintf(stderr, "Start of test.\n");
+
+ {
+ // Stack-allocated semaphore.
+ QSemaphore S(1);
+ S.acquire();
+ S.release();
+ S.acquire();
+ S.release();
+ }
+
+ pthread_barrier_init(&s_barrier, 0, n_threads);
+ s_pSema = new QSemaphore(1);
+ for (i = 0; i < n_threads; i++)
+ {
+ tid[i] = new IncThread;
+ tid[i]->start();
+ }
+ for (i = 0; i < n_threads; i++)
+ {
+ tid[i]->wait();
+ delete tid[i];
+ }
+ delete s_pSema;
+ s_pSema = 0;
+ pthread_barrier_destroy(&s_barrier);
+
+ if (s_counter == n_threads * s_iterations)
+ fprintf(stderr, "Test successful.\n");
+ else
+ fprintf(stderr, "Test failed: counter = %d, should be %d\n",
+ s_counter, n_threads * s_iterations);
+
+ return 0;
+}
Added: trunk/drd/tests/qt4_semaphore.stderr.exp
===================================================================
--- trunk/drd/tests/qt4_semaphore.stderr.exp (rev 0)
+++ trunk/drd/tests/qt4_semaphore.stderr.exp 2008-07-07 17:22:41 UTC (rev 8382)
@@ -0,0 +1,5 @@
+
+Start of test.
+Test successful.
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Added: trunk/drd/tests/qt4_semaphore.vgtest
===================================================================
--- trunk/drd/tests/qt4_semaphore.vgtest (rev 0)
+++ trunk/drd/tests/qt4_semaphore.vgtest 2008-07-07 17:22:41 UTC (rev 8382)
@@ -0,0 +1,2 @@
+vgopts: --check-stack-var=yes
+prog: qt4_semaphore
|
|
From: <sv...@va...> - 2008-07-07 17:19:11
|
Author: bart Date: 2008-07-07 18:19:17 +0100 (Mon, 07 Jul 2008) New Revision: 8381 Log: Fixed comments. Modified: trunk/drd/tests/qt4_mutex.cpp Modified: trunk/drd/tests/qt4_mutex.cpp =================================================================== --- trunk/drd/tests/qt4_mutex.cpp 2008-07-07 16:58:03 UTC (rev 8380) +++ trunk/drd/tests/qt4_mutex.cpp 2008-07-07 17:19:17 UTC (rev 8381) @@ -4,12 +4,12 @@ #define _GNU_SOURCE #endif -#include <QtCore/QThread> // class QMutex -#include <QtCore/QMutex> -#include <cstdio> // fprintf() -#include <cstdlib> // atoi() +#include <QtCore/QThread> // class QThread +#include <QtCore/QMutex> // class QMutex +#include <cstdio> // fprintf() +#include <cstdlib> // atoi() #include <new> -#include <pthread.h> // pthread_barrier_t +#include <pthread.h> // pthread_barrier_t #include <vector> |
|
From: <sv...@va...> - 2008-07-07 16:57:59
|
Author: bart
Date: 2008-07-07 17:58:03 +0100 (Mon, 07 Jul 2008)
New Revision: 8380
Log:
Added configure test for Qt4.
Modified:
trunk/configure.in
Modified: trunk/configure.in
===================================================================
--- trunk/configure.in 2008-07-07 16:57:38 UTC (rev 8379)
+++ trunk/configure.in 2008-07-07 16:58:03 UTC (rev 8380)
@@ -1233,6 +1233,13 @@
sys/types.h \
])
+AC_LANG(C++)
+AC_CHECK_HEADERS([ \
+ QtCore/QMutex \
+ QtCore/QSemaphore \
+ QtCore/QThread \
+ ])
+AC_LANG(C)
# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_UID_T
@@ -1247,7 +1254,13 @@
AC_TYPE_SIGNAL
AC_CHECK_LIB([rt], [clock_gettime])
+AC_CHECK_LIB([QtCore], [_ZN6QMutex4lockEv]) # QMutex::lock()
+# AC_CHECK_LIB adds any library found to the variable LIBS, and links these
+# libraries with any shared object and/or executable. This is NOT what we
+# want for e.g. vgpreload_core-x86-linux.so
+LIBS=""
+
AC_CHECK_FUNCS([ \
clock_gettime\
epoll_create \
@@ -1370,6 +1383,24 @@
AM_CONDITIONAL(BUILD_MPIWRAP_SEC, test x$ac_have_mpi2_sec = xyes)
+# does this compiler have the include file <Qt/qmutex.h> and does it have
+# libQtCore.so ?
+
+AC_MSG_CHECKING([for Qt4 core library])
+
+if grep -q -w '^#define HAVE_LIBQTCORE 1$' config.h \
+ && grep -q -w '^#define HAVE_QTCORE_QMUTEX 1$' config.h
+then
+ ac_have_qtcore=yes
+ AC_MSG_RESULT([yes])
+else
+ ac_have_qtcore=no
+ AC_MSG_RESULT([no])
+fi
+
+AM_CONDITIONAL([HAVE_QTCORE], [test x$ac_have_qtcore = xyes])
+
+
# -------------------- ok. We're done. --------------------
AC_OUTPUT(
|
|
From: <sv...@va...> - 2008-07-07 16:57:31
|
Author: bart
Date: 2008-07-07 17:57:38 +0100 (Mon, 07 Jul 2008)
New Revision: 8379
Log:
Added Qt4 mutex test.
Added:
trunk/drd/tests/qt4_mutex.cpp
trunk/drd/tests/qt4_mutex.stderr.exp
trunk/drd/tests/qt4_mutex.vgtest
Added: trunk/drd/tests/qt4_mutex.cpp
===================================================================
--- trunk/drd/tests/qt4_mutex.cpp (rev 0)
+++ trunk/drd/tests/qt4_mutex.cpp 2008-07-07 16:57:38 UTC (rev 8379)
@@ -0,0 +1,82 @@
+/// Qt4 mutex test.
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <QtCore/QThread> // class QMutex
+#include <QtCore/QMutex>
+#include <cstdio> // fprintf()
+#include <cstdlib> // atoi()
+#include <new>
+#include <pthread.h> // pthread_barrier_t
+#include <vector>
+
+
+static pthread_barrier_t s_barrier;
+static QMutex* s_pMutex;
+static int s_iterations;
+static int s_counter;
+
+
+class IncThread: public QThread
+{
+ virtual void run();
+};
+
+void IncThread::run()
+{
+ int i;
+
+ pthread_barrier_wait(&s_barrier);
+ for (i = s_iterations; i > 0; i--)
+ {
+ s_pMutex->lock();
+ s_counter++;
+ s_pMutex->unlock();
+ }
+}
+
+int main(int argc, char** argv)
+{
+ int i;
+ const int n_threads = 10;
+ std::vector<QThread*> tid(n_threads);
+
+ s_iterations = argc > 1 ? atoi(argv[1]) : 1000;
+
+ fprintf(stderr, "Start of test.\n");
+
+ {
+ // Stack-allocated mutex.
+ QMutex M(QMutex::Recursive);
+ M.lock();
+ M.tryLock();
+ M.unlock();
+ M.unlock();
+ }
+
+ pthread_barrier_init(&s_barrier, 0, n_threads);
+ s_pMutex = new QMutex();
+ for (i = 0; i < n_threads; i++)
+ {
+ tid[i] = new IncThread;
+ tid[i]->start();
+ }
+ for (i = 0; i < n_threads; i++)
+ {
+ tid[i]->wait();
+ delete tid[i];
+ }
+ delete s_pMutex;
+ s_pMutex = 0;
+ pthread_barrier_destroy(&s_barrier);
+
+ if (s_counter == n_threads * s_iterations)
+ fprintf(stderr, "Test successful.\n");
+ else
+ fprintf(stderr, "Test failed: counter = %d, should be %d\n",
+ s_counter, n_threads * s_iterations);
+
+ return 0;
+}
Added: trunk/drd/tests/qt4_mutex.stderr.exp
===================================================================
--- trunk/drd/tests/qt4_mutex.stderr.exp (rev 0)
+++ trunk/drd/tests/qt4_mutex.stderr.exp 2008-07-07 16:57:38 UTC (rev 8379)
@@ -0,0 +1,5 @@
+
+Start of test.
+Test successful.
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Added: trunk/drd/tests/qt4_mutex.vgtest
===================================================================
--- trunk/drd/tests/qt4_mutex.vgtest (rev 0)
+++ trunk/drd/tests/qt4_mutex.vgtest 2008-07-07 16:57:38 UTC (rev 8379)
@@ -0,0 +1,2 @@
+vgopts: --check-stack-var=yes
+prog: qt4_mutex
|
|
From: <sv...@va...> - 2008-07-07 16:53:40
|
Author: bart
Date: 2008-07-07 17:53:45 +0100 (Mon, 07 Jul 2008)
New Revision: 8378
Log:
Enabled support for nesting mutexes and condition variables in higher-level synchronization primitives. Changed mutex tracing output slightly.
Modified:
trunk/drd/tests/Makefile.am
trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3
trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b
trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5
trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc
trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.8
Modified: trunk/drd/tests/Makefile.am
===================================================================
--- trunk/drd/tests/Makefile.am 2008-07-07 16:53:07 UTC (rev 8377)
+++ trunk/drd/tests/Makefile.am 2008-07-07 16:53:45 UTC (rev 8378)
@@ -92,6 +92,8 @@
pth_inconsistent_cond_wait.vgtest \
pth_spinlock.stderr.exp \
pth_spinlock.vgtest \
+ qt4_mutex.stderr.exp \
+ qt4_mutex.vgtest \
recursive_mutex.stderr.exp \
recursive_mutex.stdout.exp \
recursive_mutex.vgtest \
@@ -176,7 +178,7 @@
-I$(top_builddir)/include -I$(top_srcdir)/VEX/pub
AM_CXXFLAGS = $(AM_CFLAGS)
-check_PROGRAMS_COMMON = \
+check_PROGRAMS = \
drd_bitmap_test \
fp_race \
hg01_all_ok \
@@ -229,17 +231,15 @@
tc24_nonzero_sem \
trylock
-check_PROGRAMS_OPENMP = omp_matinv omp_prime
+if HAVE_QTCORE
+check_PROGRAMS += qt4_mutex
+endif
if HAVE_OPENMP
-check_PROGRAMS = $(check_PROGRAMS_COMMON) $(check_PROGRAMS_OPENMP)
-else
-check_PROGRAMS = $(check_PROGRAMS_COMMON)
+check_PROGRAMS += omp_matinv omp_prime
endif
-# tc14_laog_dinphils -- hangs.
-
drd_bitmap_test_SOURCES = drd_bitmap_test.c
drd_bitmap_test_CFLAGS = $(AM_CFLAGS) -O2 \
-DENABLE_DRD_CONSISTENCY_CHECKS\
@@ -306,6 +306,11 @@
pth_spinlock_SOURCES = pth_spinlock.c
pth_spinlock_LDADD = -lpthread
+if HAVE_QTCORE
+qt4_mutex_SOURCES = qt4_mutex.cpp
+qt4_mutex_LDADD = -lpthread -lQtCore
+endif
+
recursive_mutex_SOURCES = recursive_mutex.c
recursive_mutex_LDADD = -lpthread
Modified: trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3
===================================================================
--- trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3 2008-07-07 16:53:07 UTC (rev 8377)
+++ trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3 2008-07-07 16:53:45 UTC (rev 8378)
@@ -41,7 +41,7 @@
at 0x........: pthread_mutex_trylock (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:116)
[1/1] post_mutex_lock invalid mutex 0x........ rc 0 owner 0 (locking failed)
-[1/1] pre_mutex_lock invalid mutex 0x........ rc 0 owner 0
+[1/1] mutex_trylock invalid mutex 0x........ rc 0 owner 0
The object at address 0x........ is not a mutex.
at 0x........: pthread_mutex_timedlock (drd_pthread_intercepts.c:?)
@@ -160,57 +160,57 @@
Destroying locked rwlock: rwlock 0x.........
at 0x........: main (tc20_verifywrap.c:262)
-[1/1] mutex_destroy error checking mutex 0x........
+[1/1] mutex_destroy error checking mutex 0x........ rc 1 owner 1
Destroying locked mutex: mutex 0x........, recursion count 1, owner 1.
at 0x........: main (tc20_verifywrap.c:262)
-[1/1] mutex_destroy invalid mutex 0x........
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 0
+[1/1] mutex_destroy invalid mutex 0x........ rc 0 owner 0
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 0
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 0
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
Modified: trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b
===================================================================
--- trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b 2008-07-07 16:53:07 UTC (rev 8377)
+++ trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.3-b 2008-07-07 16:53:45 UTC (rev 8378)
@@ -41,7 +41,7 @@
at 0x........: pthread_mutex_trylock (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:116)
[1/1] post_mutex_lock invalid mutex 0x........ rc 0 owner 0 (locking failed)
-[1/1] pre_mutex_lock invalid mutex 0x........ rc 0 owner 0
+[1/1] mutex_trylock invalid mutex 0x........ rc 0 owner 0
The object at address 0x........ is not a mutex.
at 0x........: pthread_mutex_timedlock (drd_pthread_intercepts.c:?)
Modified: trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5
===================================================================
--- trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5 2008-07-07 16:53:07 UTC (rev 8377)
+++ trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5 2008-07-07 16:53:45 UTC (rev 8378)
@@ -22,14 +22,14 @@
at 0x........: pthread_mutex_init (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:92)
[1/1] mutex_init mutex 0x........
-[1/1] pre_mutex_lock mutex 0x........ rc 0 owner 0
+[1/1] mutex_trylock mutex 0x........ rc 0 owner 0
[1/1] post_mutex_lock mutex 0x........ rc 0 owner 0
-[1/1] mutex_destroy mutex 0x........
+[1/1] mutex_destroy mutex 0x........ rc 1 owner 1
Destroying locked mutex: mutex 0x........, recursion count 1, owner 1.
at 0x........: pthread_mutex_destroy (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:102)
-[1/1] pre_mutex_lock invalid mutex 0x........ rc 0 owner 0
+[1/1] mutex_trylock invalid mutex 0x........ rc 0 owner 0
The object at address 0x........ is not a mutex.
at 0x........: pthread_mutex_lock (drd_pthread_intercepts.c:?)
@@ -47,7 +47,7 @@
at 0x........: pthread_mutex_lock (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:108)
[1/1] post_mutex_lock invalid mutex 0x........ rc 0 owner 0 (locking failed)
-[1/1] pre_mutex_lock invalid mutex 0x........ rc 0 owner 0
+[1/1] mutex_trylock invalid mutex 0x........ rc 0 owner 0
The object at address 0x........ is not a mutex.
at 0x........: pthread_mutex_timedlock (drd_pthread_intercepts.c:?)
@@ -166,57 +166,57 @@
Destroying locked rwlock: rwlock 0x.........
at 0x........: main (tc20_verifywrap.c:262)
-[1/1] mutex_destroy error checking mutex 0x........
+[1/1] mutex_destroy error checking mutex 0x........ rc 1 owner 1
Destroying locked mutex: mutex 0x........, recursion count 1, owner 1.
at 0x........: main (tc20_verifywrap.c:262)
-[1/1] mutex_destroy invalid mutex 0x........
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 0
+[1/1] mutex_destroy invalid mutex 0x........ rc 0 owner 0
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 0
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 0
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
-[1/1] pre_mutex_lock recursive mutex 0x........ rc 0 owner 1
+[1/1] mutex_trylock recursive mutex 0x........ rc 0 owner 1
[1/1] post_mutex_lock recursive mutex 0x........ rc 0 owner 1
[1/1] mutex_unlock recursive mutex 0x........ rc 1
Modified: trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc
===================================================================
--- trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc 2008-07-07 16:53:07 UTC (rev 8377)
+++ trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.5-ppc 2008-07-07 16:53:45 UTC (rev 8378)
@@ -22,14 +22,14 @@
at 0x........: pthread_mutex_init (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:92)
[1/1] mutex_init mutex 0x........
-[1/1] pre_mutex_lock mutex 0x........ rc 0 owner 0
+[1/1] mutex_trylock mutex 0x........ rc 0 owner 0
[1/1] post_mutex_lock mutex 0x........ rc 0 owner 0
-[1/1] mutex_destroy mutex 0x........
+[1/1] mutex_destroy mutex 0x........ rc 1 owner 1
Destroying locked mutex: mutex 0x........, recursion count 1, owner 1.
at 0x........: pthread_mutex_destroy (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:102)
-[1/1] pre_mutex_lock invalid mutex 0x........ rc 0 owner 0
+[1/1] mutex_trylock invalid mutex 0x........ rc 0 owner 0
The object at address 0x........ is not a mutex.
at 0x........: pthread_mutex_lock (drd_pthread_intercepts.c:?)
@@ -47,7 +47,7 @@
at 0x........: pthread_mutex_lock (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:108)
[1/1] post_mutex_lock invalid mutex 0x........ rc 0 owner 0 (locking failed)
-[1/1] pre_mutex_lock invalid mutex 0x........ rc 0 owner 0
+[1/1] mutex_trylock invalid mutex 0x........ rc 0 owner 0
The object at address 0x........ is not a mutex.
at 0x........: pthread_mutex_timedlock (drd_pthread_intercepts.c:?)
Modified: trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.8
===================================================================
--- trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.8 2008-07-07 16:53:07 UTC (rev 8377)
+++ trunk/drd/tests/tc20_verifywrap2.stderr.exp-glibc2.8 2008-07-07 16:53:45 UTC (rev 8378)
@@ -22,14 +22,14 @@
at 0x........: pthread_mutex_init (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:92)
[1/1] mutex_init mutex 0x........
-[1/1] pre_mutex_lock mutex 0x........ rc 0 owner 0
+[1/1] mutex_trylock mutex 0x........ rc 0 owner 0
[1/1] post_mutex_lock mutex 0x........ rc 0 owner 0
-[1/1] mutex_destroy mutex 0x........
+[1/1] mutex_destroy mutex 0x........ rc 1 owner 1
Destroying locked mutex: mutex 0x........, recursion count 1, owner 1.
at 0x........: pthread_mutex_destroy (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:102)
-[1/1] pre_mutex_lock invalid mutex 0x........ rc 0 owner 0
+[1/1] mutex_trylock invalid mutex 0x........ rc 0 owner 0
The object at address 0x........ is not a mutex.
at 0x........: pthread_mutex_lock (drd_pthread_intercepts.c:?)
@@ -47,7 +47,7 @@
at 0x........: pthread_mutex_lock (drd_pthread_intercepts.c:?)
by 0x........: main (tc20_verifywrap.c:108)
[1/1] post_mutex_lock invalid mutex 0x........ rc 0 owner 0 (locking failed)
-[1/1] pre_mutex_lock invalid mutex 0x........ rc 0 owner 0
+[1/1] mutex_trylock invalid mutex 0x........ rc 0 owner 0
The object at address 0x........ is not a mutex.
at 0x........: pthread_mutex_timedlock (drd_pthread_intercepts.c:?)
|
|
From: <sv...@va...> - 2008-07-07 16:53:00
|
Author: bart
Date: 2008-07-07 17:53:07 +0100 (Mon, 07 Jul 2008)
New Revision: 8377
Log:
Enabled support for nesting mutexes and condition variables in higher-level synchronization primitives. Changed mutex tracing output slightly.
Modified:
trunk/drd/drd_clientreq.c
trunk/drd/drd_clientreq.h
trunk/drd/drd_mutex.c
trunk/drd/drd_pthread_intercepts.c
Modified: trunk/drd/drd_clientreq.c
===================================================================
--- trunk/drd/drd_clientreq.c 2008-07-07 16:49:54 UTC (rev 8376)
+++ trunk/drd/drd_clientreq.c 2008-07-07 16:53:07 UTC (rev 8377)
@@ -257,13 +257,21 @@
break;
case VG_USERREQ__PRE_COND_INIT:
- tl_assert(thread_get_synchr_nesting_count(drd_tid) == 0);
- drd_pre_cond_init(arg[1]);
+ if (thread_enter_synchr(drd_tid) == 0)
+ drd_pre_cond_init(arg[1]);
break;
+ case VG_USERREQ__POST_COND_INIT:
+ thread_leave_synchr(drd_tid);
+ break;
+
+ case VG_USERREQ__PRE_COND_DESTROY:
+ thread_enter_synchr(drd_tid);
+ break;
+
case VG_USERREQ__POST_COND_DESTROY:
- tl_assert(thread_get_synchr_nesting_count(drd_tid) == 0);
- drd_post_cond_destroy(arg[1]);
+ if (thread_leave_synchr(drd_tid) == 0)
+ drd_post_cond_destroy(arg[1]);
break;
case VG_USERREQ__PRE_COND_WAIT:
@@ -277,15 +285,23 @@
break;
case VG_USERREQ__PRE_COND_SIGNAL:
- tl_assert(thread_get_synchr_nesting_count(drd_tid) == 0);
- drd_pre_cond_signal(arg[1]);
+ if (thread_enter_synchr(drd_tid) == 0)
+ drd_pre_cond_signal(arg[1]);
break;
+ case VG_USERREQ__POST_COND_SIGNAL:
+ thread_leave_synchr(drd_tid);
+ break;
+
case VG_USERREQ__PRE_COND_BROADCAST:
- tl_assert(thread_get_synchr_nesting_count(drd_tid) == 0);
- drd_pre_cond_broadcast(arg[1]);
+ if (thread_enter_synchr(drd_tid) == 0)
+ drd_pre_cond_broadcast(arg[1]);
break;
+ case VG_USERREQ__POST_COND_BROADCAST:
+ thread_leave_synchr(drd_tid);
+ break;
+
case VG_USERREQ__PRE_SEM_INIT:
if (thread_enter_synchr(drd_tid) == 0)
drd_semaphore_init(arg[1], arg[2], arg[3]);
Modified: trunk/drd/drd_clientreq.h
===================================================================
--- trunk/drd/drd_clientreq.h 2008-07-07 16:49:54 UTC (rev 8376)
+++ trunk/drd/drd_clientreq.h 2008-07-07 16:53:07 UTC (rev 8377)
@@ -94,17 +94,27 @@
/* to notify the drd tool of a pthread_cond_init call. */
VG_USERREQ__PRE_COND_INIT,
/* args: Addr */
+ /* to notify the drd tool of a pthread_cond_init call. */
+ VG_USERREQ__POST_COND_INIT,
+ /* args: Addr */
/* to notify the drd tool of a pthread_cond_destroy call. */
+ VG_USERREQ__PRE_COND_DESTROY,
+ /* args: Addr */
+ /* to notify the drd tool of a pthread_cond_destroy call. */
VG_USERREQ__POST_COND_DESTROY,
- /* args: Addr cond */
+ /* args: Addr */
VG_USERREQ__PRE_COND_WAIT,
/* args: Addr cond, Addr mutex, MutexT mt */
VG_USERREQ__POST_COND_WAIT,
/* args: Addr cond, Addr mutex, Bool took_lock*/
VG_USERREQ__PRE_COND_SIGNAL,
/* args: Addr cond */
+ VG_USERREQ__POST_COND_SIGNAL,
+ /* args: Addr cond */
VG_USERREQ__PRE_COND_BROADCAST,
/* args: Addr cond */
+ VG_USERREQ__POST_COND_BROADCAST,
+ /* args: Addr cond */
/* To notify the drd tool of a sem_init call. */
VG_USERREQ__PRE_SEM_INIT,
@@ -179,11 +189,12 @@
typedef enum
{
- mutex_type_invalid_mutex = 0,
- mutex_type_recursive_mutex = 1,
- mutex_type_errorcheck_mutex = 2,
- mutex_type_default_mutex = 3,
- mutex_type_spinlock = 4
+ mutex_type_unknown = -1,
+ mutex_type_invalid_mutex = 0,
+ mutex_type_recursive_mutex = 1,
+ mutex_type_errorcheck_mutex = 2,
+ mutex_type_default_mutex = 3,
+ mutex_type_spinlock = 4
} MutexT;
typedef enum
Modified: trunk/drd/drd_mutex.c
===================================================================
--- trunk/drd/drd_mutex.c 2008-07-07 16:49:54 UTC (rev 8376)
+++ trunk/drd/drd_mutex.c 2008-07-07 16:53:07 UTC (rev 8377)
@@ -67,9 +67,10 @@
void mutex_initialize(struct mutex_info* const p,
const Addr mutex, const MutexT mutex_type)
{
- tl_assert(mutex != 0);
+ tl_assert(mutex);
+ tl_assert(mutex_type != mutex_type_unknown);
+ tl_assert(p->a1 == mutex);
- tl_assert(p->a1 == mutex);
p->cleanup = (void(*)(DrdClientobj*))&mutex_cleanup;
p->mutex_type = mutex_type;
p->recursion_count = 0;
@@ -87,11 +88,13 @@
if (s_trace_mutex)
{
VG_(message)(Vg_UserMsg,
- "[%d/%d] mutex_destroy %s 0x%lx",
+ "[%d/%d] mutex_destroy %s 0x%lx rc %d owner %d",
VG_(get_running_tid)(),
thread_get_running_tid(),
mutex_get_typename(p),
- p->a1);
+ p->a1,
+ p ? p->recursion_count : -1,
+ p ? p->owner : DRD_INVALID_THREADID);
}
if (mutex_is_locked(p))
@@ -138,6 +141,8 @@
return 0;
}
+ tl_assert(mutex_type != mutex_type_unknown);
+
p = &clientobj_add(mutex, ClientMutex)->mutex;
mutex_initialize(p, mutex, mutex_type);
return p;
@@ -155,6 +160,8 @@
{
struct mutex_info* p;
+ tl_assert(mutex_type != mutex_type_unknown);
+
if (s_trace_mutex)
{
VG_(message)(Vg_UserMsg,
@@ -209,18 +216,22 @@
* an attempt is made to lock recursively a synchronization object that must
* not be locked recursively.
*/
-void mutex_pre_lock(const Addr mutex, const MutexT mutex_type,
+void mutex_pre_lock(const Addr mutex, MutexT mutex_type,
const Bool trylock)
{
struct mutex_info* p;
p = mutex_get_or_allocate(mutex, mutex_type);
+ if (mutex_type == mutex_type_unknown)
+ mutex_type = p->mutex_type;
+
if (s_trace_mutex)
{
VG_(message)(Vg_UserMsg,
- "[%d/%d] pre_mutex_lock %s 0x%lx rc %d owner %d",
+ "[%d/%d] %s %s 0x%lx rc %d owner %d",
VG_(get_running_tid)(),
thread_get_running_tid(),
+ trylock ? "pre_mutex_lock " : "mutex_trylock ",
p ? mutex_get_typename(p) : "(?)",
mutex,
p ? p->recursion_count : -1,
@@ -325,12 +336,16 @@
* @note This function must be called before pthread_mutex_unlock() is called,
* or a race condition is triggered !
*/
-void mutex_unlock(const Addr mutex, const MutexT mutex_type)
+void mutex_unlock(const Addr mutex, MutexT mutex_type)
{
const DrdThreadId drd_tid = thread_get_running_tid();
const ThreadId vg_tid = VG_(get_running_tid)();
- struct mutex_info* const p = mutex_get(mutex);
+ struct mutex_info* p;
+ p = mutex_get(mutex);
+ if (mutex_type == mutex_type_unknown)
+ mutex_type = p->mutex_type;
+
if (s_trace_mutex)
{
VG_(message)(Vg_UserMsg,
Modified: trunk/drd/drd_pthread_intercepts.c
===================================================================
--- trunk/drd/drd_pthread_intercepts.c 2008-07-07 16:49:54 UTC (rev 8376)
+++ trunk/drd/drd_pthread_intercepts.c 2008-07-07 16:53:07 UTC (rev 8377)
@@ -1,6 +1,6 @@
/*--------------------------------------------------------------------*/
-/*--- Client-space code for drd. drd_intercepts.c ---*/
+/*--- Client-space code for drd. drd_pthread_intercepts.c ---*/
/*--------------------------------------------------------------------*/
/*
@@ -460,6 +460,8 @@
VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_COND_INIT,
cond, 0, 0, 0, 0);
CALL_FN_W_WW(ret, fn, cond, attr);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_COND_INIT,
+ cond, 0, 0, 0, 0);
return ret;
}
@@ -471,6 +473,8 @@
int res;
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_COND_DESTROY,
+ cond, 0, 0, 0, 0);
CALL_FN_W_W(ret, fn, cond);
VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_COND_DESTROY,
cond, 0, 0, 0, 0);
@@ -523,6 +527,8 @@
VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_COND_SIGNAL,
cond, 0, 0, 0, 0);
CALL_FN_W_W(ret, fn, cond);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_COND_SIGNAL,
+ cond, 0, 0, 0, 0);
return ret;
}
@@ -537,6 +543,8 @@
VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_COND_BROADCAST,
cond, 0, 0, 0, 0);
CALL_FN_W_W(ret, fn, cond);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_COND_BROADCAST,
+ cond, 0, 0, 0, 0);
return ret;
}
|
|
From: <sv...@va...> - 2008-07-07 16:49:47
|
Author: bart
Date: 2008-07-07 17:49:54 +0100 (Mon, 07 Jul 2008)
New Revision: 8376
Log:
Generalized one suppression pattern and added two new suppression patterns.
Modified:
trunk/glibc-2.X-drd.supp
Modified: trunk/glibc-2.X-drd.supp
===================================================================
--- trunk/glibc-2.X-drd.supp 2008-07-07 08:45:55 UTC (rev 8375)
+++ trunk/glibc-2.X-drd.supp 2008-07-07 16:49:54 UTC (rev 8376)
@@ -208,14 +208,26 @@
{
pthread
drd:ConflictingAccess
+ fun:__deallocate_stack
+}
+{
+ pthread
+ drd:ConflictingAccess
fun:free_stacks
fun:__deallocate_stack
- fun:pthread_join
- fun:pthread_join
}
{
pthread
drd:ConflictingAccess
+ obj:/lib*/libpthread-*
+ obj:/lib*/libpthread-*
+ fun:__deallocate_stack
+ fun:start_thread
+ fun:clone
+}
+{
+ pthread
+ drd:ConflictingAccess
fun:__free_tcb
}
{
|
|
From: John R.
|
Julian Seward wrote: >>What are the thoughts about implementing this desire for the error report >>to identify the caller of alloca or __chkstk? ... > The 1-element stack traces limitation exists because unwinding the stack > in general is an expensive operation, and considered too expensive to > be viable to do at every sub $N, %esp. So instead a 1-element stack > trace is made for those, which can obviously be done at JIT time since > the only required info is the current instruction's address. See > mk_ecu_Expr in coregrind/m_translate.c. > > Getting more would be a bit complex. You'd have to change mk_ecu_Expr > to generate IR that called a helper to do a depth-2 unwind, wrapped the > result up into an ECU, and returned that to the generated code. Thank you for explaining. A traceback of length 2 _is_ too expensive. However, recognizing the special case of __chkstk might work. Under Wine, the redirected code for __chkstk can be: neg %eax add %esp,%eax xchg %eax,%esp ### The allocation. Caller is (* %esp) mov (%eax),%eax ### The return address. mov %eax,(%esp) ret So the JIT translator of the allocator "xchg %eax,%esp" can verify the context by looking for those rather-unique surrounding instructions, then fetch the return address (* %esp) as the culprit, instead of using $pc. -- |
|
From: Tom H. <to...@co...> - 2008-07-07 09:01:43
|
In message <200...@ac...>
Julian Seward <js...@ac...> wrote:
> It seems to be caused by this logic in m_ume.c:
>
> 4164 tom /* The kernel maps position-independent executables at
> TASK_SIZE*2/3;
> 4164 tom duplicate this behavior as close as we can. */
> 4164 tom if (e->e.e_type == ET_DYN && ebase == 0) {
> 4164 tom ebase = VG_PGROUNDDN(info->exe_base + (info->exe_end -
> info->exe_base) * 2 / 3);
> 4164 tom }
>
> which seems reasonable; problem is info->exe_base and info->exe_end are
> both zero, having been bogusly set in initimg-linux.c thusly
>
> info->exe_base = VG_(client_base);
> info->exe_end = VG_(client_end);
>
> and VG_(client_base) / VG_(client_end) always have the value zero. (!)
> So there's some nonsense logic there.
Why is client_end zero though? That seems very odd... Is that just
because we haven't worked out the real value yet?
> Anyway, the reference to TASK_SIZE, can you clarify it? Does it mean
> that the kernel will map PIEs at 2/3 of the way along the entire address
> space of the process, left to itself? eg, at the 2.0G point if the
> kernel is doing the usual x86 3G/1G layout?
TASK_SIZE is the size of the user address space, so yes that would be
at 2G if the normal 3:1 layout is in use.
The relevant bit of code in the kernel is the ELF_ET_DYN_BASE
definition in elf.h:
/* This is the location that an ET_DYN program is loaded if exec'ed. Typical
use of this is to invoke "./ld.so someprog" to test out a new version of
the loader. We need to make sure that it is out of the way of the program
that it will "exec", and that there is sufficient room for the brk. */
#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2)
Tom
--
Tom Hughes (to...@co...)
http://www.compton.nu/
|
|
From: <sv...@va...> - 2008-07-07 08:45:55
|
Author: bart Date: 2008-07-07 09:45:55 +0100 (Mon, 07 Jul 2008) New Revision: 8375 Log: Updated internal documentation. Modified: trunk/drd/TODO.txt trunk/drd/Testing.txt trunk/drd/drd_barrier.c Modified: trunk/drd/TODO.txt =================================================================== --- trunk/drd/TODO.txt 2008-07-07 08:17:55 UTC (rev 8374) +++ trunk/drd/TODO.txt 2008-07-07 08:45:55 UTC (rev 8375) @@ -15,6 +15,7 @@ - Find out why no variable name information is printed for races detected in parallel sections of OpenMP programs. An example: ./vg-in-place --tool=exp-drd exp-drd/tests/omp_prime 4 -t 2 +- Report races in glibc on stdout / stderr back to glibc maintainers. Testing @@ -27,6 +28,8 @@ Documentation ~~~~~~~~~~~~~ +- Add comment on double checked locking. +- Add comment on circular buffers. - Explain how to handle transactions (with regard to locking order). - Continue the discussion on the Valgrind mailing list about docbook and 'make dist'. See also http://bugs.kde.org/show_bug.cgi?id=162121. Modified: trunk/drd/Testing.txt =================================================================== --- trunk/drd/Testing.txt 2008-07-07 08:17:55 UTC (rev 8374) +++ trunk/drd/Testing.txt 2008-07-07 08:45:55 UTC (rev 8375) @@ -4,20 +4,25 @@ 1. Run the regression tests. After having compiled DRD, run the following command: perl tests/vg_regtest drd -2. Test the slowdown for matinv for various matrix sizes via the script +2. Run Konstantin's regression tests: + svn checkout http://data-race-test.googlecode.com/svn/trunk drt + make -C drt/unittest -s build + ./vg-in-place --tool=drd drt/unittest/racecheck_unittest 2>&1|less +3. Test the slowdown for matinv for various matrix sizes via the script drd/scripts/run-matinv (must be about 24 for i == 1 and about 31 for i == 10 with n == 200). -3. Test whether DRD works with standard KDE applications and whether it does +4. Test whether DRD works with standard KDE applications and whether it does not print any false positives: ./vg-in-place --tool=drd kate ./vg-in-place --tool=drd --check-stack-var=yes kate ./vg-in-place --trace-children=yes --tool=drd knode ./vg-in-place --trace-children=yes --tool=drd --check-stack-var=yes knode ./vg-in-place --trace-children=yes --tool=drd amarokapp -4. Test whether DRD works with standard GNOME applications. Expect +5. Test whether DRD works with standard GNOME applications. Expect race reports triggered by ORBit_RootObject_duplicate() and after having closed the GNOME terminal window: ./vg-in-place --trace-children=yes --tool=drd gnome-terminal -5. Test DRD with Firefox. First of all, build and install Firefox 3. Next, - run the following command: +6. Test DRD with Firefox. First of all, build and install Firefox 3: + drd/scripts/download-and-build-firefox + Next, run the following command: LD_LIBRARY_PATH=$HOME/software/mozilla-build/dist/lib: ./vg-in-place --trace-children=yes --tool=drd $HOME/software/mozilla-build/dist/bin/firefox-bin Modified: trunk/drd/drd_barrier.c =================================================================== --- trunk/drd/drd_barrier.c 2008-07-07 08:17:55 UTC (rev 8374) +++ trunk/drd/drd_barrier.c 2008-07-07 08:45:55 UTC (rev 8375) @@ -410,6 +410,9 @@ struct barrier_thread_info* q; const UWord word_tid = tid; q = VG_(OSetGen_Remove)(p->oset, &word_tid); + /* q is only non-zero if the barrier object has been used by thread tid + * after the barrier_init() call and before the thread finished. + */ if (q) { barrier_thread_destroy(q); |
|
From: <sv...@va...> - 2008-07-07 08:17:52
|
Author: bart
Date: 2008-07-07 09:17:55 +0100 (Mon, 07 Jul 2008)
New Revision: 8374
Log:
Out-of-spec use of POSIX barriers could make drd crash -- fixed this.
Modified:
trunk/drd/drd_barrier.c
Modified: trunk/drd/drd_barrier.c
===================================================================
--- trunk/drd/drd_barrier.c 2008-07-07 08:11:52 UTC (rev 8373)
+++ trunk/drd/drd_barrier.c 2008-07-07 08:17:55 UTC (rev 8374)
@@ -84,6 +84,7 @@
/** Deallocate the memory that was allocated in barrier_thread_initialize(). */
static void barrier_thread_destroy(struct barrier_thread_info* const p)
{
+ tl_assert(p);
sg_put(p->sg[0]);
sg_put(p->sg[1]);
}
@@ -409,8 +410,11 @@
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);
+ if (q)
+ {
+ barrier_thread_destroy(q);
+ VG_(OSetGen_FreeNode)(p->oset, q);
+ }
}
}
|
|
From: <sv...@va...> - 2008-07-07 08:11:44
|
Author: sewardj
Date: 2008-07-07 09:11:52 +0100 (Mon, 07 Jul 2008)
New Revision: 8373
Log:
Handle syscalls and IR cases needed for larger programs.
Modified:
branches/PTRCHECK/exp-ptrcheck/pc_main.c
Modified: branches/PTRCHECK/exp-ptrcheck/pc_main.c
===================================================================
--- branches/PTRCHECK/exp-ptrcheck/pc_main.c 2008-07-07 08:10:56 UTC (rev 8372)
+++ branches/PTRCHECK/exp-ptrcheck/pc_main.c 2008-07-07 08:11:52 UTC (rev 8373)
@@ -44,6 +44,12 @@
// FIXME: looks_like_a_pointer
+// FIXME: post_reg_write_demux(Vg_CoreSysCall) is redundant w.r.t.
+// the default 'NONPTR' behaviour of post_syscall. post_reg_write_demux
+// is called first, then post_syscall.
+
+// FIXME: deal with Ist_PutI, Iex_GetI kludges
+
// XXX: recycle freed segments
//--------------------------------------------------------------
@@ -1397,8 +1403,9 @@
# define GOF(_fieldname) \
(offsetof(VexGuestX86State,guest_##_fieldname))
- Bool is4 = sz == 4;
- Bool is21 = sz == 2 || sz == 1;
+ Bool isXmmF = sz == 16 || sz == 8 || sz == 4;
+ Bool is4 = sz == 4;
+ Bool is21 = sz == 2 || sz == 1;
tl_assert(sz > 0);
tl_assert(host_is_little_endian());
if (o == GOF(EAX) && is4) goto exactly1;
@@ -1430,6 +1437,14 @@
if (o == GOF(LDT) && is4) goto none;
if (o == GOF(GDT) && is4) goto none;
+ if (o == GOF(IDFLAG) && is4) goto none;
+ if (o == GOF(ACFLAG) && is4) goto none;
+ if (o == GOF(EMWARN) && is4) goto none;
+
+ if (o == GOF(XMM0) && isXmmF) goto none;
+
+ if (o == GOF(FTOP) && is4) goto none;
+
VG_(printf)("get_IntRegInfo(x86):failing on (%d,%d)\n", o, sz);
tl_assert(0);
# undef GOF
@@ -1499,6 +1514,7 @@
if (o == GOF(XMM3) && isXmmF) goto none;
if (o == GOF(XMM4) && isXmmF) goto none;
if (o == GOF(XMM5) && isXmmF) goto none;
+ if (o == GOF(XMM6) && isXmmF) goto none;
if (o == GOF(XMM7) && isXmmF) goto none;
if (o == GOF(XMM8) && isXmmF) goto none;
if (o == GOF(XMM9) && isXmmF) goto none;
@@ -1633,6 +1649,7 @@
init_shadow_registers(tid);
break;
case Vg_CoreSysCall:
+ if (0) VG_(printf)("ZZZZZZZ p_r_w -> NONPTR\n");
post_reg_write_nonptr( tid, guest_state_offset, size );
break;
case Vg_CoreClientReq:
@@ -1814,6 +1831,9 @@
# if defined(__NR_socket)
case __NR_socket:
# endif
+# if defined(__NR_socketcall)
+ case __NR_socketcall: /* the nasty x86-linux socket multiplexor */
+# endif
case __NR_rt_sigaction:
case __NR_rt_sigprocmask:
case __NR_stat:
@@ -1828,13 +1848,24 @@
VG_(set_syscall_return_shadows)( tid, (UWord)UNKNOWN, 0 );
break;
- /* These ones definitely don't return pointers. */
+ /* These ones definitely don't return pointers. They're not
+ particularly grammatical, either. */
+# if defined(__NR__llseek)
+ case __NR__llseek:
+# endif
+ case __NR_chdir:
+ case __NR_clock_getres:
case __NR_fchmod:
case __NR_fchown:
case __NR_fdatasync:
+# if defined(__NR_fcntl64)
+ case __NR_fcntl64:
+# endif
+ case __NR_fstatfs:
case __NR_getegid:
case __NR_geteuid:
case __NR_getgid:
+ case __NR_getppid:
# if defined(__NR_getsockopt)
case __NR_getsockopt:
# endif
@@ -1843,6 +1874,9 @@
case __NR_kill:
case __NR_link:
case __NR_lseek:
+# if defined(__NR_lstat64)
+ case __NR_lstat64:
+# endif
case __NR_madvise:
case __NR_pipe:
case __NR_poll:
@@ -1850,7 +1884,13 @@
case __NR_readlink:
case __NR_readv:
case __NR_rename:
+ case __NR_sched_get_priority_max:
+ case __NR_sched_get_priority_min:
+ case __NR_sched_getparam:
+ case __NR_sched_getscheduler:
case __NR_select:
+ case __NR_setrlimit:
+ case __NR_statfs:
case __NR_time:
case __NR_umask:
case __NR_unlink:
@@ -1997,6 +2037,7 @@
if (res.isError) {
// mmap() had an error, return value is a small negative integer
VG_(set_syscall_return_shadows)( tid, (UWord)NONPTR, 0 );
+ if (0) VG_(printf)("ZZZZZZZ mmap res -> NONPTR\n");
} else {
// We remembered the last added segment; make sure it's the
// right one.
@@ -2005,6 +2046,7 @@
VG_(set_return_from_syscall_shadow)( tid, (UInt)last_seg_added );
#endif
VG_(set_syscall_return_shadows)( tid, (UWord)UNKNOWN, 0 );
+ if (0) VG_(printf)("ZZZZZZZ mmap res -> UNKNOWN\n");
}
break;
//zz case 163:
@@ -2036,7 +2078,7 @@
return (a > 0x01000000UL && a < 0xFF000000UL);
} else {
//return (a > 0x01000000UL && a < 0xFF00000000000000UL);
- return (a > 0x100000UL && a < 0xFF00000000000000UL);
+ return (a >= 0x10000UL && a < 0xFF00000000000000UL);
}
}
@@ -2116,8 +2158,17 @@
check_load1 check_load2 check_load4W
On 64 bit targets, we will use:
check_load1 check_load2 check_load4 check_load8W
+ check_load16 (for xmm reads)
*/
+// This handles 128 bit loads on both 32 bit and 64 bit targets.
+static VG_REGPARM(2)
+void check_load16(Addr m, Seg mptr_vseg)
+{
+checkSeg(mptr_vseg);
+ check_load_or_store(/*is_write*/False, m, 16, mptr_vseg);
+}
+
// This handles 64 bit loads on 64 bit targets. It must
// not be called on 32 bit targets.
// return m.vseg
@@ -3221,6 +3272,7 @@
case Iop_1Uto32: goto n32;
case Iop_8Uto32: goto n32;
case Iop_8Sto32: goto n32;
+ case Iop_Clz32: goto n32;
n32:
assign( 'I', pce, dstv, mkU32( (UInt)NONPTR ));
break;
@@ -3427,6 +3479,10 @@
stmt( 'C', pce, st );
break;
+ case Ist_PutI:
+ stmt( 'C', pce, st );
+ break;
+
case Ist_Put: {
/* PUT(offset) = atom */
/* 3 cases:
@@ -3593,7 +3649,7 @@
h_nm = "check_load2"; break;
case Ity_I8: h_fn = &check_load1;
h_nm = "check_load1"; break;
- default: tl_assert(0);
+ default: ppIRType(e_ty); tl_assert(0);
}
addrv = schemeEw_Atom( pce, addr );
if (e_ty == Ity_I32) {
@@ -3606,7 +3662,10 @@
} else {
/* 64 bit host/guest (cough, cough) */
switch (e_ty) {
- case Ity_F64: /* a hack: check_load8W's result ignored */
+ case Ity_V128: h_fn = &check_load16;
+ h_nm = "check_load16"; break;
+ case Ity_F64: /* a hack: check_load8W's
+ result is ignored */
case Ity_I64: h_fn = &check_load8W;
h_nm = "check_load8W"; break;
case Ity_F32:
@@ -3632,6 +3691,12 @@
break;
}
+ case Iex_GetI: {
+ stmt( 'C', pce, st );
+ if (isWord) goto unhandled;
+ break;
+ }
+
case Iex_Get: {
stmt( 'C', pce, st );
if (isWord) {
|
|
From: <sv...@va...> - 2008-07-07 08:10:48
|
Author: bart
Date: 2008-07-07 09:10:56 +0100 (Mon, 07 Jul 2008)
New Revision: 8372
Log:
Made spinlocks work again.
Modified:
trunk/drd/drd_clientreq.c
trunk/drd/drd_clientreq.h
trunk/drd/drd_pthread_intercepts.c
Modified: trunk/drd/drd_clientreq.c
===================================================================
--- trunk/drd/drd_clientreq.c 2008-07-07 08:09:12 UTC (rev 8371)
+++ trunk/drd/drd_clientreq.c 2008-07-07 08:10:56 UTC (rev 8372)
@@ -247,11 +247,15 @@
thread_leave_synchr(drd_tid);
break;
- case VG_USERREQ__SPIN_INIT_OR_UNLOCK:
- tl_assert(thread_get_synchr_nesting_count(drd_tid) == 0);
- drd_spin_init_or_unlock(arg[1]);
+ case VG_USERREQ__PRE_SPIN_INIT_OR_UNLOCK:
+ if (thread_enter_synchr(drd_tid) == 0)
+ drd_spin_init_or_unlock(arg[1]);
break;
+ case VG_USERREQ__POST_SPIN_INIT_OR_UNLOCK:
+ thread_leave_synchr(drd_tid);
+ break;
+
case VG_USERREQ__PRE_COND_INIT:
tl_assert(thread_get_synchr_nesting_count(drd_tid) == 0);
drd_pre_cond_init(arg[1]);
Modified: trunk/drd/drd_clientreq.h
===================================================================
--- trunk/drd/drd_clientreq.h 2008-07-07 08:09:12 UTC (rev 8371)
+++ trunk/drd/drd_clientreq.h 2008-07-07 08:10:56 UTC (rev 8372)
@@ -83,8 +83,12 @@
/* to notify the drd tool of pthread_mutex_unlock calls */
VG_USERREQ__POST_MUTEX_UNLOCK,
/* args: Addr */
- VG_USERREQ__SPIN_INIT_OR_UNLOCK,
- /* args: Addr spinlock */
+ /* to notify the drd tool of a pthread_spin_init/pthread_spin_unlock call */
+ VG_USERREQ__PRE_SPIN_INIT_OR_UNLOCK,
+ /* args: Addr */
+ /* to notify the drd tool of a pthread_spin_init/pthread_spin_unlock call */
+ VG_USERREQ__POST_SPIN_INIT_OR_UNLOCK,
+ /* args: Addr */
/* to notify the drd tool of a pthread_cond_init call. */
Modified: trunk/drd/drd_pthread_intercepts.c
===================================================================
--- trunk/drd/drd_pthread_intercepts.c 2008-07-07 08:09:12 UTC (rev 8371)
+++ trunk/drd/drd_pthread_intercepts.c 2008-07-07 08:10:56 UTC (rev 8372)
@@ -550,9 +550,11 @@
int res;
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
- VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__SPIN_INIT_OR_UNLOCK,
- spinlock, mutex_type_spinlock, 0, 0, 0);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_SPIN_INIT_OR_UNLOCK,
+ spinlock, 0, 0, 0, 0);
CALL_FN_W_WW(ret, fn, spinlock, pshared);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SPIN_INIT_OR_UNLOCK,
+ spinlock, 0, 0, 0, 0);
return ret;
}
@@ -564,6 +566,8 @@
int res;
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_MUTEX_DESTROY,
+ spinlock, 0, 0, 0, 0);
CALL_FN_W_W(ret, fn, spinlock);
VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_MUTEX_DESTROY,
spinlock, mutex_type_spinlock, 0, 0, 0);
@@ -610,9 +614,11 @@
int res;
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
- VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__SPIN_INIT_OR_UNLOCK,
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_SPIN_INIT_OR_UNLOCK,
spinlock, mutex_type_spinlock, 0, 0, 0);
CALL_FN_W_W(ret, fn, spinlock);
+ VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SPIN_INIT_OR_UNLOCK,
+ spinlock, 0, 0, 0, 0);
return ret;
}
|
|
From: <sv...@va...> - 2008-07-07 08:09:04
|
Author: sewardj
Date: 2008-07-07 09:09:12 +0100 (Mon, 07 Jul 2008)
New Revision: 8371
Log:
* remove unused variables VG_(client_base) and VG_(client_end)
* (closely related): don't load PIE executables at zero. Still a
kludge, but not as bad as loading them at zero.
Maybe merge to trunk.
Modified:
branches/PTRCHECK/coregrind/m_initimg/initimg-linux.c
branches/PTRCHECK/coregrind/m_ume.c
branches/PTRCHECK/coregrind/pub_core_clientstate.h
Modified: branches/PTRCHECK/coregrind/m_initimg/initimg-linux.c
===================================================================
--- branches/PTRCHECK/coregrind/m_initimg/initimg-linux.c 2008-07-07 08:04:08 UTC (rev 8370)
+++ branches/PTRCHECK/coregrind/m_initimg/initimg-linux.c 2008-07-07 08:09:12 UTC (rev 8371)
@@ -178,9 +178,6 @@
}
VG_(memset)(info, 0, sizeof(*info));
- info->exe_base = VG_(client_base);
- info->exe_end = VG_(client_end);
-
ret = VG_(do_exec)(exe_name, info);
// The client was successfully loaded! Continue.
Modified: branches/PTRCHECK/coregrind/m_ume.c
===================================================================
--- branches/PTRCHECK/coregrind/m_ume.c 2008-07-07 08:04:08 UTC (rev 8370)
+++ branches/PTRCHECK/coregrind/m_ume.c 2008-07-07 08:09:12 UTC (rev 8371)
@@ -355,7 +355,15 @@
/* The kernel maps position-independent executables at TASK_SIZE*2/3;
duplicate this behavior as close as we can. */
if (e->e.e_type == ET_DYN && ebase == 0) {
- ebase = VG_PGROUNDDN(info->exe_base + (info->exe_end - info->exe_base) * 2 / 3);
+ ebase = VG_PGROUNDDN(info->exe_base
+ + (info->exe_end - info->exe_base) * 2 / 3);
+ /* We really don't want to load PIEs at zero or too close. It
+ works, but it's unrobust (NULL pointer reads and writes
+ become legit, which is really bad) and causes problems for
+ exp-ptrcheck, which assumes all numbers below 64k are
+ nonpointers. So, hackily, move it above 64k. */
+ if (ebase < 0x10000)
+ ebase = 0x10000;
}
info->phnum = e->e.e_phnum;
Modified: branches/PTRCHECK/coregrind/pub_core_clientstate.h
===================================================================
--- branches/PTRCHECK/coregrind/pub_core_clientstate.h 2008-07-07 08:04:08 UTC (rev 8370)
+++ branches/PTRCHECK/coregrind/pub_core_clientstate.h 2008-07-07 08:09:12 UTC (rev 8371)
@@ -42,9 +42,6 @@
// Address space globals
-extern Addr VG_(client_base); // client address space limits
-extern Addr VG_(client_end);
-
extern Addr VG_(clstk_base); // client stack range
extern Addr VG_(clstk_end);
extern UWord VG_(clstk_id); // client stack id
|
|
From: <sv...@va...> - 2008-07-07 08:04:02
|
Author: bart
Date: 2008-07-07 09:04:08 +0100 (Mon, 07 Jul 2008)
New Revision: 8370
Log:
Added regression test for POSIX spinlocks.
Added:
trunk/drd/tests/pth_spinlock.c
trunk/drd/tests/pth_spinlock.stderr.exp
trunk/drd/tests/pth_spinlock.vgtest
Modified:
trunk/drd/tests/Makefile.am
Modified: trunk/drd/tests/Makefile.am
===================================================================
--- trunk/drd/tests/Makefile.am 2008-07-07 06:49:24 UTC (rev 8369)
+++ trunk/drd/tests/Makefile.am 2008-07-07 08:04:08 UTC (rev 8370)
@@ -90,6 +90,8 @@
pth_detached_sem.vgtest \
pth_inconsistent_cond_wait.stderr.exp \
pth_inconsistent_cond_wait.vgtest \
+ pth_spinlock.stderr.exp \
+ pth_spinlock.vgtest \
recursive_mutex.stderr.exp \
recursive_mutex.stdout.exp \
recursive_mutex.vgtest \
@@ -196,6 +198,7 @@
pth_detached \
pth_detached_sem \
pth_inconsistent_cond_wait \
+ pth_spinlock \
recursive_mutex \
rwlock_race \
rwlock_test \
@@ -300,6 +303,9 @@
pth_inconsistent_cond_wait_SOURCES = pth_inconsistent_cond_wait.c
pth_inconsistent_cond_wait_LDADD = -lpthread
+pth_spinlock_SOURCES = pth_spinlock.c
+pth_spinlock_LDADD = -lpthread
+
recursive_mutex_SOURCES = recursive_mutex.c
recursive_mutex_LDADD = -lpthread
Added: trunk/drd/tests/pth_spinlock.c
===================================================================
--- trunk/drd/tests/pth_spinlock.c (rev 0)
+++ trunk/drd/tests/pth_spinlock.c 2008-07-07 08:04:08 UTC (rev 8370)
@@ -0,0 +1,57 @@
+/** pthread_spinloc_t test. */
+
+
+/* Make sure pthread_spinlock_t is available when compiling with older glibc
+ * versions (2.3 or before).
+ */
+#define _GNU_SOURCE
+
+#include <pthread.h>
+#include <stdio.h> /* fprintf() */
+#include <stdlib.h> /* atoi() */
+
+
+static pthread_barrier_t s_barrier;
+static pthread_spinlock_t s_spinlock;
+static int s_iterations;
+static int s_counter;
+
+
+static void* thread_func(void* arg)
+{
+ int i;
+
+ pthread_barrier_wait(&s_barrier);
+ for (i = s_iterations; i > 0; i--)
+ {
+ pthread_spin_lock(&s_spinlock);
+ s_counter++;
+ pthread_spin_unlock(&s_spinlock);
+ }
+ return 0;
+}
+
+int main(int argc, char** argv)
+{
+ int i;
+ const int n_threads = 10;
+ pthread_t tid[n_threads];
+
+ s_iterations = argc > 1 ? atoi(argv[1]) : 1000;
+
+ fprintf(stderr, "Start of test.\n");
+ pthread_barrier_init(&s_barrier, 0, n_threads);
+ pthread_spin_init(&s_spinlock, 0);
+ for (i = 0; i < n_threads; i++)
+ pthread_create(&tid[i], 0, thread_func, 0);
+ for (i = 0; i < n_threads; i++)
+ pthread_join(tid[i], 0);
+ pthread_spin_destroy(&s_spinlock);
+ pthread_barrier_destroy(&s_barrier);
+ if (s_counter == n_threads * s_iterations)
+ fprintf(stderr, "Test successful.\n");
+ else
+ fprintf(stderr, "Test failed: counter = %d, should be %d\n",
+ s_counter, n_threads * s_iterations);
+ return 0;
+}
Added: trunk/drd/tests/pth_spinlock.stderr.exp
===================================================================
--- trunk/drd/tests/pth_spinlock.stderr.exp (rev 0)
+++ trunk/drd/tests/pth_spinlock.stderr.exp 2008-07-07 08:04:08 UTC (rev 8370)
@@ -0,0 +1,5 @@
+
+Start of test.
+Test successful.
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Added: trunk/drd/tests/pth_spinlock.vgtest
===================================================================
--- trunk/drd/tests/pth_spinlock.vgtest (rev 0)
+++ trunk/drd/tests/pth_spinlock.vgtest 2008-07-07 08:04:08 UTC (rev 8370)
@@ -0,0 +1,3 @@
+prereq: ./supported_libpthread
+vgopts: --var-info=yes --check-stack-var=yes
+prog: pth_spinlock
|