You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(122) |
Nov
(152) |
Dec
(69) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(6) |
Feb
(25) |
Mar
(73) |
Apr
(82) |
May
(24) |
Jun
(25) |
Jul
(10) |
Aug
(11) |
Sep
(10) |
Oct
(54) |
Nov
(203) |
Dec
(182) |
| 2004 |
Jan
(307) |
Feb
(305) |
Mar
(430) |
Apr
(312) |
May
(187) |
Jun
(342) |
Jul
(487) |
Aug
(637) |
Sep
(336) |
Oct
(373) |
Nov
(441) |
Dec
(210) |
| 2005 |
Jan
(385) |
Feb
(480) |
Mar
(636) |
Apr
(544) |
May
(679) |
Jun
(625) |
Jul
(810) |
Aug
(838) |
Sep
(634) |
Oct
(521) |
Nov
(965) |
Dec
(543) |
| 2006 |
Jan
(494) |
Feb
(431) |
Mar
(546) |
Apr
(411) |
May
(406) |
Jun
(322) |
Jul
(256) |
Aug
(401) |
Sep
(345) |
Oct
(542) |
Nov
(308) |
Dec
(481) |
| 2007 |
Jan
(427) |
Feb
(326) |
Mar
(367) |
Apr
(255) |
May
(244) |
Jun
(204) |
Jul
(223) |
Aug
(231) |
Sep
(354) |
Oct
(374) |
Nov
(497) |
Dec
(362) |
| 2008 |
Jan
(322) |
Feb
(482) |
Mar
(658) |
Apr
(422) |
May
(476) |
Jun
(396) |
Jul
(455) |
Aug
(267) |
Sep
(280) |
Oct
(253) |
Nov
(232) |
Dec
(304) |
| 2009 |
Jan
(486) |
Feb
(470) |
Mar
(458) |
Apr
(423) |
May
(696) |
Jun
(461) |
Jul
(551) |
Aug
(575) |
Sep
(134) |
Oct
(110) |
Nov
(157) |
Dec
(102) |
| 2010 |
Jan
(226) |
Feb
(86) |
Mar
(147) |
Apr
(117) |
May
(107) |
Jun
(203) |
Jul
(193) |
Aug
(238) |
Sep
(300) |
Oct
(246) |
Nov
(23) |
Dec
(75) |
| 2011 |
Jan
(133) |
Feb
(195) |
Mar
(315) |
Apr
(200) |
May
(267) |
Jun
(293) |
Jul
(353) |
Aug
(237) |
Sep
(278) |
Oct
(611) |
Nov
(274) |
Dec
(260) |
| 2012 |
Jan
(303) |
Feb
(391) |
Mar
(417) |
Apr
(441) |
May
(488) |
Jun
(655) |
Jul
(590) |
Aug
(610) |
Sep
(526) |
Oct
(478) |
Nov
(359) |
Dec
(372) |
| 2013 |
Jan
(467) |
Feb
(226) |
Mar
(391) |
Apr
(281) |
May
(299) |
Jun
(252) |
Jul
(311) |
Aug
(352) |
Sep
(481) |
Oct
(571) |
Nov
(222) |
Dec
(231) |
| 2014 |
Jan
(185) |
Feb
(329) |
Mar
(245) |
Apr
(238) |
May
(281) |
Jun
(399) |
Jul
(382) |
Aug
(500) |
Sep
(579) |
Oct
(435) |
Nov
(487) |
Dec
(256) |
| 2015 |
Jan
(338) |
Feb
(357) |
Mar
(330) |
Apr
(294) |
May
(191) |
Jun
(108) |
Jul
(142) |
Aug
(261) |
Sep
(190) |
Oct
(54) |
Nov
(83) |
Dec
(22) |
| 2016 |
Jan
(49) |
Feb
(89) |
Mar
(33) |
Apr
(50) |
May
(27) |
Jun
(34) |
Jul
(53) |
Aug
(53) |
Sep
(98) |
Oct
(206) |
Nov
(93) |
Dec
(53) |
| 2017 |
Jan
(65) |
Feb
(82) |
Mar
(102) |
Apr
(86) |
May
(187) |
Jun
(67) |
Jul
(23) |
Aug
(93) |
Sep
(65) |
Oct
(45) |
Nov
(35) |
Dec
(17) |
| 2018 |
Jan
(26) |
Feb
(35) |
Mar
(38) |
Apr
(32) |
May
(8) |
Jun
(43) |
Jul
(27) |
Aug
(30) |
Sep
(43) |
Oct
(42) |
Nov
(38) |
Dec
(67) |
| 2019 |
Jan
(32) |
Feb
(37) |
Mar
(53) |
Apr
(64) |
May
(49) |
Jun
(18) |
Jul
(14) |
Aug
(53) |
Sep
(25) |
Oct
(30) |
Nov
(49) |
Dec
(31) |
| 2020 |
Jan
(87) |
Feb
(45) |
Mar
(37) |
Apr
(51) |
May
(99) |
Jun
(36) |
Jul
(11) |
Aug
(14) |
Sep
(20) |
Oct
(24) |
Nov
(40) |
Dec
(23) |
| 2021 |
Jan
(14) |
Feb
(53) |
Mar
(85) |
Apr
(15) |
May
(19) |
Jun
(3) |
Jul
(14) |
Aug
(1) |
Sep
(57) |
Oct
(73) |
Nov
(56) |
Dec
(22) |
| 2022 |
Jan
(3) |
Feb
(22) |
Mar
(6) |
Apr
(55) |
May
(46) |
Jun
(39) |
Jul
(15) |
Aug
(9) |
Sep
(11) |
Oct
(34) |
Nov
(20) |
Dec
(36) |
| 2023 |
Jan
(79) |
Feb
(41) |
Mar
(99) |
Apr
(169) |
May
(48) |
Jun
(16) |
Jul
(16) |
Aug
(57) |
Sep
(19) |
Oct
|
Nov
|
Dec
|
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
|
|
|
|
|
|
1
(6) |
2
(7) |
|
3
(12) |
4
(9) |
5
(12) |
6
(9) |
7
(18) |
8
(10) |
9
(17) |
|
10
(15) |
11
(22) |
12
(16) |
13
(18) |
14
(9) |
15
(14) |
16
(18) |
|
17
(24) |
18
(11) |
19
(15) |
20
(29) |
21
(19) |
22
(20) |
23
(9) |
|
24
(25) |
25
(25) |
26
(38) |
27
(22) |
28
(16) |
29
(17) |
|
|
From: Tom H. <to...@co...> - 2008-02-24 21:02:13
|
In message <200...@ac...>
Julian Seward <js...@ac...> wrote:
> On Sunday 24 February 2008 20:15, Bart Van Assche wrote:
> > On Sun, Feb 17, 2008 at 1:06 PM, Julian Seward <js...@ac...> wrote:
> > > > > So what's the oldest commonly-used distro that supported NPTL?
> > > >
> > > > RH9 is pretty much the first distro to support it isn't it?
> > >
> > > Yes. According to Ulrich Drepper "RHL9 was the first with NPTL and
> > > it served as the basis for RHEL3".
> > >
> > > So I'm inclined to declare RHL9 as the new oldest-supported-distro
> > > for the trunk, which means we can drop support for LinuxThreads,
> > > gcc < 3.0, and stabs.
> >
> > As far as I know there are still RHEL3 setups running, and RHEL3 is
> > based on the 2.4.21 Linux kernel. So how could RHEL3 include NPTL ?
>
> Because the Red Hat crew backported a bunch of stuff from 2.6 into some
> of the 2.4s they were distributing, and I think that included NPTL. At
> least -- that is my impression.
Correct - the same applies to RH9 (and FC1) as both use a 2.4 kernel.
Tom
--
Tom Hughes (to...@co...)
http://www.compton.nu/
|
|
From: <sv...@va...> - 2008-02-24 19:51:49
|
Author: sewardj
Date: 2008-02-24 19:51:51 +0000 (Sun, 24 Feb 2008)
New Revision: 7452
Log:
Make some efforts to recover the large Dwarf3-reading performance loss
caused by r7435. r7435 causes information about many more variables
than previously, to be recorded, especially in programs with a lot of
inlining. This commit recovers some of that lossage by representing
address ranges for TempVars which turns over less memory.
Modified:
branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c
branches/DATASYMS/coregrind/m_debuginfo/storage.c
Modified: branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c 2008-02-24 18:47:12 UTC (rev 7451)
+++ branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c 2008-02-24 19:51:51 UTC (rev 7452)
@@ -84,17 +84,33 @@
different DIEs (generally a declarer and a definer). We punt on
these. Could do better here.
- Improve performance. The number of type entities that end up in
- the list of TyAdmins rapidly becomes huge (eg, for
- libQtGui.so.4.3.2 (amd64-linux, size 80729047 bytes), there are
- 786860 entries in the list). Mostly this seems to be caused by g++
- adding type DIEs for all the basic types once for each source file
- contributing to the compilation unit, and for a large library they
- add up quickly. That causes both a lot of work for this reader
- module, and also wastes vast amounts of memory storing this
- duplicated information. We could surely do a lot better here.
-*/
+ POTENTIAL PERFORMANCE IMPROVEMENTS:
+ The number of type entities that end up in the list of TyAdmins
+ rapidly becomes huge (eg, for libQtGui.so.4.3.2 (amd64-linux, size
+ 80729047 bytes), there are 786860 entries in the list). Mostly
+ this seems to be caused by g++ adding type DIEs for all the basic
+ types once for each source file contributing to the compilation
+ unit, and for a large library they add up quickly. That causes
+ both a lot of work for this reader module, and also wastes vast
+ amounts of memory storing this duplicated information. We could
+ surely do a lot better here.
+
+ Handle interaction between read_DIE and parse_{var,type}_DIE
+ better. Currently read_DIE reads the entire DIE just to find where
+ the end is (and for debug printing), so that it can later reliably
+ move the cursor to the end regardless of what parse_{var,type}_DIE
+ do. This means many DIEs (most, even?) are read twice. It would
+ be smarter to make parse_{var,type}_DIE return a Bool indicating
+ whether or not they advanced the DIE cursor, and only if they
+ didn't should read_DIE itself read through the DIE.
+
+ More generally, reduce the amount of memory allocated and freed
+ while reading Dwarf3 type/variable information. Even modest (20MB)
+ objects cause this module to allocate and free hundreds of
+ thousands of small blocks, and ML_(arena_malloc) and its various
+ groupies always show up at the top of performance profiles. */
+
#include "pub_core_basics.h"
#include "pub_core_libcbase.h"
#include "pub_core_libcassert.h"
@@ -1005,7 +1021,19 @@
struct _TempVar {
struct _TempVar* next;
UChar* name; /* in DebugInfo's .strchunks */
- XArray* ranges; /* of AddrRange. UNIQUE PTR in AR_DINFO. */
+ /* Represent ranges economically. nRanges is the number of
+ ranges. Cases:
+ 0: .rngOneMin .rngOneMax .manyRanges are all zero
+ 1: .rngOneMin .rngOneMax hold the range; .rngMany is NULL
+ 2: .rngOneMin .rngOneMax are zero; .rngMany holds the ranges.
+ This is merely an optimisation to avoid having to allocate
+ and free the XArray in the common (98%) of cases where there
+ is zero or one address ranges. */
+ UWord nRanges;
+ Addr rngOneMin;
+ Addr rngOneMax;
+ XArray* rngMany; /* of AddrRange. UNIQUE PTR in AR_DINFO. */
+ /* --- */
Int level;
Type* typeR;
GExpr* gexpr; /* for this variable */
@@ -1021,7 +1049,7 @@
}
TempVar;
-#define N_D3_VAR_STACK 16
+#define N_D3_VAR_STACK 24
typedef
struct {
@@ -1066,10 +1094,14 @@
vg_assert(parser->fbGX[i] == NULL);
}
VG_(printf)(": ");
- for (j = 0; j < VG_(sizeXA)( xa ); j++) {
- AddrRange* range = (AddrRange*) VG_(indexXA)( xa, j );
- vg_assert(range);
- VG_(printf)("[%p,%p] ", range->aMin, range->aMax);
+ if (VG_(sizeXA)( xa ) == 0) {
+ VG_(printf)("** empty PC range array **");
+ } else {
+ for (j = 0; j < VG_(sizeXA)( xa ); j++) {
+ AddrRange* range = (AddrRange*) VG_(indexXA)( xa, j );
+ vg_assert(range);
+ VG_(printf)("[%p,%p] ", range->aMin, range->aMax);
+ }
}
VG_(printf)("\n");
}
@@ -1493,7 +1525,7 @@
will be the address ranges at the top of the varparser's
stack. */
GExpr* fbGX = NULL;
- Word i;
+ Word i, nRanges;
XArray* /* of AddrRange */ xa;
TempVar* tv;
/* Stack can't be empty; we put a dummy entry on it for the
@@ -1544,9 +1576,11 @@
address space. It is asserted elsewhere that level 0
always covers the entire address space. */
xa = parser->ranges[external ? 0 : parser->sp];
+ nRanges = VG_(sizeXA)(xa);
+ vg_assert(nRanges >= 0);
+
tv = ML_(dinfo_zalloc)( sizeof(TempVar) );
tv->name = name;
- tv->ranges = xa;
tv->level = external ? 0 : parser->sp;
tv->typeR = typeR;
tv->gexpr = gexpr;
@@ -1555,13 +1589,37 @@
tv->fLine = lineNo;
tv->dioff = posn;
tv->absOri = abs_ori;
- tv->ranges = VG_(cloneXA)( xa ); /* free when 'tv' freed */
+ /* See explanation on definition of type TempVar for the
+ reason for this elaboration. */
+ tv->nRanges = nRanges;
+ tv->rngOneMin = 0;
+ tv->rngOneMax = 0;
+ tv->rngMany = NULL;
+ if (nRanges == 1) {
+ AddrRange* range = VG_(indexXA)(xa, 0);
+ tv->rngOneMin = range->aMin;
+ tv->rngOneMax = range->aMax;
+ }
+ else if (nRanges > 1) {
+ tv->rngMany = VG_(cloneXA)( xa ); /* free when 'tv' freed */
+ }
+
tv->next = *tempvars;
*tempvars = tv;
TRACE_D3(" Recording this variable, with %ld PC range(s)\n",
VG_(sizeXA)(xa) );
+ /* collect stats on how effective the ->ranges special
+ casing is */
+ if (0) {
+ static Int ntot=0, ngt=0;
+ ntot++;
+ if (tv->rngMany) ngt++;
+ if (0 == (ntot % 100000))
+ VG_(printf)("XXXX %d tot, %d cloned\n", ntot, ngt);
+ }
+
}
/* Here are some other weird cases seen in the wild:
@@ -2682,7 +2740,6 @@
UWord dr_offset;
Word i;
Bool td3 = di->trace_symtab;
- XArray* /* of AddrRange */ xa;
XArray* /* of TempVar* */ dioff_lookup_tab;
#if 0
@@ -3121,45 +3178,67 @@
vg_assert(varp->name);
vg_assert(varp->typeR);
vg_assert(varp->level >= 0);
- vg_assert(varp->ranges);
/* Ok. So we're going to keep it. Call ML_(addVar) once for
each address range in which the variable exists. */
- xa = varp->ranges;
- if (varp->level == 0)
- vg_assert( VG_(sizeXA)(xa) == 1 );
-
- /* Level 0 is the global address range. So at level 0 we don't
- want to bias pcMin/pcMax; but at all other levels we do since
- those are derived from svmas in the Dwarf we're reading. Be
- paranoid ... */
TRACE_D3(" ACQUIRE for range(s) ");
- for (i = 0; i < VG_(sizeXA)( xa ); i++) {
- AddrRange* range = VG_(indexXA)(xa, i);
- Addr pcMin = range->aMin;
- Addr pcMax = range->aMax;
- vg_assert(pcMin <= pcMax);
- if (varp->level == 0) {
- vg_assert(pcMin == (Addr)0);
- vg_assert(pcMax == ~(Addr)0);
- } else {
- /* vg_assert(pcMin > (Addr)0);
- No .. we can legitimately expect to see ranges like
- 0x0-0x11D (pre-biasing, of course). */
- vg_assert(pcMax < ~(Addr)0);
- }
+ { AddrRange oneRange;
+ AddrRange* varPcRanges;
+ Word nVarPcRanges;
+ /* Set up to iterate over address ranges, however
+ represented. */
+ if (varp->nRanges == 0 || varp->nRanges == 1) {
+ vg_assert(!varp->rngMany);
+ if (varp->nRanges == 0) {
+ vg_assert(varp->rngOneMin == 0);
+ vg_assert(varp->rngOneMax == 0);
+ }
+ nVarPcRanges = varp->nRanges;
+ oneRange.aMin = varp->rngOneMin;
+ oneRange.aMax = varp->rngOneMax;
+ varPcRanges = &oneRange;
+ } else {
+ vg_assert(varp->rngMany);
+ vg_assert(varp->rngOneMin == 0);
+ vg_assert(varp->rngOneMax == 0);
+ nVarPcRanges = VG_(sizeXA)(varp->rngMany);
+ vg_assert(nVarPcRanges >= 2);
+ vg_assert(nVarPcRanges == (Word)varp->nRanges);
+ varPcRanges = VG_(indexXA)(varp->rngMany, 0);
+ }
+ if (varp->level == 0)
+ vg_assert( nVarPcRanges == 1 );
+ /* and iterate */
+ for (i = 0; i < nVarPcRanges; i++) {
+ Addr pcMin = varPcRanges[i].aMin;
+ Addr pcMax = varPcRanges[i].aMax;
+ vg_assert(pcMin <= pcMax);
+ /* Level 0 is the global address range. So at level 0 we
+ don't want to bias pcMin/pcMax; but at all other levels
+ we do since those are derived from svmas in the Dwarf
+ we're reading. Be paranoid ... */
+ if (varp->level == 0) {
+ vg_assert(pcMin == (Addr)0);
+ vg_assert(pcMax == ~(Addr)0);
+ } else {
+ /* vg_assert(pcMin > (Addr)0);
+ No .. we can legitimately expect to see ranges like
+ 0x0-0x11D (pre-biasing, of course). */
+ vg_assert(pcMax < ~(Addr)0);
+ }
- if (i > 0 && (i%2) == 0) TRACE_D3("\n ");
- TRACE_D3("[%p,%p] ", pcMin, pcMax );
+ if (i > 0 && (i%2) == 0) TRACE_D3("\n ");
+ TRACE_D3("[%p,%p] ", pcMin, pcMax );
- ML_(addVar)(
- di, varp->level,
- pcMin + (varp->level==0 ? 0 : di->text_bias),
- pcMax + (varp->level==0 ? 0 : di->text_bias),
- varp->name, (void*)varp->typeR,
- varp->gexpr, varp->fbGX,
- varp->fName, varp->fLine, td3
- );
+ ML_(addVar)(
+ di, varp->level,
+ pcMin + (varp->level==0 ? 0 : di->text_bias),
+ pcMax + (varp->level==0 ? 0 : di->text_bias),
+ varp->name, (void*)varp->typeR,
+ varp->gexpr, varp->fbGX,
+ varp->fName, varp->fLine, td3
+ );
+ }
}
TRACE_D3("\n\n");
@@ -3169,8 +3248,8 @@
/* Now free all the TempVars */
for (varp = tempvars; varp; varp = varp2) {
varp2 = varp->next;
- vg_assert(varp->ranges);
- VG_(deleteXA)(varp->ranges);
+ if (varp->rngMany)
+ VG_(deleteXA)(varp->rngMany);
ML_(dinfo_free)(varp);
}
tempvars = NULL;
Modified: branches/DATASYMS/coregrind/m_debuginfo/storage.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/storage.c 2008-02-24 18:47:12 UTC (rev 7451)
+++ branches/DATASYMS/coregrind/m_debuginfo/storage.c 2008-02-24 19:51:51 UTC (rev 7452)
@@ -585,6 +585,17 @@
vg_assert(first->aMin <= first->aMax);
vg_assert(first->aMin <= aMin && aMin <= first->aMax);
+ /* Fast track common case, which is that the range specified for
+ the variable exactly coincides with one already-existing
+ range. */
+ if (first->aMin == aMin && first->aMax == aMax) {
+ vg_assert(first->vars);
+ VG_(addToXA)( first->vars, var );
+ return;
+ }
+
+ /* We have to get into splitting ranges, which is complex
+ and slow. */
if (first->aMin < aMin) {
DiAddrRange* nyu;
/* Ok. We'll have to split 'first'. */
@@ -670,6 +681,7 @@
vg_assert(rangep->aMax == aMax);
}
+
/* Top-level place to call to add a variable description (as extracted
from a DWARF3 .debug_info section. */
void ML_(addVar)( struct _DebugInfo* di,
|
|
From: Julian S. <js...@ac...> - 2008-02-24 19:30:39
|
On Sunday 24 February 2008 20:15, Bart Van Assche wrote: > On Sun, Feb 17, 2008 at 1:06 PM, Julian Seward <js...@ac...> wrote: > > > > So what's the oldest commonly-used distro that supported NPTL? > > > > > > RH9 is pretty much the first distro to support it isn't it? > > > > Yes. According to Ulrich Drepper "RHL9 was the first with NPTL and > > it served as the basis for RHEL3". > > > > So I'm inclined to declare RHL9 as the new oldest-supported-distro > > for the trunk, which means we can drop support for LinuxThreads, > > gcc < 3.0, and stabs. > > As far as I know there are still RHEL3 setups running, and RHEL3 is > based on the 2.4.21 Linux kernel. So how could RHEL3 include NPTL ? Because the Red Hat crew backported a bunch of stuff from 2.6 into some of the 2.4s they were distributing, and I think that included NPTL. At least -- that is my impression. J |
|
From: Bart V. A. <bar...@gm...> - 2008-02-24 19:15:10
|
On Sun, Feb 17, 2008 at 1:06 PM, Julian Seward <js...@ac...> wrote: > > > So what's the oldest commonly-used distro that supported NPTL? > > > > RH9 is pretty much the first distro to support it isn't it? > > Yes. According to Ulrich Drepper "RHL9 was the first with NPTL and > it served as the basis for RHEL3". > > So I'm inclined to declare RHL9 as the new oldest-supported-distro > for the trunk, which means we can drop support for LinuxThreads, > gcc < 3.0, and stabs. As far as I know there are still RHEL3 setups running, and RHEL3 is based on the 2.4.21 Linux kernel. So how could RHEL3 include NPTL ? The kernel version included in RHEL3 can be verified easily: as known the CentOS RPM's package the same software versions as the equivalent RHEL version. It can be verified on any CentOS mirror that version CentOS 3.0 includes kernel 2.4.21. See e.g. ftp://ftp.belnet.be/mirror/ftp.centos.org/3/os/i386/RedHat/RPMS. Bart. |
|
From: <sv...@va...> - 2008-02-24 18:47:10
|
Author: bart Date: 2008-02-24 18:47:12 +0000 (Sun, 24 Feb 2008) New Revision: 7451 Log: Updated to do list. Modified: trunk/exp-drd/TODO.txt Modified: trunk/exp-drd/TODO.txt =================================================================== --- trunk/exp-drd/TODO.txt 2008-02-24 18:46:05 UTC (rev 7450) +++ trunk/exp-drd/TODO.txt 2008-02-24 18:47:12 UTC (rev 7451) @@ -15,8 +15,12 @@ - Find out why a race is reported on std::string::string(std::string const&) (stc test case 16). - Add a regression test for pthread_mutex_timedlock(). -- Find a way for suppressing races on _IO_2_1_stdout (this race is triggered - by calling printf() from more than one thread). +- Find a way for suppressing races reported on _IO_2_1_stdout. This race is + triggered by calling printf() from more than one thread. An example: + ./vg-in-place --tool=exp-drd exp-drd/tests/pth_barrier 2 1 +- Add support for objects that are shared over threads and that use reference + counting, e.g. std::string -- no races should be reported on the reference + count. - Performance testing and tuning. - testing on PPC and AIX (current implementation is only tested on X86 and AMD64). @@ -38,6 +42,9 @@ Documentation ~~~~~~~~~~~~~ - Document the command-line options of the exp-drd tool. +- Explain that happens-before race detectors are also suited for certain + classes of programs that do not follow a locking discipline + (e.g. exp-drd/test/matinv.c). Known bugs @@ -51,6 +58,9 @@ (works fine on i386). This is a bug in Valgrind's debug info reader -- VG_(find_seginfo)() returns NULL for BSS symbols on x86_64. Not yet in the KDE bug tracking system. +- --trace-mem=yes can cause crashes. This might be caused by the code that + prints backtraces. An example (AMD64): + ./vg-in-place --tool=exp-drd --trace-mem=yes exp-drd/tests/pth_barrier 2 2 1 Known performance issues: - According to cachegrind, VG_(OSet_Next)() is taking up most CPU cycles. |
|
From: <sv...@va...> - 2008-02-24 18:46:05
|
Author: bart
Date: 2008-02-24 18:46:05 +0000 (Sun, 24 Feb 2008)
New Revision: 7450
Log:
Added --trace-csw and --trace-danger-set. Removed commented out code.
Modified:
trunk/exp-drd/drd_main.c
Modified: trunk/exp-drd/drd_main.c
===================================================================
--- trunk/exp-drd/drd_main.c 2008-02-24 18:42:53 UTC (rev 7449)
+++ trunk/exp-drd/drd_main.c 2008-02-24 18:46:05 UTC (rev 7450)
@@ -73,6 +73,8 @@
{
Bool trace_barrier = False;
Bool trace_cond = False;
+ Bool trace_csw = False;
+ Bool trace_danger_set = False;
Bool trace_mutex = False;
Bool trace_segment = False;
Bool trace_suppression = False;
@@ -81,6 +83,8 @@
VG_BOOL_CLO (arg, "--drd-stats", drd_print_stats)
else VG_BOOL_CLO(arg, "--trace-barrier", trace_barrier)
else VG_BOOL_CLO(arg, "--trace-cond", trace_cond)
+ else VG_BOOL_CLO(arg, "--trace-csw", trace_csw)
+ else VG_BOOL_CLO(arg, "--trace-danger-set", trace_danger_set)
else VG_BOOL_CLO(arg, "--trace-fork-join", drd_trace_fork_join)
else VG_BOOL_CLO(arg, "--trace-mem", drd_trace_mem)
else VG_BOOL_CLO(arg, "--trace-mutex", trace_mutex)
@@ -93,15 +97,15 @@
if (trace_address)
{
drd_trace_address = VG_(strtoll16)(trace_address, 0);
-#if 0
- VG_(message)(Vg_DebugMsg, "Tracing address %s <> 0x%x\n",
- trace_address, drd_trace_address);
-#endif
}
if (trace_barrier)
barrier_set_trace(trace_barrier);
if (trace_cond)
cond_set_trace(trace_cond);
+ if (trace_csw)
+ thread_trace_context_switches(trace_csw);
+ if (trace_danger_set)
+ thread_trace_danger_set(trace_danger_set);
if (trace_mutex)
mutex_set_trace(trace_mutex);
if (trace_segment)
@@ -714,9 +718,6 @@
void drd_fini(Int exitcode)
{
// thread_print_all();
-#ifdef OLD_RACE_DETECTION_ALGORITHM
- thread_report_all_races();
-#endif
if (VG_(clo_verbosity) > 1 || drd_print_stats)
{
VG_(message)(Vg_DebugMsg,
@@ -724,12 +725,7 @@
" / %lld updates of the danger set",
thread_get_context_switch_count(),
thread_get_update_danger_set_count());
-#ifdef OLD_RACE_DETECTION_ALGORITHM
VG_(message)(Vg_DebugMsg,
- " analysis: %lld data race analysis points",
- thread_get_report_races_count());
-#endif
- VG_(message)(Vg_DebugMsg,
" segments: %lld total, %lld max, %lld discard points",
sg_get_segments_created_count(),
sg_get_max_segments_alive_count(),
|
|
From: <sv...@va...> - 2008-02-24 18:42:55
|
Author: bart
Date: 2008-02-24 18:42:53 +0000 (Sun, 24 Feb 2008)
New Revision: 7449
Log:
Fixed race conditions in client pthread_barrier_wait() intercept code.
Modified:
trunk/exp-drd/drd_barrier.c
Modified: trunk/exp-drd/drd_barrier.c
===================================================================
--- trunk/exp-drd/drd_barrier.c 2008-02-24 18:37:08 UTC (rev 7448)
+++ trunk/exp-drd/drd_barrier.c 2008-02-24 18:42:53 UTC (rev 7449)
@@ -38,31 +38,34 @@
// Type definitions.
-struct barrier_thread_info
-{
- UWord tid; // A DrdThreadId
- Word iteration; // barrier number corresponding to ongoing
- // pthread_barrier() call modulo two.
- VectorClock vc[2]; // vector clocks corresponding to the last two
- // pthread_barrier() calls.
-};
-
+/* Information associated with a client-side pthread_barrier_t object. */
struct barrier_info
{
Addr barrier; // Client address of barrier.
SizeT size; // Size in bytes of client-side object.
Word count; // Participant count in a barrier wait.
- Word iteration; // barrier number corresponding to ongoing
- // pthread_barrier() call modulo two.
- Word participants; // Number of participants that still have to join
- // the most recent barrier.
- OSet* oset; // Information about specific threads.
+ Word pre_iteration; // pthread_barrier_wait() call count modulo two.
+ Word post_iteration; // pthread_barrier_wait() call count modulo two.
+ Word pre_waiters_left; // number of waiters left for a complete barrier.
+ Word post_waiters_left; // number of waiters left for a complete barrier.
+ OSet* oset; // Thread-specific barrier information.
};
+/* Information associated with one thread participating in a barrier. */
+struct barrier_thread_info
+{
+ UWord tid; // A DrdThreadId
+ Word iteration; // iteration of last pthread_barrier_wait()
+ // call thread tid participated in.
+ VectorClock vc[2]; // vector clocks corresponding to the last two
+ // pthread_barrier() calls by thread tid.
+};
+
// Local variables.
static Bool s_trace_barrier = False;
+/* To do: eliminate the upper limit on the number of barriers (4). */
struct barrier_info s_barrier[4];
@@ -73,6 +76,8 @@
s_trace_barrier = trace_barrier;
}
+/** Initialize the structure *p with the specified thread ID and iteration
+ * information. */
static void barrier_thread_initialize(struct barrier_thread_info* const p,
const DrdThreadId tid,
const Word iteration)
@@ -83,12 +88,15 @@
vc_init(&p->vc[1], 0, 0);
}
+/** Deallocate the memory that was allocated in barrier_thread_initialize(). */
static void barrier_thread_destroy(struct barrier_thread_info* const p)
{
vc_cleanup(&p->vc[0]);
vc_cleanup(&p->vc[1]);
}
+/** Initialize the structure *p with the specified client-side barrier address,
+ * barrier object size and number of participants in each barrier. */
static
void barrier_initialize(struct barrier_info* const p,
const Addr barrier,
@@ -99,17 +107,20 @@
tl_assert(size > 0);
tl_assert(count > 0);
- p->barrier = barrier;
- p->size = size;
- p->count = count;
- p->iteration = 0;
- p->participants = count;
+ p->barrier = barrier;
+ p->size = size;
+ p->count = count;
+ p->pre_iteration = 0;
+ p->post_iteration = 0;
+ p->pre_waiters_left = count;
+ p->post_waiters_left = count;
tl_assert(sizeof(((struct barrier_thread_info*)0)->tid) == sizeof(Word));
tl_assert(sizeof(((struct barrier_thread_info*)0)->tid)
>= sizeof(DrdThreadId));
p->oset = VG_(OSetGen_Create)(0, 0, VG_(malloc), VG_(free));
}
+/** Deallocate the memory allocated by barrier_initialize() and in p->oset. */
void barrier_destroy(struct barrier_info* const p)
{
struct barrier_thread_info* q;
@@ -124,13 +135,17 @@
barrier_thread_destroy(q);
}
VG_(OSetGen_Destroy)(p->oset);
- p->barrier = 0;
- p->size = 0;
- p->count = 0;
- p->iteration = 0;
- p->participants = 0;
+ p->barrier = 0;
+ p->size = 0;
+ p->count = 0;
+ p->pre_iteration = 0;
+ p->post_iteration = 0;
+ p->pre_waiters_left = 0;
+ p->post_waiters_left = 0;
}
+/** Look up the client-side barrier address barrier in s_barrier[]. If not
+ * found, add it. */
static
struct barrier_info*
barrier_get_or_allocate(const Addr barrier, const SizeT size, const Word count)
@@ -158,6 +173,8 @@
return 0;
}
+/** Initialize a barrier with client address barrier, client size size, and
+ * where count threads participate in each barrier. */
struct barrier_info*
barrier_init(const Addr barrier, const SizeT size, const Word count)
{
@@ -165,6 +182,8 @@
return barrier_get_or_allocate(barrier, size, count);
}
+/** Look up the address of the information associated with the client-side
+ * barrier object. */
struct barrier_info* barrier_get(const Addr barrier)
{
int i;
@@ -186,26 +205,26 @@
if (s_trace_barrier)
{
VG_(message)(Vg_DebugMsg,
- "[%d] barrier_pre_wait(%p) iteration %d / left %d/%d",
- tid, barrier, p->iteration, p->participants, p->count);
+ "[%d] barrier_pre_wait(%p) iteration %d",
+ tid, barrier, p->pre_iteration);
}
- if (--p->participants <= 0)
- {
- p->iteration = ! p->iteration;
- p->participants = p->count;
- }
q = VG_(OSetGen_Lookup)(p->oset, &word_tid);
if (q == 0)
{
q = VG_(OSetGen_AllocNode)(p->oset, sizeof(*q));
- barrier_thread_initialize(q, tid, p->iteration);
- tl_assert(q->tid == tid);
+ barrier_thread_initialize(q, tid, p->pre_iteration);
VG_(OSetGen_Insert)(p->oset, q);
tl_assert(VG_(OSetGen_Lookup)(p->oset, &word_tid) == q);
}
- tl_assert(VG_(OSetGen_Lookup)(p->oset, &word_tid) == q);
- vc_copy(&q->vc[p->iteration], &thread_get_segment(tid)->vc);
+ vc_assign(&q->vc[p->pre_iteration], &thread_get_segment(tid)->vc);
+ tl_assert(q->vc[p->pre_iteration].size > 0);
+
+ if (--p->pre_waiters_left <= 0)
+ {
+ p->pre_iteration = 1 - p->pre_iteration;
+ p->pre_waiters_left = p->count;
+ }
}
void barrier_post_wait(const DrdThreadId tid, const Addr barrier,
@@ -213,10 +232,12 @@
{
struct barrier_info* const p = barrier_get(barrier);
+ tl_assert(p);
+
if (s_trace_barrier)
{
VG_(message)(Vg_DebugMsg, "[%d] barrier_post_wait(%p) iteration %d",
- tid, barrier, p ? 1 - p->iteration : -1);
+ tid, barrier, p->post_iteration);
}
if (waited)
@@ -225,7 +246,6 @@
struct barrier_thread_info* q;
struct barrier_thread_info* r;
- tl_assert(p);
q = VG_(OSetGen_Lookup)(p->oset, &word_tid);
tl_assert(q);
VG_(OSetGen_ResetIter)(p->oset);
@@ -236,33 +256,48 @@
if (s_trace_barrier)
{
VG_(message)(Vg_DebugMsg,
- "[%d] barrier_post_wait: combining vc of thread %d",
- tid, r->tid);
+ "[%d] barrier_post_wait: combining vc of thread %d, "
+ "iteration %d",
+ tid, r->tid, p->post_iteration);
+ vc_print(&thread_get_segment(tid)->vc);
+ VG_(printf)(", ");
+ vc_print(&r->vc[p->post_iteration]);
+ VG_(printf)(" -> ");
}
- thread_combine_vc2(tid, &r->vc[1 - q->iteration]);
+ thread_combine_vc2(tid, &r->vc[p->post_iteration]);
+ if (s_trace_barrier)
+ {
+ vc_print(&thread_get_segment(tid)->vc);
+ VG_(printf)("\n");
+ }
}
}
+
+ thread_new_segment(tid);
+
+ if (--p->post_waiters_left <= 0)
+ {
+ p->post_iteration = 1 - p->post_iteration;
+ p->post_waiters_left = p->count;
+ }
}
}
-/**
- * Call this function when thread threadid stops to exist, such that the
- * "last owner" field can be cleared if it still refers to that thread.
- */
+/** Call this function when thread tid stops to exist. */
void barrier_thread_delete(const DrdThreadId tid)
{
int i;
- struct barrier_thread_info* q;
for (i = 0; i < sizeof(s_barrier)/sizeof(s_barrier[0]); i++)
{
struct barrier_info* const p = &s_barrier[i];
if (p->barrier)
{
- VG_(OSetGen_ResetIter)(p->oset);
- for ( ; (q = VG_(OSetGen_Next)(p->oset)) != 0; )
- {
- }
+ 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);
}
}
}
|
|
From: <sv...@va...> - 2008-02-24 18:37:07
|
Author: bart
Date: 2008-02-24 18:37:08 +0000 (Sun, 24 Feb 2008)
New Revision: 7448
Log:
Corrected various comments. Removed commented out code. Added code for tracing thread context switches and danger set updating. Fixed memory leak. Danger set is now updated every time a new segment is created instead of only at every context switch, which fixes the bug that no data races were reported for the pth_barrier test program.
Modified:
trunk/exp-drd/drd_thread.c
trunk/exp-drd/drd_thread.h
Modified: trunk/exp-drd/drd_thread.c
===================================================================
--- trunk/exp-drd/drd_thread.c 2008-02-24 18:29:43 UTC (rev 7447)
+++ trunk/exp-drd/drd_thread.c 2008-02-24 18:37:08 UTC (rev 7448)
@@ -78,9 +78,6 @@
static ULong s_context_switch_count;
static ULong s_discard_ordered_segments_count;
-#ifdef OLD_RACE_DETECTION_ALGORITHM
-static ULong s_report_races_count;
-#endif
static ULong s_update_danger_set_count;
static ULong s_danger_set_bitmap_creation_count;
static ULong s_danger_set_bitmap2_creation_count;
@@ -88,10 +85,22 @@
static DrdThreadId s_drd_running_tid = DRD_INVALID_THREADID;
static ThreadInfo s_threadinfo[DRD_N_THREADS];
static struct bitmap* s_danger_set;
+static Bool s_trace_context_switches = False;
+static Bool s_trace_danger_set = False;
// Function definitions.
+void thread_trace_context_switches(const Bool t)
+{
+ s_trace_context_switches = t;
+}
+
+void thread_trace_danger_set(const Bool t)
+{
+ s_trace_danger_set = t;
+}
+
__inline__ Bool IsValidDrdThreadId(const DrdThreadId tid)
{
return (0 <= tid && tid < DRD_N_THREADS && tid != DRD_INVALID_THREADID
@@ -185,9 +194,9 @@
: VG_INVALID_THREADID);
}
-/**
- * Sanity check of the doubly linked list of segments referenced by a ThreadInfo struct.
- * @return True if sane, False if not.
+/** Sanity check of the doubly linked list of segments referenced by a
+ * ThreadInfo struct.
+ * @return True if sane, False if not.
*/
static Bool sane_ThreadInfo(const ThreadInfo* const ti)
{
@@ -224,9 +233,8 @@
return created;
}
-/**
- * Allocate the first segment for a thread. Call this just after
- * pthread_create().
+/** Allocate the first segment for a thread. Call this just after
+ * pthread_create().
*/
DrdThreadId thread_post_create(const ThreadId vg_created)
{
@@ -449,6 +457,13 @@
if (vg_tid != s_vg_running_tid)
{
+ if (s_trace_context_switches
+ && s_drd_running_tid != DRD_INVALID_THREADID)
+ {
+ VG_(message)(Vg_DebugMsg,
+ "Context switch from thread %d to thread %d",
+ s_drd_running_tid, drd_tid);
+ }
s_vg_running_tid = vg_tid;
s_drd_running_tid = drd_tid;
thread_update_danger_set(drd_tid);
@@ -475,11 +490,9 @@
return s_threadinfo[tid].last;
}
-/**
- * Insert a new segment at the end of the segment list.
+/** Append a new segment at the end of the segment list.
*/
-static void thread_append_segment(const DrdThreadId tid,
- Segment* const sg)
+static void thread_append_segment(const DrdThreadId tid, Segment* const sg)
{
tl_assert(0 <= tid && tid < DRD_N_THREADS
&& tid != DRD_INVALID_THREADID);
@@ -494,16 +507,15 @@
tl_assert(sane_ThreadInfo(&s_threadinfo[tid]));
}
-/**
- * Remove a segment from the segment list of thread threadid, and free the
- * associated memory.
+/** Remove a segment from the segment list of thread threadid, and free the
+ * associated memory.
*/
-static void thread_discard_segment(const DrdThreadId tid,
- Segment* const sg)
+static void thread_discard_segment(const DrdThreadId tid, Segment* const sg)
{
tl_assert(0 <= tid && tid < DRD_N_THREADS
&& tid != DRD_INVALID_THREADID);
tl_assert(sane_ThreadInfo(&s_threadinfo[tid]));
+
if (sg->prev)
sg->prev->next = sg->next;
if (sg->next)
@@ -542,10 +554,7 @@
if (latest_sg)
{
if (first)
- {
- vc_cleanup(vc);
- vc_copy(vc, &latest_sg->vc);
- }
+ vc_assign(vc, &latest_sg->vc);
else
vc_min(vc, &latest_sg->vc);
first = False;
@@ -566,10 +575,7 @@
if (latest_sg)
{
if (first)
- {
- vc_cleanup(vc);
- vc_copy(vc, &latest_sg->vc);
- }
+ vc_assign(vc, &latest_sg->vc);
else
vc_combine(vc, &latest_sg->vc);
first = False;
@@ -618,11 +624,6 @@
sg && (sg_next = sg->next) && vc_lte(&sg->vc, &thread_vc_min);
sg = sg_next)
{
-#if 0
- VG_(printf)("Discarding a segment of thread %d: ", i);
- vc_print(&sg->vc);
- VG_(printf)("\n");
-#endif
thread_discard_segment(i, sg);
}
}
@@ -635,25 +636,27 @@
*/
void thread_new_segment(const DrdThreadId tid)
{
- //static int s_calls_since_last_discard = 0;
Segment* sg;
tl_assert(0 <= tid && tid < DRD_N_THREADS
&& tid != DRD_INVALID_THREADID);
-#ifdef OLD_RACE_DETECTION_ALGORITHM
- if (s_threadinfo[tid].last)
- {
- thread_report_races_segment(tid, s_threadinfo[tid].last);
- }
-#endif
-
sg = sg_new(tid, tid);
thread_append_segment(tid, sg);
thread_discard_ordered_segments();
+
+ if (tid == s_drd_running_tid)
+ {
+ /* Every change in the vector clock of the current thread may cause */
+ /* segments that were previously ordered to this thread to become */
+ /* unordered. Hence, recalculate the danger set if the vector clock */
+ /* of the current thread is updated. */
+ thread_update_danger_set(tid);
+ }
}
+/** Call this function after thread 'joiner' joined thread 'joinee'. */
void thread_combine_vc(DrdThreadId joiner, DrdThreadId joinee)
{
tl_assert(joiner != joinee);
@@ -672,6 +675,10 @@
}
}
+/** Call this function after thread 'tid' had to wait because of thread
+ * synchronization until the memory accesses in the segment with vector clock
+ * 'vc' finished.
+ */
void thread_combine_vc2(DrdThreadId tid, const VectorClock* const vc)
{
tl_assert(0 <= tid && tid < DRD_N_THREADS && tid != DRD_INVALID_THREADID);
@@ -681,11 +688,15 @@
thread_discard_ordered_segments();
}
+/** Call this function whenever a thread is no longer using the memory
+ * [ a1, a2 [, e.g. because of a call to free() or a stack pointer
+ * increase.
+ */
void thread_stop_using_mem(const Addr a1, const Addr a2)
{
DrdThreadId other_user = DRD_INVALID_THREADID;
- /* For all threads, mark the range [a,a+size[ as no longer in use. */
+ /* For all threads, mark the range [ a1, a2 [ as no longer in use. */
unsigned i;
for (i = 0; i < sizeof(s_threadinfo) / sizeof(s_threadinfo[0]); i++)
@@ -703,20 +714,11 @@
}
}
- /* If any other thread had accessed memory in [a,a+size[, update the */
+ /* If any other thread had accessed memory in [ a1, a2 [, update the */
/* danger set. */
if (other_user != DRD_INVALID_THREADID
&& bm_has_any_access(s_danger_set, a1, a2))
{
-#if 0
- VG_(message)(Vg_DebugMsg,
- "recalculating danger set because thread %d / %d stopped"
- " using memory at 0x%x sz %d",
- other_user,
- s_threadinfo[other_user].vg_threadid,
- a1,
- a2 - a1);
-#endif
thread_update_danger_set(thread_get_running_tid());
}
}
@@ -797,101 +799,6 @@
}
}
-#ifdef OLD_RACE_DETECTION_ALGORITHM
-void thread_report_races(const DrdThreadId threadid)
-{
- Segment* p;
-
- s_report_races_count++;
-
- tl_assert(0 <= threadid && threadid < DRD_N_THREADS
- && threadid != DRD_INVALID_THREADID);
-
- for (p = s_threadinfo[threadid].first; p; p = p->next)
- {
- thread_report_races_segment(threadid, p);
- }
-}
-
-/**
- * Report all data races for segment p of thread threadid against other
- * threads.
- */
-void thread_report_races_segment(const DrdThreadId threadid,
- Segment* const p)
-{
- unsigned i;
-
- tl_assert(0 <= threadid && threadid < DRD_N_THREADS
- && threadid != DRD_INVALID_THREADID);
- tl_assert(p);
-
- for (i = 0; i < sizeof(s_threadinfo) / sizeof(s_threadinfo[0]); i++)
- {
- if (i != threadid)
- {
- Segment* q;
- for (q = s_threadinfo[i].last; q; q = q->prev)
- {
-#if 0
- char msg[256];
- VG_(snprintf)(msg, sizeof(msg), "Examining thread %d (vc ", threadid);
- vc_snprint(msg + VG_(strlen)(msg), sizeof(msg) - VG_(strlen)(msg),
- &p->vc);
- VG_(snprintf)(msg + VG_(strlen)(msg), sizeof(msg) - VG_(strlen)(msg),
- ") versus thread %d (vc ", i);
- vc_snprint(msg + VG_(strlen)(msg), sizeof(msg) - VG_(strlen)(msg),
- &q->vc);
- VG_(snprintf)(msg + VG_(strlen)(msg), sizeof(msg) - VG_(strlen)(msg),
- ") %d %d",
- vc_lte(&p->vc, &q->vc), vc_lte(&q->vc, &p->vc));
- VG_(message)(Vg_DebugMsg, "%s", msg);
-#endif
- // Since q iterates over the segments of thread i in order of
- // decreasing vector clocks, if q->vc <= p->vc, then
- // q->next->vc <= p->vc will also hold. Hence, break out of the
- // loop once this condition is met.
- if (vc_lte(&q->vc, &p->vc))
- break;
- if (! vc_lte(&p->vc, &q->vc))
- {
- if (bm_has_races(p->bm, q->bm))
- {
- VG_(message)(Vg_UserMsg, "----------------------------------------------------------------------");
- tl_assert(p->stacktrace);
- show_call_stack(threadid, "1st segment start",
- p->stacktrace);
- show_call_stack(threadid, "1st segment end",
- p->next ? p->next->stacktrace : 0);
- tl_assert(q->stacktrace);
- show_call_stack(i, "2nd segment start",
- q->stacktrace);
- show_call_stack(i, "2nd segment end",
- q->next ? q->next->stacktrace : 0);
- bm_report_races(threadid, i, p->bm, q->bm);
- }
- }
- }
- }
- }
-}
-
-/**
- * Report all detected data races for all threads.
- */
-void thread_report_all_races(void)
-{
- unsigned i;
-
- for (i = 0; i < sizeof(s_threadinfo) / sizeof(s_threadinfo[0]); i++)
- {
- if (s_threadinfo[i].last)
- {
- thread_report_races(i);
- }
- }
-}
-#else
static void
thread_report_conflicting_segments_segment(const DrdThreadId tid,
const Addr addr,
@@ -953,47 +860,60 @@
}
}
}
-#endif
-/**
- * Compute a bitmap that represents the union of all memory accesses of all
- * segments that are unordered to the current segment of the thread tid.
+/** Compute a bitmap that represents the union of all memory accesses of all
+ * segments that are unordered to the current segment of the thread tid.
*/
static void thread_update_danger_set(const DrdThreadId tid)
{
Segment* p;
- tl_assert(0 <= tid && tid < DRD_N_THREADS
- && tid != DRD_INVALID_THREADID);
+ tl_assert(0 <= tid && tid < DRD_N_THREADS && tid != DRD_INVALID_THREADID);
tl_assert(tid == s_drd_running_tid);
s_update_danger_set_count++;
s_danger_set_bitmap_creation_count -= bm_get_bitmap_creation_count();
s_danger_set_bitmap2_creation_count -= bm_get_bitmap2_creation_count();
-#if 0
if (s_danger_set)
{
- bm_delete(s_danger_set);
- s_danger_set = 0;
- }
- s_danger_set = bm_new();
-#else
- // Marginally faster than the above code.
- if (s_danger_set)
- {
bm_clear_all(s_danger_set);
}
else
{
s_danger_set = bm_new();
}
-#endif
+ if (s_trace_danger_set)
+ {
+ char msg[256];
+
+ VG_(snprintf)(msg, sizeof(msg),
+ "computing danger set for thread %d with vc ",
+ tid);
+ vc_snprint(msg + VG_(strlen)(msg),
+ sizeof(msg) - VG_(strlen)(msg),
+ &s_threadinfo[tid].last->vc);
+ VG_(message)(Vg_DebugMsg, "%s", msg);
+ }
+
for (p = s_threadinfo[tid].first; p; p = p->next)
{
unsigned j;
+ if (s_trace_danger_set)
+ {
+ char msg[256];
+
+ VG_(snprintf)(msg, sizeof(msg),
+ "danger set: thread [%d] at vc ",
+ tid);
+ vc_snprint(msg + VG_(strlen)(msg),
+ sizeof(msg) - VG_(strlen)(msg),
+ &p->vc);
+ VG_(message)(Vg_DebugMsg, "%s", msg);
+ }
+
for (j = 0; j < sizeof(s_threadinfo) / sizeof(s_threadinfo[0]); j++)
{
if (IsValidDrdThreadId(j))
@@ -1002,9 +922,31 @@
if (j != tid && q != 0
&& ! vc_lte(&q->vc, &p->vc) && ! vc_lte(&p->vc, &q->vc))
{
+ if (s_trace_danger_set)
+ {
+ char msg[256];
+ VG_(snprintf)(msg, sizeof(msg),
+ "danger set: [%d] merging segment ", j);
+ vc_snprint(msg + VG_(strlen)(msg),
+ sizeof(msg) - VG_(strlen)(msg),
+ &q->vc);
+ VG_(message)(Vg_DebugMsg, "%s", msg);
+ }
bm_merge2(s_danger_set, q->bm);
}
-
+ else
+ {
+ if (s_trace_danger_set)
+ {
+ char msg[256];
+ VG_(snprintf)(msg, sizeof(msg),
+ "danger set: [%d] ignoring segment ", j);
+ vc_snprint(msg + VG_(strlen)(msg),
+ sizeof(msg) - VG_(strlen)(msg),
+ &q->vc);
+ VG_(message)(Vg_DebugMsg, "%s", msg);
+ }
+ }
}
}
@@ -1032,11 +974,12 @@
s_danger_set_bitmap_creation_count += bm_get_bitmap_creation_count();
s_danger_set_bitmap2_creation_count += bm_get_bitmap2_creation_count();
-#if 0
- VG_(message)(Vg_DebugMsg, "[%d] new danger set:", tid);
- bm_print(s_danger_set);
- VG_(message)(Vg_DebugMsg, "[%d] end of new danger set.", tid);
-#endif
+ if (0 && s_trace_danger_set)
+ {
+ VG_(message)(Vg_DebugMsg, "[%d] new danger set:", tid);
+ bm_print(s_danger_set);
+ VG_(message)(Vg_DebugMsg, "[%d] end of new danger set.", tid);
+ }
}
Bool thread_conflicting_access(const Addr a,
@@ -1053,13 +996,6 @@
return s_context_switch_count;
}
-#ifdef OLD_RACE_DETECTION_ALGORITHM
-ULong thread_get_report_races_count(void)
-{
- return s_report_races_count;
-}
-#endif
-
ULong thread_get_discard_ordered_segments_count(void)
{
return s_discard_ordered_segments_count;
Modified: trunk/exp-drd/drd_thread.h
===================================================================
--- trunk/exp-drd/drd_thread.h 2008-02-24 18:29:43 UTC (rev 7447)
+++ trunk/exp-drd/drd_thread.h 2008-02-24 18:37:08 UTC (rev 7448)
@@ -45,6 +45,8 @@
typedef UWord PThreadId;
+void thread_trace_context_switches(const Bool t);
+void thread_trace_danger_set(const Bool t);
Bool IsValidDrdThreadId(const DrdThreadId tid);
DrdThreadId VgThreadIdToDrdThreadId(const ThreadId tid);
|
|
From: <sv...@va...> - 2008-02-24 18:29:39
|
Author: bart
Date: 2008-02-24 18:29:43 +0000 (Sun, 24 Feb 2008)
New Revision: 7447
Log:
Fixed a memory leak.
Modified:
trunk/exp-drd/drd_semaphore.c
Modified: trunk/exp-drd/drd_semaphore.c
===================================================================
--- trunk/exp-drd/drd_semaphore.c 2008-02-24 18:29:10 UTC (rev 7446)
+++ trunk/exp-drd/drd_semaphore.c 2008-02-24 18:29:43 UTC (rev 7447)
@@ -157,7 +157,7 @@
{
p->last_sem_post_tid = tid;
thread_new_segment(tid);
- vc_copy(&p->vc, thread_get_vc(tid));
+ vc_assign(&p->vc, thread_get_vc(tid));
}
}
|
|
From: <sv...@va...> - 2008-02-24 18:29:06
|
Author: bart Date: 2008-02-24 18:29:10 +0000 (Sun, 24 Feb 2008) New Revision: 7446 Log: Cleanup: moved const keyword in front of datatype. Modified: trunk/exp-drd/drd_segment.h Modified: trunk/exp-drd/drd_segment.h =================================================================== --- trunk/exp-drd/drd_segment.h 2008-02-24 18:28:19 UTC (rev 7445) +++ trunk/exp-drd/drd_segment.h 2008-02-24 18:29:10 UTC (rev 7446) @@ -48,14 +48,14 @@ } Segment; void sg_init(Segment* const sg, - ThreadId const creator, - ThreadId const created); + const ThreadId creator, + const ThreadId created); void sg_cleanup(Segment* const sg); -Segment* sg_new(ThreadId const creator, ThreadId const created); +Segment* sg_new(const ThreadId creator, const ThreadId created); void sg_delete(Segment* const sg); void sg_print(const Segment* const sg); Bool sg_get_trace(void); -void sg_set_trace(Bool const trace_segment); +void sg_set_trace(const Bool trace_segment); ULong sg_get_segments_created_count(void); ULong sg_get_max_segments_alive_count(void); |
|
From: <sv...@va...> - 2008-02-24 18:28:16
|
Author: bart
Date: 2008-02-24 18:28:19 +0000 (Sun, 24 Feb 2008)
New Revision: 7445
Log:
Cleanup: removed commented out code.
Modified:
trunk/exp-drd/drd_bitmap.c
Modified: trunk/exp-drd/drd_bitmap.c
===================================================================
--- trunk/exp-drd/drd_bitmap.c 2008-02-24 18:27:11 UTC (rev 7444)
+++ trunk/exp-drd/drd_bitmap.c 2008-02-24 18:28:19 UTC (rev 7445)
@@ -336,7 +336,6 @@
}
}
-#if 1
// New and fast implementation.
void bm_clear(const struct bitmap* const bm,
const Addr a1,
@@ -391,44 +390,7 @@
}
}
}
-#else
-// Old and slow implementation
-void bm_clear(const struct bitmap* const bm,
- const Addr a1,
- const Addr a2)
-{
- Addr b, b_next, c;
- tl_assert(bm);
- tl_assert(a1);
- tl_assert(a1 <= a2);
-
- for (b = a1; b < a2; b = b_next)
- {
- struct bitmap2* const p2 = bm_lookup(bm, b);
-
- b_next = (b & ~ADDR0_MASK) + ADDR0_COUNT;
- if (b_next > a2)
- {
- b_next = a2;
- }
-
- if (p2)
- {
- for (c = b; c < b_next; c++)
- {
- const UWord c0 = c & ADDR0_MASK;
-
- p2->bm1.bm0_r[c0 / (8*sizeof(UWord))]
- &= ~(1UL << (c0 % (8*sizeof(UWord))));
- p2->bm1.bm0_w[c0 / (8*sizeof(UWord))]
- &= ~(1UL << (c0 % (8*sizeof(UWord))));
- }
- }
- }
-}
-#endif
-
static
__inline__
UWord bm_has_conflict_with_1(const struct bitmap* const bm,
@@ -568,96 +530,6 @@
return 0;
}
-#ifdef OLD_RACE_DETECTION_ALGORITHM
-/**
- * Report RW / WR / WW patterns between lhs and rhs.
- * @param tid1 Thread ID of lhs.
- * @param tid2 Thread ID of rhs.
- * @param lhs First bitmap.
- * @param rhs Bitmap to be compared with lhs.
- * @return Number of reported ranges with data races.
- */
-void bm_report_races(const ThreadId tid1,
- const ThreadId tid2,
- const struct bitmap* const lhs,
- const struct bitmap* const rhs)
-{
- Addr range_begin = 0;
- Addr range_end = 0;
- UWord range_access = 0;
-
- VG_(message)(Vg_UserMsg, "Data addresses accessed by both segments:");
-
- VG_(OSetGen_ResetIter)(lhs->oset);
- VG_(OSetGen_ResetIter)(rhs->oset);
-
- for (;;)
- {
- const struct bitmap2* bm2l = VG_(OSetGen_Next)(lhs->oset);
- const struct bitmap2* bm2r = VG_(OSetGen_Next)(rhs->oset);
- const struct bitmap1* bm1l;
- const struct bitmap1* bm1r;
- unsigned k;
-
- while (bm2l && bm2r && bm2l->addr != bm2r->addr)
- {
- if (bm2l->addr < bm2r->addr)
- bm2l = VG_(OSetGen_Next)(lhs->oset);
- else
- bm2r = VG_(OSetGen_Next)(rhs->oset);
- }
- if (bm2l == 0 || bm2r == 0)
- break;
-
- bm1l = &bm2l->bm1;
- bm1r = &bm2r->bm1;
-
- for (k = 0; k < BITMAP1_UWORD_COUNT; k++)
- {
- unsigned b;
- for (b = 0; b < BITS_PER_UWORD; b++)
- {
- UWord const access
- = ((bm1l->bm0_r[k] & bm0_mask(b)) ? LHS_R : 0)
- | ((bm1l->bm0_w[k] & bm0_mask(b)) ? LHS_W : 0)
- | ((bm1r->bm0_r[k] & bm0_mask(b)) ? RHS_R : 0)
- | ((bm1r->bm0_w[k] & bm0_mask(b)) ? RHS_W : 0);
- Addr const a = MAKE_ADDRESS(bm2l->addr, k * BITS_PER_UWORD | b);
- if (access == range_access)
- range_end = a + 1;
- else
- {
- tl_assert(range_begin < range_end);
- if (HAS_RACE(range_access)
- && ! drd_is_suppressed(range_begin, range_end))
- {
- DataRaceInfo dri;
- dri.tid1 = tid1;
- dri.tid2 = tid2;
- dri.range_begin = range_begin;
- dri.range_end = range_end;
- dri.range_access = range_access;
- tl_assert(dri.range_begin < dri.range_end);
-#if 0
- VG_(maybe_record_error)(tid1,
- DataRaceErr,
- VG_(get_IP)(tid1), // where
- "data race",
- &dri);
-#else
- drd_report_data_race(&dri);
-#endif
- }
- range_access = access;
- range_begin = a;
- range_end = a + 1;
- }
- }
- }
- }
-}
-#endif
-
void bm_print(const struct bitmap* const bm)
{
struct bitmap2* bm2;
|
|
From: <sv...@va...> - 2008-02-24 18:27:16
|
Author: bart Date: 2008-02-24 18:27:11 +0000 (Sun, 24 Feb 2008) New Revision: 7444 Log: Minor change: renamed one variable. Modified: trunk/exp-drd/drd_mutex.h Modified: trunk/exp-drd/drd_mutex.h =================================================================== --- trunk/exp-drd/drd_mutex.h 2008-02-24 18:26:46 UTC (rev 7443) +++ trunk/exp-drd/drd_mutex.h 2008-02-24 18:27:11 UTC (rev 7444) @@ -52,7 +52,7 @@ Bool mutex_is_locked_by(const Addr mutex, const DrdThreadId tid); const VectorClock* mutex_get_last_vc(const Addr mutex); int mutex_get_recursion_count(const Addr mutex); -void mutex_thread_delete(const DrdThreadId threadid); +void mutex_thread_delete(const DrdThreadId tid); void mutex_stop_using_mem(const Addr a1, const Addr a2); ULong get_mutex_lock_count(void); |
|
From: <sv...@va...> - 2008-02-24 18:26:42
|
Author: bart
Date: 2008-02-24 18:26:46 +0000 (Sun, 24 Feb 2008)
New Revision: 7443
Log:
Added vc_assign() function.
Modified:
trunk/exp-drd/drd_vc.c
trunk/exp-drd/drd_vc.h
Modified: trunk/exp-drd/drd_vc.c
===================================================================
--- trunk/exp-drd/drd_vc.c 2008-02-24 18:25:43 UTC (rev 7442)
+++ trunk/exp-drd/drd_vc.c 2008-02-24 18:26:46 UTC (rev 7443)
@@ -58,15 +58,21 @@
vc_reserve(vc, 0);
}
-/**
- * Copy constructor -- initializes 'new'.
- */
+/** Copy constructor -- initializes *new. */
void vc_copy(VectorClock* const new,
const VectorClock* const rhs)
{
vc_init(new, rhs->vc, rhs->size);
}
+/** Assignment operator -- *lhs is already a valid vector clock. */
+void vc_assign(VectorClock* const lhs,
+ const VectorClock* const rhs)
+{
+ vc_cleanup(lhs);
+ vc_copy(lhs, rhs);
+}
+
void vc_increment(VectorClock* const vc, ThreadId const threadid)
{
unsigned i;
Modified: trunk/exp-drd/drd_vc.h
===================================================================
--- trunk/exp-drd/drd_vc.h 2008-02-24 18:25:43 UTC (rev 7442)
+++ trunk/exp-drd/drd_vc.h 2008-02-24 18:26:46 UTC (rev 7443)
@@ -67,6 +67,8 @@
void vc_cleanup(VectorClock* const vc);
void vc_copy(VectorClock* const new,
const VectorClock* const rhs);
+void vc_assign(VectorClock* const lhs,
+ const VectorClock* const rhs);
void vc_increment(VectorClock* const vc, ThreadId const threadid);
Bool vc_lte(const VectorClock* const vc1,
const VectorClock* const vc2);
|
|
From: <sv...@va...> - 2008-02-24 18:25:40
|
Author: bart
Date: 2008-02-24 18:25:43 +0000 (Sun, 24 Feb 2008)
New Revision: 7442
Log:
Cleanup: removed old data race detection algorithm implementation.
Modified:
trunk/exp-drd/drd_error.c
trunk/exp-drd/drd_error.h
Modified: trunk/exp-drd/drd_error.c
===================================================================
--- trunk/exp-drd/drd_error.c 2008-02-24 18:22:37 UTC (rev 7441)
+++ trunk/exp-drd/drd_error.c 2008-02-24 18:25:43 UTC (rev 7442)
@@ -217,36 +217,6 @@
return buf;
}
-#ifdef OLD_RACE_DETECTION_ALGORITHM
-void drd_report_data_race(const DataRaceInfo* const dri)
-{
- AddrInfo ai;
- Char descr[256];
-
- tl_assert(dri);
- tl_assert(dri->range_begin < dri->range_end);
- describe_addr_text(dri->range_begin, dri->range_end - dri->range_begin,
- &ai, descr, sizeof(descr));
- VG_(message)(Vg_UserMsg,
- "0x%08lx sz %ld %c %c (%s)",
- dri->range_begin,
- dri->range_end - dri->range_begin,
- dri->range_access & LHS_W ? 'W' : 'R',
- dri->range_access & RHS_W ? 'W' : 'R',
- descr);
- if (ai.akind == eMallocd && ai.lastchange)
- {
- VG_(message)(Vg_UserMsg, "Allocation context:");
- VG_(pp_ExeContext)(ai.lastchange);
- }
- // Note: for stack and heap variables suppression should be
- // stopped automatically as soon as the specified memory
- // range has been freed.
- tl_assert(dri->range_begin < dri->range_end);
- drd_start_suppression(dri->range_begin, dri->range_end, "detected race");
-}
-#endif
-
static
void drd_report_data_race2(Error* const err, const DataRaceErrInfo* const dri)
{
Modified: trunk/exp-drd/drd_error.h
===================================================================
--- trunk/exp-drd/drd_error.h 2008-02-24 18:22:37 UTC (rev 7441)
+++ trunk/exp-drd/drd_error.h 2008-02-24 18:25:43 UTC (rev 7442)
@@ -72,18 +72,7 @@
}
AddrInfo;
-#ifdef OLD_RACE_DETECTION_ALGORITHM
-/* Records info about a data race. */
typedef struct {
- ThreadId tid1; // Thread ID of first thread involved in the data race.
- ThreadId tid2; // Thread ID of second thread involved in the data race.
- Addr range_begin; // Start address of range involved.
- Addr range_end; // Last address (exclusive) of range involved.
- UInt range_access; // How the range was accessed (LHS_[RW] | RHS_[RW]).
-} DataRaceInfo;
-#endif
-
-typedef struct {
ThreadId tid; // Thread ID of the running thread.
Addr addr; // Conflicting address in current thread.
SizeT size; // Size in bytes of conflicting operation.
@@ -108,10 +97,6 @@
void describe_addr(Addr const a, SizeT const len, AddrInfo* const ai);
Char* describe_addr_text(Addr const a, SizeT const len, AddrInfo* const ai,
Char* const buf, UInt const n_buf);
-#ifdef OLD_RACE_DETECTION_ALGORITHM
-void drd_report_data_race(const DataRaceInfo* const dri);
-#endif
-//void drd_report_data_race2(const DataRaceErrInfo* const dri);
void drd_register_error_handlers(void);
|
|
From: <sv...@va...> - 2008-02-24 18:22:35
|
Author: bart
Date: 2008-02-24 18:22:37 +0000 (Sun, 24 Feb 2008)
New Revision: 7441
Log:
Fixed a memory leak and renamed one variable.
Modified:
trunk/exp-drd/drd_mutex.c
Modified: trunk/exp-drd/drd_mutex.c
===================================================================
--- trunk/exp-drd/drd_mutex.c 2008-02-24 18:21:12 UTC (rev 7440)
+++ trunk/exp-drd/drd_mutex.c 2008-02-24 18:22:37 UTC (rev 7441)
@@ -332,7 +332,7 @@
/* This pthread_mutex_unlock() call really unlocks the mutex. Save the */
/* current vector clock of the thread such that it is available when */
/* this mutex is locked again. */
- vc_copy(&p->vc, vc);
+ vc_assign(&p->vc, vc);
thread_new_segment(drd_tid);
}
@@ -385,18 +385,18 @@
}
/**
- * Call this function when thread threadid stops to exist, such that the
+ * Call this function when thread tid stops to exist, such that the
* "last owner" field can be cleared if it still refers to that thread.
* TO DO: print an error message if a thread exits while it still has some
* mutexes locked.
*/
-void mutex_thread_delete(const DrdThreadId threadid)
+void mutex_thread_delete(const DrdThreadId tid)
{
int i;
for (i = 0; i < sizeof(s_mutex)/sizeof(s_mutex[0]); i++)
{
struct mutex_info* const p = &s_mutex[i];
- if (p->mutex && p->owner == threadid)
+ if (p->mutex && p->owner == tid)
{
p->owner = VG_INVALID_THREADID;
}
|
|
From: <sv...@va...> - 2008-02-24 18:21:12
|
Author: bart
Date: 2008-02-24 18:21:12 +0000 (Sun, 24 Feb 2008)
New Revision: 7440
Log:
Added more debugging output.
Modified:
trunk/exp-drd/drd_segment.c
Modified: trunk/exp-drd/drd_segment.c
===================================================================
--- trunk/exp-drd/drd_segment.c 2008-02-24 18:19:09 UTC (rev 7439)
+++ trunk/exp-drd/drd_segment.c 2008-02-24 18:21:12 UTC (rev 7440)
@@ -114,6 +114,18 @@
void sg_delete(Segment* const sg)
{
+#if 1
+ if (sg_get_trace())
+ {
+ char msg[256];
+ VG_(snprintf)(msg, sizeof(msg),
+ "Discarding the segment with vector clock ");
+ vc_snprint(msg + VG_(strlen)(msg), sizeof(msg) - VG_(strlen)(msg),
+ &sg->vc);
+ VG_(message)(Vg_DebugMsg, "%s", msg);
+ }
+#endif
+
s_segments_alive_count--;
tl_assert(sg);
|
|
From: <sv...@va...> - 2008-02-24 18:19:05
|
Author: bart Date: 2008-02-24 18:19:09 +0000 (Sun, 24 Feb 2008) New Revision: 7439 Log: Fixed output. Modified: trunk/exp-drd/tests/pth_barrier.stderr.exp Modified: trunk/exp-drd/tests/pth_barrier.stderr.exp =================================================================== --- trunk/exp-drd/tests/pth_barrier.stderr.exp 2008-02-24 18:18:23 UTC (rev 7438) +++ trunk/exp-drd/tests/pth_barrier.stderr.exp 2008-02-24 18:19:09 UTC (rev 7439) @@ -1,3 +1,23 @@ +Thread 2: +Conflicting store by thread 2 at 0x........ size 4 + at 0x........: threadfunc (pth_barrier.c:?) + by 0x........: vg_thread_wrapper (drd_intercepts.c:?) + by 0x........: start_thread (in libpthread-?.?.so) + by 0x........: clone (in /...libc...) +Allocation context: unknown +Other segment start (thread 3) + at 0x........: pthread_barrier_wait (drd_intercepts.c:?) + by 0x........: threadfunc (pth_barrier.c:?) + by 0x........: vg_thread_wrapper (drd_intercepts.c:?) + by 0x........: start_thread (in libpthread-?.?.so) + by 0x........: clone (in /...libc...) +Other segment end (thread 3) + at 0x........: __lll_mutex_lock_wait (in libpthread-?.?.so) + by 0x........: pthread_barrier_wait (in libpthread-?.?.so) + by 0x........: threadfunc (pth_barrier.c:?) + by 0x........: vg_thread_wrapper (drd_intercepts.c:?) + by 0x........: start_thread (in libpthread-?.?.so) + by 0x........: clone (in /...libc...) -ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) +ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) |
|
From: <sv...@va...> - 2008-02-24 18:18:19
|
Author: bart
Date: 2008-02-24 18:18:23 +0000 (Sun, 24 Feb 2008)
New Revision: 7438
Log:
Various minor changes.
Modified:
trunk/exp-drd/tests/pth_barrier.c
Modified: trunk/exp-drd/tests/pth_barrier.c
===================================================================
--- trunk/exp-drd/tests/pth_barrier.c 2008-02-24 18:16:56 UTC (rev 7437)
+++ trunk/exp-drd/tests/pth_barrier.c 2008-02-24 18:18:23 UTC (rev 7438)
@@ -39,6 +39,8 @@
/* Function definitions. */
/*************************/
+/** Single thread, which touches p->iterations elements of array p->array.
+ * Each modification of an element of p->array is a data race. */
static void* threadfunc(struct threadinfo* p)
{
int i;
@@ -58,7 +60,7 @@
return 0;
}
-/** Multithreaded Gauss-Jordan algorithm. */
+/** Actual test, consisting of nthread threads. */
static void barriers_and_races(const int nthread, const int iterations)
{
int i;
@@ -69,6 +71,9 @@
t = malloc(nthread * sizeof(struct threadinfo));
array = malloc(iterations * sizeof(array[0]));
+ if (! s_silent)
+ printf("&array[0] = %p\n", array);
+
pthread_barrier_init(&b, 0, nthread);
for (i = 0; i < nthread; i++)
@@ -95,9 +100,9 @@
int nthread;
int iterations;
- nthread = (argc > 1) ? atoi(argv[1]) : 2;
+ nthread = (argc > 1) ? atoi(argv[1]) : 2;
iterations = (argc > 2) ? atoi(argv[2]) : 3;
- s_silent = (argc > 3) ? atoi(argv[3]) : 0;
+ s_silent = (argc > 3) ? atoi(argv[3]) : 0;
barriers_and_races(nthread, iterations);
|
|
From: <sv...@va...> - 2008-02-24 18:16:54
|
Author: bart Date: 2008-02-24 18:16:56 +0000 (Sun, 24 Feb 2008) New Revision: 7437 Log: Whitespace-only change. Modified: trunk/exp-drd/tests/matinv.c Modified: trunk/exp-drd/tests/matinv.c =================================================================== --- trunk/exp-drd/tests/matinv.c 2008-02-23 19:04:44 UTC (rev 7436) +++ trunk/exp-drd/tests/matinv.c 2008-02-24 18:16:56 UTC (rev 7437) @@ -313,8 +313,8 @@ double ratio; matrix_size = (argc > 1) ? atoi(argv[1]) : 3; - s_nthread = (argc > 2) ? atoi(argv[2]) : 3; - silent = (argc > 3) ? atoi(argv[3]) : 0; + s_nthread = (argc > 2) ? atoi(argv[2]) : 3; + silent = (argc > 3) ? atoi(argv[3]) : 0; eps = epsilon(); a = new_matrix(matrix_size, matrix_size); |
|
From: Tom H. <th...@cy...> - 2008-02-24 05:14:43
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2008-02-24 03:15:15 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 338 tests, 80 stderr failures, 1 stdout failure, 29 post failures == memcheck/tests/addressable (stderr) memcheck/tests/badjump (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/erringfds (stderr) memcheck/tests/leak-0 (stderr) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-pool-0 (stderr) memcheck/tests/leak-pool-1 (stderr) memcheck/tests/leak-pool-2 (stderr) memcheck/tests/leak-pool-3 (stderr) memcheck/tests/leak-pool-4 (stderr) memcheck/tests/leak-pool-5 (stderr) memcheck/tests/leak-regroot (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/long_namespace_xml (stderr) memcheck/tests/lsframe1 (stderr) memcheck/tests/lsframe2 (stderr) memcheck/tests/malloc_free_fill (stderr) memcheck/tests/match-overrun (stderr) memcheck/tests/noisy_child (stderr) memcheck/tests/partial_load_dflt (stderr) memcheck/tests/partial_load_ok (stderr) memcheck/tests/partiallydefinedeq (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/sigkill (stderr) memcheck/tests/stack_changes (stderr) memcheck/tests/x86/bug152022 (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) memcheck/tests/x86/xor-undef-x86 (stderr) memcheck/tests/xml1 (stderr) massif/tests/alloc-fns-A (post) massif/tests/alloc-fns-B (post) massif/tests/basic (post) massif/tests/basic2 (post) massif/tests/big-alloc (post) massif/tests/culling1 (stderr) massif/tests/culling2 (stderr) massif/tests/custom_alloc (post) massif/tests/deep-A (post) massif/tests/deep-B (stderr) massif/tests/deep-B (post) massif/tests/deep-C (stderr) massif/tests/deep-C (post) massif/tests/deep-D (post) massif/tests/ignoring (post) massif/tests/insig (post) massif/tests/long-names (post) massif/tests/long-time (post) massif/tests/new-cpp (post) massif/tests/null (post) massif/tests/one (post) massif/tests/overloaded-new (post) massif/tests/peak (post) massif/tests/peak2 (stderr) massif/tests/peak2 (post) massif/tests/realloc (stderr) massif/tests/realloc (post) massif/tests/thresholds_0_0 (post) massif/tests/thresholds_0_10 (post) massif/tests/thresholds_10_0 (post) massif/tests/thresholds_10_10 (post) massif/tests/thresholds_5_0 (post) massif/tests/thresholds_5_10 (post) massif/tests/zero1 (post) massif/tests/zero2 (post) none/tests/blockfault (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/hg01_all_ok (stderr) helgrind/tests/hg02_deadlock (stderr) helgrind/tests/hg03_inherit (stderr) helgrind/tests/hg04_race (stderr) helgrind/tests/hg05_race2 (stderr) helgrind/tests/hg06_readshared (stderr) helgrind/tests/tc01_simple_race (stderr) helgrind/tests/tc02_simple_tls (stderr) helgrind/tests/tc03_re_excl (stderr) helgrind/tests/tc05_simple_race (stderr) helgrind/tests/tc06_two_races (stderr) helgrind/tests/tc07_hbl1 (stderr) helgrind/tests/tc08_hbl2 (stderr) helgrind/tests/tc09_bad_unlock (stderr) helgrind/tests/tc11_XCHG (stderr) helgrind/tests/tc12_rwl_trivial (stderr) helgrind/tests/tc14_laog_dinphils (stderr) helgrind/tests/tc16_byterace (stderr) helgrind/tests/tc17_sembar (stderr) helgrind/tests/tc18_semabuse (stderr) helgrind/tests/tc19_shadowmem (stderr) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc21_pthonce (stderr) helgrind/tests/tc22_exit_w_lock (stderr) helgrind/tests/tc23_bogus_condwait (stderr) helgrind/tests/tc24_nonzero_sem (stderr) exp-drd/tests/fp_race (stderr) exp-drd/tests/fp_race2 (stderr) exp-drd/tests/matinv (stderr) exp-drd/tests/pth_barrier (stderr) exp-drd/tests/pth_broadcast (stderr) exp-drd/tests/pth_cond_race (stderr) exp-drd/tests/pth_cond_race2 (stderr) exp-drd/tests/pth_create_chain (stderr) exp-drd/tests/pth_detached (stderr) exp-drd/tests/pth_detached2 (stderr) exp-drd/tests/sem_as_mutex (stderr) exp-drd/tests/sem_as_mutex2 (stderr) exp-drd/tests/sigalrm (stderr) exp-drd/tests/tc17_sembar (stderr) exp-drd/tests/tc18_semabuse (stderr) |
|
From: Tom H. <th...@cy...> - 2008-02-24 04:13:32
|
Nightly build on lloyd ( x86_64, Fedora 7 ) started at 2008-02-24 03:05:09 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 372 tests, 7 stderr failures, 2 stdout failures, 0 post failures == memcheck/tests/malloc_free_fill (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/vcpu_fnfns (stdout) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) |
|
From: Tom H. <th...@cy...> - 2008-02-24 03:54:15
|
Nightly build on aston ( x86_64, Fedora Core 5 ) started at 2008-02-24 03:20:07 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 378 tests, 8 stderr failures, 1 stdout failure, 0 post failures == memcheck/tests/malloc_free_fill (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/blockfault (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) |
|
From: Tom H. <th...@cy...> - 2008-02-24 03:48:08
|
Nightly build on trojan ( x86_64, Fedora Core 6 ) started at 2008-02-24 03:25:19 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 376 tests, 6 stderr failures, 5 stdout failures, 0 post failures == memcheck/tests/pointer-trace (stderr) memcheck/tests/vcpu_fnfns (stdout) memcheck/tests/x86/bug133694 (stdout) memcheck/tests/x86/bug133694 (stderr) memcheck/tests/x86/scalar (stderr) none/tests/cmdline1 (stdout) none/tests/cmdline2 (stdout) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) |
|
From: Tom H. <th...@cy...> - 2008-02-24 03:28:01
|
Nightly build on dellow ( x86_64, Fedora 8 ) started at 2008-02-24 03:10:03 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 372 tests, 8 stderr failures, 2 stdout failures, 0 post failures == memcheck/tests/malloc_free_fill (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/vcpu_fnfns (stdout) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc18_semabuse (stderr) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) |
|
From: Tom H. <th...@cy...> - 2008-02-24 03:16:27
|
Nightly build on gill ( x86_64, Fedora Core 2 ) started at 2008-02-24 03:00:02 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 378 tests, 29 stderr failures, 3 stdout failures, 0 post failures == memcheck/tests/malloc_free_fill (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) none/tests/amd64/insn_ssse3 (stdout) none/tests/amd64/insn_ssse3 (stderr) none/tests/amd64/ssse3_misaligned (stderr) none/tests/blockfault (stderr) none/tests/fdleak_fcntl (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) none/tests/x86/insn_ssse3 (stdout) none/tests/x86/insn_ssse3 (stderr) none/tests/x86/ssse3_misaligned (stderr) helgrind/tests/hg01_all_ok (stderr) helgrind/tests/hg02_deadlock (stderr) helgrind/tests/hg03_inherit (stderr) helgrind/tests/hg04_race (stderr) helgrind/tests/hg05_race2 (stderr) helgrind/tests/tc01_simple_race (stderr) helgrind/tests/tc05_simple_race (stderr) helgrind/tests/tc06_two_races (stderr) helgrind/tests/tc09_bad_unlock (stderr) helgrind/tests/tc14_laog_dinphils (stderr) helgrind/tests/tc16_byterace (stderr) helgrind/tests/tc17_sembar (stderr) helgrind/tests/tc19_shadowmem (stderr) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc21_pthonce (stderr) helgrind/tests/tc22_exit_w_lock (stderr) helgrind/tests/tc23_bogus_condwait (stderr) |