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
(12) |
|
2
(6) |
3
(13) |
4
(9) |
5
(6) |
6
(8) |
7
(5) |
8
(5) |
|
9
(15) |
10
(18) |
11
(18) |
12
(18) |
13
(7) |
14
(11) |
15
(6) |
|
16
(12) |
17
(28) |
18
(15) |
19
(12) |
20
(17) |
21
(23) |
22
(10) |
|
23
(9) |
24
(11) |
25
(7) |
26
(21) |
27
(12) |
28
(6) |
29
(6) |
|
30
(8) |
|
|
|
|
|
|
|
From: Tom H. <th...@cy...> - 2007-09-27 02:30:50
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2007-09-27 03:15:01 BST 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 == 256 tests, 27 stderr failures, 1 stdout failure, 0 posttest 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/match-overrun (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/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) memcheck/tests/x86/xor-undef-x86 (stderr) memcheck/tests/xml1 (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) |
|
From: Tom H. <th...@cy...> - 2007-09-27 02:26:14
|
Nightly build on dellow ( x86_64, Fedora 7 ) started at 2007-09-27 03:10:08 BST 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 == 293 tests, 4 stderr failures, 2 stdout failures, 0 posttest failures == 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) |
|
From: Tom H. <th...@cy...> - 2007-09-27 02:17:27
|
Nightly build on lloyd ( x86_64, Fedora Core 3 ) started at 2007-09-27 03:05:05 BST 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 == 293 tests, 6 stderr failures, 1 stdout failure, 0 posttest failures == memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) memcheck/tests/xml1 (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) |
|
From: Tom H. <th...@cy...> - 2007-09-27 02:15:35
|
Nightly build on gill ( x86_64, Fedora Core 2 ) started at 2007-09-27 03:00:02 BST 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 == 295 tests, 6 stderr failures, 1 stdout failure, 0 posttest failures == memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) none/tests/fdleak_fcntl (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) |
|
From: Nicholas N. <nj...@cs...> - 2007-09-27 02:10:43
|
Greetings, We have some bad news. Bryan Meredith, who wrote the leak-checking tool Omega, died earlier this year in a motorcycle accident. We were informed of this recently by one of Bryan's colleagues. We have been informed that Bryan's widow and colleagues would be happy if somebody took over Omega and maintained it, so that his work would not be lost. If anybody is interested in taking over maintainance and development of Omega, please let us know. I believe that Omega's code is not as robust as it could be, but that the tool is already useful to some people, and is worthy of maintainence, further investigation and development. Nick |
|
From: <js...@ac...> - 2007-09-27 00:41:40
|
Nightly build on g5 ( SuSE 10.1, ppc970 ) started at 2007-09-27 02:00:01 CEST 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 == 228 tests, 6 stderr failures, 2 stdout failures, 0 posttest failures == memcheck/tests/deep_templates (stdout) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/pointer-trace (stderr) none/tests/faultstatus (stderr) none/tests/fdleak_cmsg (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) |
|
From: <sv...@va...> - 2007-09-27 00:01:28
|
Author: njn
Date: 2007-09-27 01:01:21 +0100 (Thu, 27 Sep 2007)
New Revision: 6920
Log:
Show skipped counts with -v.
Modified:
branches/MASSIF2/massif/ms_main.c
branches/MASSIF2/massif/tests/culling1.stderr.exp
Modified: branches/MASSIF2/massif/ms_main.c
===================================================================
--- branches/MASSIF2/massif/ms_main.c 2007-09-26 23:28:15 UTC (rev 6919)
+++ branches/MASSIF2/massif/ms_main.c 2007-09-27 00:01:21 UTC (rev 6920)
@@ -31,8 +31,6 @@
// XXX:
//---------------------------------------------------------------------------
// Todo:
-// - -v: give more detail on each snapshot -- sizes, etc
-// - -v: print number of skipped snapshots after each one is taken
// - make --time-unit=B include heap-admin bytes
// - Add ability to draw multiple graphs, eg. heap-only, stack-only, total.
// Give each graph a title.
@@ -259,6 +257,7 @@
static UInt n_cullings = 0;
static UInt n_real_snapshots = 0;
static UInt n_skipped_snapshots = 0;
+static UInt n_skipped_snapshots_since_last_snapshot = 0;
//------------------------------------------------------------//
@@ -1128,8 +1127,6 @@
snapshot->time = time;
snapshot->total_szB =
snapshot->heap_szB + snapshot->heap_admin_szB + snapshot->stacks_szB;
-
- // Sanity-check it.
sanity_check_snapshot(snapshot);
// Update peak data -------------------------------------------------
@@ -1139,9 +1136,16 @@
peak_snapshot_total_szB = snapshot->total_szB;
}
+ // Finish up verbosity and stats stuff.
if (VG_(clo_verbosity) > 1) {
+ if (n_skipped_snapshots_since_last_snapshot > 0) {
+ VERB(" (skipped %d snapshot%s)",
+ n_skipped_snapshots_since_last_snapshot,
+ ( n_skipped_snapshots_since_last_snapshot == 1 ? "" : "s") );
+ }
VERB_snapshot(kind, snapshot_i);
}
+ n_skipped_snapshots_since_last_snapshot = 0;
}
@@ -1166,6 +1170,7 @@
time_since_prev = time - time_of_prev_snapshot;
if (time < earliest_possible_time_of_next_snapshot) {
n_skipped_snapshots++;
+ n_skipped_snapshots_since_last_snapshot++;
return;
}
Modified: branches/MASSIF2/massif/tests/culling1.stderr.exp
===================================================================
--- branches/MASSIF2/massif/tests/culling1.stderr.exp 2007-09-26 23:28:15 UTC (rev 6919)
+++ branches/MASSIF2/massif/tests/culling1.stderr.exp 2007-09-27 00:01:21 UTC (rev 6920)
@@ -208,55 +208,105 @@
Massif: post-cull S. 48 (t:960, hp:960, ad:768, st:0)
Massif: post-cull Sd 49 (t:990, hp:990, ad:792, st:0)
Massif: New time interval = 20 (between snapshots 0 and 1)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 50 (t:1010, hp:1010, ad:808, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 51 (t:1030, hp:1030, ad:824, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 52 (t:1050, hp:1050, ad:840, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 53 (t:1070, hp:1070, ad:856, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 54 (t:1090, hp:1090, ad:872, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 55 (t:1110, hp:1110, ad:888, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 56 (t:1130, hp:1130, ad:904, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 57 (t:1150, hp:1150, ad:920, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 58 (t:1170, hp:1170, ad:936, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc Sd 59 (t:1190, hp:1190, ad:952, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 60 (t:1210, hp:1210, ad:968, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 61 (t:1230, hp:1230, ad:984, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 62 (t:1250, hp:1250, ad:1000, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 63 (t:1270, hp:1270, ad:1016, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 64 (t:1290, hp:1290, ad:1032, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 65 (t:1310, hp:1310, ad:1048, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 66 (t:1330, hp:1330, ad:1064, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 67 (t:1350, hp:1350, ad:1080, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 68 (t:1370, hp:1370, ad:1096, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc Sd 69 (t:1390, hp:1390, ad:1112, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 70 (t:1410, hp:1410, ad:1128, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 71 (t:1430, hp:1430, ad:1144, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 72 (t:1450, hp:1450, ad:1160, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 73 (t:1470, hp:1470, ad:1176, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 74 (t:1490, hp:1490, ad:1192, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 75 (t:1510, hp:1510, ad:1208, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 76 (t:1530, hp:1530, ad:1224, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 77 (t:1550, hp:1550, ad:1240, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 78 (t:1570, hp:1570, ad:1256, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc Sd 79 (t:1590, hp:1590, ad:1272, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 80 (t:1610, hp:1610, ad:1288, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 81 (t:1630, hp:1630, ad:1304, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 82 (t:1650, hp:1650, ad:1320, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 83 (t:1670, hp:1670, ad:1336, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 84 (t:1690, hp:1690, ad:1352, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 85 (t:1710, hp:1710, ad:1368, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 86 (t:1730, hp:1730, ad:1384, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 87 (t:1750, hp:1750, ad:1400, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 88 (t:1770, hp:1770, ad:1416, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc Sd 89 (t:1790, hp:1790, ad:1432, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 90 (t:1810, hp:1810, ad:1448, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 91 (t:1830, hp:1830, ad:1464, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 92 (t:1850, hp:1850, ad:1480, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 93 (t:1870, hp:1870, ad:1496, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 94 (t:1890, hp:1890, ad:1512, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 95 (t:1910, hp:1910, ad:1528, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 96 (t:1930, hp:1930, ad:1544, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 97 (t:1950, hp:1950, ad:1560, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc S. 98 (t:1970, hp:1970, ad:1576, st:0)
+Massif: (skipped 1 snapshot)
Massif: alloc Sd 99 (t:1990, hp:1990, ad:1592, st:0)
Massif: Culling...
Massif: 0 (t-span = 40) S. 1 (t:20, hp:20, ad:16, st:0)
|
|
From: <sv...@va...> - 2007-09-26 23:28:14
|
Author: njn
Date: 2007-09-27 00:28:15 +0100 (Thu, 27 Sep 2007)
New Revision: 6919
Log:
make -v more informative
Modified:
branches/MASSIF2/massif/ms_main.c
branches/MASSIF2/massif/tests/culling1.stderr.exp
branches/MASSIF2/massif/tests/culling2.stderr.exp
branches/MASSIF2/massif/tests/realloc.stderr.exp
Modified: branches/MASSIF2/massif/ms_main.c
===================================================================
--- branches/MASSIF2/massif/ms_main.c 2007-09-26 23:01:39 UTC (rev 6918)
+++ branches/MASSIF2/massif/ms_main.c 2007-09-26 23:28:15 UTC (rev 6919)
@@ -33,6 +33,7 @@
// Todo:
// - -v: give more detail on each snapshot -- sizes, etc
// - -v: print number of skipped snapshots after each one is taken
+// - make --time-unit=B include heap-admin bytes
// - Add ability to draw multiple graphs, eg. heap-only, stack-only, total.
// Give each graph a title.
// - do peak-taking.
@@ -845,8 +846,8 @@
struct {
Time time;
SizeT total_szB; // Size of all allocations at that snapshot time.
+ SizeT heap_szB;
SizeT heap_admin_szB;
- SizeT heap_szB;
SizeT stacks_szB;
XPt* alloc_xpt; // Heap XTree root, if a detailed snapshot,
} // otherwise NULL
@@ -925,9 +926,15 @@
static void VERB_snapshot(Char* prefix, Int i)
{
- Char* suffix = ( is_detailed_snapshot(&snapshots[i]) ? " (detailed)" : "");
- VERB("%s snapshot %3d (t = %lld %s)%s", prefix, i,
- snapshots[i].time, TimeUnit_to_string(clo_time_unit), suffix);
+ Char* suffix = ( is_detailed_snapshot(&snapshots[i]) ? "d" : ".");
+ VERB("%s S%s%3d "
+ "(t:%lld, hp:%ld, ad:%ld, st:%ld)",
+ prefix, suffix, i,
+ snapshots[i].time,
+ snapshots[i].heap_szB,
+ snapshots[i].heap_admin_szB,
+ snapshots[i].stacks_szB
+ );
}
// Weed out half the snapshots; we choose those that represent the smallest
@@ -994,7 +1001,7 @@
min_snapshot = & snapshots[ min_j ];
if (VG_(clo_verbosity) > 1) {
Char buf[64];
- VG_(snprintf)(buf, 64, " cull %3d (t-span = %lld)", i, min_timespan);
+ VG_(snprintf)(buf, 64, " %3d (t-span = %lld)", i, min_timespan);
VERB_snapshot(buf, min_j);
}
delete_snapshot(min_snapshot);
@@ -1060,11 +1067,11 @@
// so when the time-unit is 'ms' we always have a big gap between the
// first two snapshots. But at least users won't have to wonder why
// the first snapshot isn't at t=0.
- static Bool is_first_snapshot = True;
+ static Bool is_first_get_time = True;
static Time start_time_ms;
- if (is_first_snapshot) {
+ if (is_first_get_time) {
start_time_ms = VG_(read_millisecond_timer)();
- is_first_snapshot = False;
+ is_first_get_time = False;
return 0;
} else {
return VG_(read_millisecond_timer)() - start_time_ms;
Modified: branches/MASSIF2/massif/tests/culling1.stderr.exp
===================================================================
--- branches/MASSIF2/massif/tests/culling1.stderr.exp 2007-09-26 23:01:39 UTC (rev 6918)
+++ branches/MASSIF2/massif/tests/culling1.stderr.exp 2007-09-26 23:28:15 UTC (rev 6919)
@@ -5,361 +5,361 @@
Massif: 4: __builtin_new
Massif: 5: __builtin_vec_new
Massif: 6: malloc
-Massif: startup snapshot 0 (t = 0 B)
-Massif: alloc snapshot 1 (t = 10 B)
-Massif: alloc snapshot 2 (t = 20 B)
-Massif: alloc snapshot 3 (t = 30 B)
-Massif: alloc snapshot 4 (t = 40 B)
-Massif: alloc snapshot 5 (t = 50 B)
-Massif: alloc snapshot 6 (t = 60 B)
-Massif: alloc snapshot 7 (t = 70 B)
-Massif: alloc snapshot 8 (t = 80 B)
-Massif: alloc snapshot 9 (t = 90 B) (detailed)
-Massif: alloc snapshot 10 (t = 100 B)
-Massif: alloc snapshot 11 (t = 110 B)
-Massif: alloc snapshot 12 (t = 120 B)
-Massif: alloc snapshot 13 (t = 130 B)
-Massif: alloc snapshot 14 (t = 140 B)
-Massif: alloc snapshot 15 (t = 150 B)
-Massif: alloc snapshot 16 (t = 160 B)
-Massif: alloc snapshot 17 (t = 170 B)
-Massif: alloc snapshot 18 (t = 180 B)
-Massif: alloc snapshot 19 (t = 190 B) (detailed)
-Massif: alloc snapshot 20 (t = 200 B)
-Massif: alloc snapshot 21 (t = 210 B)
-Massif: alloc snapshot 22 (t = 220 B)
-Massif: alloc snapshot 23 (t = 230 B)
-Massif: alloc snapshot 24 (t = 240 B)
-Massif: alloc snapshot 25 (t = 250 B)
-Massif: alloc snapshot 26 (t = 260 B)
-Massif: alloc snapshot 27 (t = 270 B)
-Massif: alloc snapshot 28 (t = 280 B)
-Massif: alloc snapshot 29 (t = 290 B) (detailed)
-Massif: alloc snapshot 30 (t = 300 B)
-Massif: alloc snapshot 31 (t = 310 B)
-Massif: alloc snapshot 32 (t = 320 B)
-Massif: alloc snapshot 33 (t = 330 B)
-Massif: alloc snapshot 34 (t = 340 B)
-Massif: alloc snapshot 35 (t = 350 B)
-Massif: alloc snapshot 36 (t = 360 B)
-Massif: alloc snapshot 37 (t = 370 B)
-Massif: alloc snapshot 38 (t = 380 B)
-Massif: alloc snapshot 39 (t = 390 B) (detailed)
-Massif: alloc snapshot 40 (t = 400 B)
-Massif: alloc snapshot 41 (t = 410 B)
-Massif: alloc snapshot 42 (t = 420 B)
-Massif: alloc snapshot 43 (t = 430 B)
-Massif: alloc snapshot 44 (t = 440 B)
-Massif: alloc snapshot 45 (t = 450 B)
-Massif: alloc snapshot 46 (t = 460 B)
-Massif: alloc snapshot 47 (t = 470 B)
-Massif: alloc snapshot 48 (t = 480 B)
-Massif: alloc snapshot 49 (t = 490 B) (detailed)
-Massif: alloc snapshot 50 (t = 500 B)
-Massif: alloc snapshot 51 (t = 510 B)
-Massif: alloc snapshot 52 (t = 520 B)
-Massif: alloc snapshot 53 (t = 530 B)
-Massif: alloc snapshot 54 (t = 540 B)
-Massif: alloc snapshot 55 (t = 550 B)
-Massif: alloc snapshot 56 (t = 560 B)
-Massif: alloc snapshot 57 (t = 570 B)
-Massif: alloc snapshot 58 (t = 580 B)
-Massif: alloc snapshot 59 (t = 590 B) (detailed)
-Massif: alloc snapshot 60 (t = 600 B)
-Massif: alloc snapshot 61 (t = 610 B)
-Massif: alloc snapshot 62 (t = 620 B)
-Massif: alloc snapshot 63 (t = 630 B)
-Massif: alloc snapshot 64 (t = 640 B)
-Massif: alloc snapshot 65 (t = 650 B)
-Massif: alloc snapshot 66 (t = 660 B)
-Massif: alloc snapshot 67 (t = 670 B)
-Massif: alloc snapshot 68 (t = 680 B)
-Massif: alloc snapshot 69 (t = 690 B) (detailed)
-Massif: alloc snapshot 70 (t = 700 B)
-Massif: alloc snapshot 71 (t = 710 B)
-Massif: alloc snapshot 72 (t = 720 B)
-Massif: alloc snapshot 73 (t = 730 B)
-Massif: alloc snapshot 74 (t = 740 B)
-Massif: alloc snapshot 75 (t = 750 B)
-Massif: alloc snapshot 76 (t = 760 B)
-Massif: alloc snapshot 77 (t = 770 B)
-Massif: alloc snapshot 78 (t = 780 B)
-Massif: alloc snapshot 79 (t = 790 B) (detailed)
-Massif: alloc snapshot 80 (t = 800 B)
-Massif: alloc snapshot 81 (t = 810 B)
-Massif: alloc snapshot 82 (t = 820 B)
-Massif: alloc snapshot 83 (t = 830 B)
-Massif: alloc snapshot 84 (t = 840 B)
-Massif: alloc snapshot 85 (t = 850 B)
-Massif: alloc snapshot 86 (t = 860 B)
-Massif: alloc snapshot 87 (t = 870 B)
-Massif: alloc snapshot 88 (t = 880 B)
-Massif: alloc snapshot 89 (t = 890 B) (detailed)
-Massif: alloc snapshot 90 (t = 900 B)
-Massif: alloc snapshot 91 (t = 910 B)
-Massif: alloc snapshot 92 (t = 920 B)
-Massif: alloc snapshot 93 (t = 930 B)
-Massif: alloc snapshot 94 (t = 940 B)
-Massif: alloc snapshot 95 (t = 950 B)
-Massif: alloc snapshot 96 (t = 960 B)
-Massif: alloc snapshot 97 (t = 970 B)
-Massif: alloc snapshot 98 (t = 980 B)
-Massif: alloc snapshot 99 (t = 990 B) (detailed)
+Massif: startup S. 0 (t:0, hp:0, ad:0, st:0)
+Massif: alloc S. 1 (t:10, hp:10, ad:8, st:0)
+Massif: alloc S. 2 (t:20, hp:20, ad:16, st:0)
+Massif: alloc S. 3 (t:30, hp:30, ad:24, st:0)
+Massif: alloc S. 4 (t:40, hp:40, ad:32, st:0)
+Massif: alloc S. 5 (t:50, hp:50, ad:40, st:0)
+Massif: alloc S. 6 (t:60, hp:60, ad:48, st:0)
+Massif: alloc S. 7 (t:70, hp:70, ad:56, st:0)
+Massif: alloc S. 8 (t:80, hp:80, ad:64, st:0)
+Massif: alloc Sd 9 (t:90, hp:90, ad:72, st:0)
+Massif: alloc S. 10 (t:100, hp:100, ad:80, st:0)
+Massif: alloc S. 11 (t:110, hp:110, ad:88, st:0)
+Massif: alloc S. 12 (t:120, hp:120, ad:96, st:0)
+Massif: alloc S. 13 (t:130, hp:130, ad:104, st:0)
+Massif: alloc S. 14 (t:140, hp:140, ad:112, st:0)
+Massif: alloc S. 15 (t:150, hp:150, ad:120, st:0)
+Massif: alloc S. 16 (t:160, hp:160, ad:128, st:0)
+Massif: alloc S. 17 (t:170, hp:170, ad:136, st:0)
+Massif: alloc S. 18 (t:180, hp:180, ad:144, st:0)
+Massif: alloc Sd 19 (t:190, hp:190, ad:152, st:0)
+Massif: alloc S. 20 (t:200, hp:200, ad:160, st:0)
+Massif: alloc S. 21 (t:210, hp:210, ad:168, st:0)
+Massif: alloc S. 22 (t:220, hp:220, ad:176, st:0)
+Massif: alloc S. 23 (t:230, hp:230, ad:184, st:0)
+Massif: alloc S. 24 (t:240, hp:240, ad:192, st:0)
+Massif: alloc S. 25 (t:250, hp:250, ad:200, st:0)
+Massif: alloc S. 26 (t:260, hp:260, ad:208, st:0)
+Massif: alloc S. 27 (t:270, hp:270, ad:216, st:0)
+Massif: alloc S. 28 (t:280, hp:280, ad:224, st:0)
+Massif: alloc Sd 29 (t:290, hp:290, ad:232, st:0)
+Massif: alloc S. 30 (t:300, hp:300, ad:240, st:0)
+Massif: alloc S. 31 (t:310, hp:310, ad:248, st:0)
+Massif: alloc S. 32 (t:320, hp:320, ad:256, st:0)
+Massif: alloc S. 33 (t:330, hp:330, ad:264, st:0)
+Massif: alloc S. 34 (t:340, hp:340, ad:272, st:0)
+Massif: alloc S. 35 (t:350, hp:350, ad:280, st:0)
+Massif: alloc S. 36 (t:360, hp:360, ad:288, st:0)
+Massif: alloc S. 37 (t:370, hp:370, ad:296, st:0)
+Massif: alloc S. 38 (t:380, hp:380, ad:304, st:0)
+Massif: alloc Sd 39 (t:390, hp:390, ad:312, st:0)
+Massif: alloc S. 40 (t:400, hp:400, ad:320, st:0)
+Massif: alloc S. 41 (t:410, hp:410, ad:328, st:0)
+Massif: alloc S. 42 (t:420, hp:420, ad:336, st:0)
+Massif: alloc S. 43 (t:430, hp:430, ad:344, st:0)
+Massif: alloc S. 44 (t:440, hp:440, ad:352, st:0)
+Massif: alloc S. 45 (t:450, hp:450, ad:360, st:0)
+Massif: alloc S. 46 (t:460, hp:460, ad:368, st:0)
+Massif: alloc S. 47 (t:470, hp:470, ad:376, st:0)
+Massif: alloc S. 48 (t:480, hp:480, ad:384, st:0)
+Massif: alloc Sd 49 (t:490, hp:490, ad:392, st:0)
+Massif: alloc S. 50 (t:500, hp:500, ad:400, st:0)
+Massif: alloc S. 51 (t:510, hp:510, ad:408, st:0)
+Massif: alloc S. 52 (t:520, hp:520, ad:416, st:0)
+Massif: alloc S. 53 (t:530, hp:530, ad:424, st:0)
+Massif: alloc S. 54 (t:540, hp:540, ad:432, st:0)
+Massif: alloc S. 55 (t:550, hp:550, ad:440, st:0)
+Massif: alloc S. 56 (t:560, hp:560, ad:448, st:0)
+Massif: alloc S. 57 (t:570, hp:570, ad:456, st:0)
+Massif: alloc S. 58 (t:580, hp:580, ad:464, st:0)
+Massif: alloc Sd 59 (t:590, hp:590, ad:472, st:0)
+Massif: alloc S. 60 (t:600, hp:600, ad:480, st:0)
+Massif: alloc S. 61 (t:610, hp:610, ad:488, st:0)
+Massif: alloc S. 62 (t:620, hp:620, ad:496, st:0)
+Massif: alloc S. 63 (t:630, hp:630, ad:504, st:0)
+Massif: alloc S. 64 (t:640, hp:640, ad:512, st:0)
+Massif: alloc S. 65 (t:650, hp:650, ad:520, st:0)
+Massif: alloc S. 66 (t:660, hp:660, ad:528, st:0)
+Massif: alloc S. 67 (t:670, hp:670, ad:536, st:0)
+Massif: alloc S. 68 (t:680, hp:680, ad:544, st:0)
+Massif: alloc Sd 69 (t:690, hp:690, ad:552, st:0)
+Massif: alloc S. 70 (t:700, hp:700, ad:560, st:0)
+Massif: alloc S. 71 (t:710, hp:710, ad:568, st:0)
+Massif: alloc S. 72 (t:720, hp:720, ad:576, st:0)
+Massif: alloc S. 73 (t:730, hp:730, ad:584, st:0)
+Massif: alloc S. 74 (t:740, hp:740, ad:592, st:0)
+Massif: alloc S. 75 (t:750, hp:750, ad:600, st:0)
+Massif: alloc S. 76 (t:760, hp:760, ad:608, st:0)
+Massif: alloc S. 77 (t:770, hp:770, ad:616, st:0)
+Massif: alloc S. 78 (t:780, hp:780, ad:624, st:0)
+Massif: alloc Sd 79 (t:790, hp:790, ad:632, st:0)
+Massif: alloc S. 80 (t:800, hp:800, ad:640, st:0)
+Massif: alloc S. 81 (t:810, hp:810, ad:648, st:0)
+Massif: alloc S. 82 (t:820, hp:820, ad:656, st:0)
+Massif: alloc S. 83 (t:830, hp:830, ad:664, st:0)
+Massif: alloc S. 84 (t:840, hp:840, ad:672, st:0)
+Massif: alloc S. 85 (t:850, hp:850, ad:680, st:0)
+Massif: alloc S. 86 (t:860, hp:860, ad:688, st:0)
+Massif: alloc S. 87 (t:870, hp:870, ad:696, st:0)
+Massif: alloc S. 88 (t:880, hp:880, ad:704, st:0)
+Massif: alloc Sd 89 (t:890, hp:890, ad:712, st:0)
+Massif: alloc S. 90 (t:900, hp:900, ad:720, st:0)
+Massif: alloc S. 91 (t:910, hp:910, ad:728, st:0)
+Massif: alloc S. 92 (t:920, hp:920, ad:736, st:0)
+Massif: alloc S. 93 (t:930, hp:930, ad:744, st:0)
+Massif: alloc S. 94 (t:940, hp:940, ad:752, st:0)
+Massif: alloc S. 95 (t:950, hp:950, ad:760, st:0)
+Massif: alloc S. 96 (t:960, hp:960, ad:768, st:0)
+Massif: alloc S. 97 (t:970, hp:970, ad:776, st:0)
+Massif: alloc S. 98 (t:980, hp:980, ad:784, st:0)
+Massif: alloc Sd 99 (t:990, hp:990, ad:792, st:0)
Massif: Culling...
-Massif: cull 0 (t-span = 20) snapshot 1 (t = 10 B)
-Massif: cull 1 (t-span = 20) snapshot 3 (t = 30 B)
-Massif: cull 2 (t-span = 20) snapshot 5 (t = 50 B)
-Massif: cull 3 (t-span = 20) snapshot 7 (t = 70 B)
-Massif: cull 4 (t-span = 20) snapshot 9 (t = 90 B) (detailed)
-Massif: cull 5 (t-span = 20) snapshot 11 (t = 110 B)
-Massif: cull 6 (t-span = 20) snapshot 13 (t = 130 B)
-Massif: cull 7 (t-span = 20) snapshot 15 (t = 150 B)
-Massif: cull 8 (t-span = 20) snapshot 17 (t = 170 B)
-Massif: cull 9 (t-span = 20) snapshot 19 (t = 190 B) (detailed)
-Massif: cull 10 (t-span = 20) snapshot 21 (t = 210 B)
-Massif: cull 11 (t-span = 20) snapshot 23 (t = 230 B)
-Massif: cull 12 (t-span = 20) snapshot 25 (t = 250 B)
-Massif: cull 13 (t-span = 20) snapshot 27 (t = 270 B)
-Massif: cull 14 (t-span = 20) snapshot 29 (t = 290 B) (detailed)
-Massif: cull 15 (t-span = 20) snapshot 31 (t = 310 B)
-Massif: cull 16 (t-span = 20) snapshot 33 (t = 330 B)
-Massif: cull 17 (t-span = 20) snapshot 35 (t = 350 B)
-Massif: cull 18 (t-span = 20) snapshot 37 (t = 370 B)
-Massif: cull 19 (t-span = 20) snapshot 39 (t = 390 B) (detailed)
-Massif: cull 20 (t-span = 20) snapshot 41 (t = 410 B)
-Massif: cull 21 (t-span = 20) snapshot 43 (t = 430 B)
-Massif: cull 22 (t-span = 20) snapshot 45 (t = 450 B)
-Massif: cull 23 (t-span = 20) snapshot 47 (t = 470 B)
-Massif: cull 24 (t-span = 20) snapshot 49 (t = 490 B) (detailed)
-Massif: cull 25 (t-span = 20) snapshot 51 (t = 510 B)
-Massif: cull 26 (t-span = 20) snapshot 53 (t = 530 B)
-Massif: cull 27 (t-span = 20) snapshot 55 (t = 550 B)
-Massif: cull 28 (t-span = 20) snapshot 57 (t = 570 B)
-Massif: cull 29 (t-span = 20) snapshot 59 (t = 590 B) (detailed)
-Massif: cull 30 (t-span = 20) snapshot 61 (t = 610 B)
-Massif: cull 31 (t-span = 20) snapshot 63 (t = 630 B)
-Massif: cull 32 (t-span = 20) snapshot 65 (t = 650 B)
-Massif: cull 33 (t-span = 20) snapshot 67 (t = 670 B)
-Massif: cull 34 (t-span = 20) snapshot 69 (t = 690 B) (detailed)
-Massif: cull 35 (t-span = 20) snapshot 71 (t = 710 B)
-Massif: cull 36 (t-span = 20) snapshot 73 (t = 730 B)
-Massif: cull 37 (t-span = 20) snapshot 75 (t = 750 B)
-Massif: cull 38 (t-span = 20) snapshot 77 (t = 770 B)
-Massif: cull 39 (t-span = 20) snapshot 79 (t = 790 B) (detailed)
-Massif: cull 40 (t-span = 20) snapshot 81 (t = 810 B)
-Massif: cull 41 (t-span = 20) snapshot 83 (t = 830 B)
-Massif: cull 42 (t-span = 20) snapshot 85 (t = 850 B)
-Massif: cull 43 (t-span = 20) snapshot 87 (t = 870 B)
-Massif: cull 44 (t-span = 20) snapshot 89 (t = 890 B) (detailed)
-Massif: cull 45 (t-span = 20) snapshot 91 (t = 910 B)
-Massif: cull 46 (t-span = 20) snapshot 93 (t = 930 B)
-Massif: cull 47 (t-span = 20) snapshot 95 (t = 950 B)
-Massif: cull 48 (t-span = 20) snapshot 97 (t = 970 B)
-Massif: cull 49 (t-span = 30) snapshot 98 (t = 980 B)
+Massif: 0 (t-span = 20) S. 1 (t:10, hp:10, ad:8, st:0)
+Massif: 1 (t-span = 20) S. 3 (t:30, hp:30, ad:24, st:0)
+Massif: 2 (t-span = 20) S. 5 (t:50, hp:50, ad:40, st:0)
+Massif: 3 (t-span = 20) S. 7 (t:70, hp:70, ad:56, st:0)
+Massif: 4 (t-span = 20) Sd 9 (t:90, hp:90, ad:72, st:0)
+Massif: 5 (t-span = 20) S. 11 (t:110, hp:110, ad:88, st:0)
+Massif: 6 (t-span = 20) S. 13 (t:130, hp:130, ad:104, st:0)
+Massif: 7 (t-span = 20) S. 15 (t:150, hp:150, ad:120, st:0)
+Massif: 8 (t-span = 20) S. 17 (t:170, hp:170, ad:136, st:0)
+Massif: 9 (t-span = 20) Sd 19 (t:190, hp:190, ad:152, st:0)
+Massif: 10 (t-span = 20) S. 21 (t:210, hp:210, ad:168, st:0)
+Massif: 11 (t-span = 20) S. 23 (t:230, hp:230, ad:184, st:0)
+Massif: 12 (t-span = 20) S. 25 (t:250, hp:250, ad:200, st:0)
+Massif: 13 (t-span = 20) S. 27 (t:270, hp:270, ad:216, st:0)
+Massif: 14 (t-span = 20) Sd 29 (t:290, hp:290, ad:232, st:0)
+Massif: 15 (t-span = 20) S. 31 (t:310, hp:310, ad:248, st:0)
+Massif: 16 (t-span = 20) S. 33 (t:330, hp:330, ad:264, st:0)
+Massif: 17 (t-span = 20) S. 35 (t:350, hp:350, ad:280, st:0)
+Massif: 18 (t-span = 20) S. 37 (t:370, hp:370, ad:296, st:0)
+Massif: 19 (t-span = 20) Sd 39 (t:390, hp:390, ad:312, st:0)
+Massif: 20 (t-span = 20) S. 41 (t:410, hp:410, ad:328, st:0)
+Massif: 21 (t-span = 20) S. 43 (t:430, hp:430, ad:344, st:0)
+Massif: 22 (t-span = 20) S. 45 (t:450, hp:450, ad:360, st:0)
+Massif: 23 (t-span = 20) S. 47 (t:470, hp:470, ad:376, st:0)
+Massif: 24 (t-span = 20) Sd 49 (t:490, hp:490, ad:392, st:0)
+Massif: 25 (t-span = 20) S. 51 (t:510, hp:510, ad:408, st:0)
+Massif: 26 (t-span = 20) S. 53 (t:530, hp:530, ad:424, st:0)
+Massif: 27 (t-span = 20) S. 55 (t:550, hp:550, ad:440, st:0)
+Massif: 28 (t-span = 20) S. 57 (t:570, hp:570, ad:456, st:0)
+Massif: 29 (t-span = 20) Sd 59 (t:590, hp:590, ad:472, st:0)
+Massif: 30 (t-span = 20) S. 61 (t:610, hp:610, ad:488, st:0)
+Massif: 31 (t-span = 20) S. 63 (t:630, hp:630, ad:504, st:0)
+Massif: 32 (t-span = 20) S. 65 (t:650, hp:650, ad:520, st:0)
+Massif: 33 (t-span = 20) S. 67 (t:670, hp:670, ad:536, st:0)
+Massif: 34 (t-span = 20) Sd 69 (t:690, hp:690, ad:552, st:0)
+Massif: 35 (t-span = 20) S. 71 (t:710, hp:710, ad:568, st:0)
+Massif: 36 (t-span = 20) S. 73 (t:730, hp:730, ad:584, st:0)
+Massif: 37 (t-span = 20) S. 75 (t:750, hp:750, ad:600, st:0)
+Massif: 38 (t-span = 20) S. 77 (t:770, hp:770, ad:616, st:0)
+Massif: 39 (t-span = 20) Sd 79 (t:790, hp:790, ad:632, st:0)
+Massif: 40 (t-span = 20) S. 81 (t:810, hp:810, ad:648, st:0)
+Massif: 41 (t-span = 20) S. 83 (t:830, hp:830, ad:664, st:0)
+Massif: 42 (t-span = 20) S. 85 (t:850, hp:850, ad:680, st:0)
+Massif: 43 (t-span = 20) S. 87 (t:870, hp:870, ad:696, st:0)
+Massif: 44 (t-span = 20) Sd 89 (t:890, hp:890, ad:712, st:0)
+Massif: 45 (t-span = 20) S. 91 (t:910, hp:910, ad:728, st:0)
+Massif: 46 (t-span = 20) S. 93 (t:930, hp:930, ad:744, st:0)
+Massif: 47 (t-span = 20) S. 95 (t:950, hp:950, ad:760, st:0)
+Massif: 48 (t-span = 20) S. 97 (t:970, hp:970, ad:776, st:0)
+Massif: 49 (t-span = 30) S. 98 (t:980, hp:980, ad:784, st:0)
Massif: Finished culling ( 50 of 100 deleted)
-Massif: post-cull snapshot 0 (t = 0 B)
-Massif: post-cull snapshot 1 (t = 20 B)
-Massif: post-cull snapshot 2 (t = 40 B)
-Massif: post-cull snapshot 3 (t = 60 B)
-Massif: post-cull snapshot 4 (t = 80 B)
-Massif: post-cull snapshot 5 (t = 100 B)
-Massif: post-cull snapshot 6 (t = 120 B)
-Massif: post-cull snapshot 7 (t = 140 B)
-Massif: post-cull snapshot 8 (t = 160 B)
-Massif: post-cull snapshot 9 (t = 180 B)
-Massif: post-cull snapshot 10 (t = 200 B)
-Massif: post-cull snapshot 11 (t = 220 B)
-Massif: post-cull snapshot 12 (t = 240 B)
-Massif: post-cull snapshot 13 (t = 260 B)
-Massif: post-cull snapshot 14 (t = 280 B)
-Massif: post-cull snapshot 15 (t = 300 B)
-Massif: post-cull snapshot 16 (t = 320 B)
-Massif: post-cull snapshot 17 (t = 340 B)
-Massif: post-cull snapshot 18 (t = 360 B)
-Massif: post-cull snapshot 19 (t = 380 B)
-Massif: post-cull snapshot 20 (t = 400 B)
-Massif: post-cull snapshot 21 (t = 420 B)
-Massif: post-cull snapshot 22 (t = 440 B)
-Massif: post-cull snapshot 23 (t = 460 B)
-Massif: post-cull snapshot 24 (t = 480 B)
-Massif: post-cull snapshot 25 (t = 500 B)
-Massif: post-cull snapshot 26 (t = 520 B)
-Massif: post-cull snapshot 27 (t = 540 B)
-Massif: post-cull snapshot 28 (t = 560 B)
-Massif: post-cull snapshot 29 (t = 580 B)
-Massif: post-cull snapshot 30 (t = 600 B)
-Massif: post-cull snapshot 31 (t = 620 B)
-Massif: post-cull snapshot 32 (t = 640 B)
-Massif: post-cull snapshot 33 (t = 660 B)
-Massif: post-cull snapshot 34 (t = 680 B)
-Massif: post-cull snapshot 35 (t = 700 B)
-Massif: post-cull snapshot 36 (t = 720 B)
-Massif: post-cull snapshot 37 (t = 740 B)
-Massif: post-cull snapshot 38 (t = 760 B)
-Massif: post-cull snapshot 39 (t = 780 B)
-Massif: post-cull snapshot 40 (t = 800 B)
-Massif: post-cull snapshot 41 (t = 820 B)
-Massif: post-cull snapshot 42 (t = 840 B)
-Massif: post-cull snapshot 43 (t = 860 B)
-Massif: post-cull snapshot 44 (t = 880 B)
-Massif: post-cull snapshot 45 (t = 900 B)
-Massif: post-cull snapshot 46 (t = 920 B)
-Massif: post-cull snapshot 47 (t = 940 B)
-Massif: post-cull snapshot 48 (t = 960 B)
-Massif: post-cull snapshot 49 (t = 990 B) (detailed)
+Massif: post-cull S. 0 (t:0, hp:0, ad:0, st:0)
+Massif: post-cull S. 1 (t:20, hp:20, ad:16, st:0)
+Massif: post-cull S. 2 (t:40, hp:40, ad:32, st:0)
+Massif: post-cull S. 3 (t:60, hp:60, ad:48, st:0)
+Massif: post-cull S. 4 (t:80, hp:80, ad:64, st:0)
+Massif: post-cull S. 5 (t:100, hp:100, ad:80, st:0)
+Massif: post-cull S. 6 (t:120, hp:120, ad:96, st:0)
+Massif: post-cull S. 7 (t:140, hp:140, ad:112, st:0)
+Massif: post-cull S. 8 (t:160, hp:160, ad:128, st:0)
+Massif: post-cull S. 9 (t:180, hp:180, ad:144, st:0)
+Massif: post-cull S. 10 (t:200, hp:200, ad:160, st:0)
+Massif: post-cull S. 11 (t:220, hp:220, ad:176, st:0)
+Massif: post-cull S. 12 (t:240, hp:240, ad:192, st:0)
+Massif: post-cull S. 13 (t:260, hp:260, ad:208, st:0)
+Massif: post-cull S. 14 (t:280, hp:280, ad:224, st:0)
+Massif: post-cull S. 15 (t:300, hp:300, ad:240, st:0)
+Massif: post-cull S. 16 (t:320, hp:320, ad:256, st:0)
+Massif: post-cull S. 17 (t:340, hp:340, ad:272, st:0)
+Massif: post-cull S. 18 (t:360, hp:360, ad:288, st:0)
+Massif: post-cull S. 19 (t:380, hp:380, ad:304, st:0)
+Massif: post-cull S. 20 (t:400, hp:400, ad:320, st:0)
+Massif: post-cull S. 21 (t:420, hp:420, ad:336, st:0)
+Massif: post-cull S. 22 (t:440, hp:440, ad:352, st:0)
+Massif: post-cull S. 23 (t:460, hp:460, ad:368, st:0)
+Massif: post-cull S. 24 (t:480, hp:480, ad:384, st:0)
+Massif: post-cull S. 25 (t:500, hp:500, ad:400, st:0)
+Massif: post-cull S. 26 (t:520, hp:520, ad:416, st:0)
+Massif: post-cull S. 27 (t:540, hp:540, ad:432, st:0)
+Massif: post-cull S. 28 (t:560, hp:560, ad:448, st:0)
+Massif: post-cull S. 29 (t:580, hp:580, ad:464, st:0)
+Massif: post-cull S. 30 (t:600, hp:600, ad:480, st:0)
+Massif: post-cull S. 31 (t:620, hp:620, ad:496, st:0)
+Massif: post-cull S. 32 (t:640, hp:640, ad:512, st:0)
+Massif: post-cull S. 33 (t:660, hp:660, ad:528, st:0)
+Massif: post-cull S. 34 (t:680, hp:680, ad:544, st:0)
+Massif: post-cull S. 35 (t:700, hp:700, ad:560, st:0)
+Massif: post-cull S. 36 (t:720, hp:720, ad:576, st:0)
+Massif: post-cull S. 37 (t:740, hp:740, ad:592, st:0)
+Massif: post-cull S. 38 (t:760, hp:760, ad:608, st:0)
+Massif: post-cull S. 39 (t:780, hp:780, ad:624, st:0)
+Massif: post-cull S. 40 (t:800, hp:800, ad:640, st:0)
+Massif: post-cull S. 41 (t:820, hp:820, ad:656, st:0)
+Massif: post-cull S. 42 (t:840, hp:840, ad:672, st:0)
+Massif: post-cull S. 43 (t:860, hp:860, ad:688, st:0)
+Massif: post-cull S. 44 (t:880, hp:880, ad:704, st:0)
+Massif: post-cull S. 45 (t:900, hp:900, ad:720, st:0)
+Massif: post-cull S. 46 (t:920, hp:920, ad:736, st:0)
+Massif: post-cull S. 47 (t:940, hp:940, ad:752, st:0)
+Massif: post-cull S. 48 (t:960, hp:960, ad:768, st:0)
+Massif: post-cull Sd 49 (t:990, hp:990, ad:792, st:0)
Massif: New time interval = 20 (between snapshots 0 and 1)
-Massif: alloc snapshot 50 (t = 1010 B)
-Massif: alloc snapshot 51 (t = 1030 B)
-Massif: alloc snapshot 52 (t = 1050 B)
-Massif: alloc snapshot 53 (t = 1070 B)
-Massif: alloc snapshot 54 (t = 1090 B)
-Massif: alloc snapshot 55 (t = 1110 B)
-Massif: alloc snapshot 56 (t = 1130 B)
-Massif: alloc snapshot 57 (t = 1150 B)
-Massif: alloc snapshot 58 (t = 1170 B)
-Massif: alloc snapshot 59 (t = 1190 B) (detailed)
-Massif: alloc snapshot 60 (t = 1210 B)
-Massif: alloc snapshot 61 (t = 1230 B)
-Massif: alloc snapshot 62 (t = 1250 B)
-Massif: alloc snapshot 63 (t = 1270 B)
-Massif: alloc snapshot 64 (t = 1290 B)
-Massif: alloc snapshot 65 (t = 1310 B)
-Massif: alloc snapshot 66 (t = 1330 B)
-Massif: alloc snapshot 67 (t = 1350 B)
-Massif: alloc snapshot 68 (t = 1370 B)
-Massif: alloc snapshot 69 (t = 1390 B) (detailed)
-Massif: alloc snapshot 70 (t = 1410 B)
-Massif: alloc snapshot 71 (t = 1430 B)
-Massif: alloc snapshot 72 (t = 1450 B)
-Massif: alloc snapshot 73 (t = 1470 B)
-Massif: alloc snapshot 74 (t = 1490 B)
-Massif: alloc snapshot 75 (t = 1510 B)
-Massif: alloc snapshot 76 (t = 1530 B)
-Massif: alloc snapshot 77 (t = 1550 B)
-Massif: alloc snapshot 78 (t = 1570 B)
-Massif: alloc snapshot 79 (t = 1590 B) (detailed)
-Massif: alloc snapshot 80 (t = 1610 B)
-Massif: alloc snapshot 81 (t = 1630 B)
-Massif: alloc snapshot 82 (t = 1650 B)
-Massif: alloc snapshot 83 (t = 1670 B)
-Massif: alloc snapshot 84 (t = 1690 B)
-Massif: alloc snapshot 85 (t = 1710 B)
-Massif: alloc snapshot 86 (t = 1730 B)
-Massif: alloc snapshot 87 (t = 1750 B)
-Massif: alloc snapshot 88 (t = 1770 B)
-Massif: alloc snapshot 89 (t = 1790 B) (detailed)
-Massif: alloc snapshot 90 (t = 1810 B)
-Massif: alloc snapshot 91 (t = 1830 B)
-Massif: alloc snapshot 92 (t = 1850 B)
-Massif: alloc snapshot 93 (t = 1870 B)
-Massif: alloc snapshot 94 (t = 1890 B)
-Massif: alloc snapshot 95 (t = 1910 B)
-Massif: alloc snapshot 96 (t = 1930 B)
-Massif: alloc snapshot 97 (t = 1950 B)
-Massif: alloc snapshot 98 (t = 1970 B)
-Massif: alloc snapshot 99 (t = 1990 B) (detailed)
+Massif: alloc S. 50 (t:1010, hp:1010, ad:808, st:0)
+Massif: alloc S. 51 (t:1030, hp:1030, ad:824, st:0)
+Massif: alloc S. 52 (t:1050, hp:1050, ad:840, st:0)
+Massif: alloc S. 53 (t:1070, hp:1070, ad:856, st:0)
+Massif: alloc S. 54 (t:1090, hp:1090, ad:872, st:0)
+Massif: alloc S. 55 (t:1110, hp:1110, ad:888, st:0)
+Massif: alloc S. 56 (t:1130, hp:1130, ad:904, st:0)
+Massif: alloc S. 57 (t:1150, hp:1150, ad:920, st:0)
+Massif: alloc S. 58 (t:1170, hp:1170, ad:936, st:0)
+Massif: alloc Sd 59 (t:1190, hp:1190, ad:952, st:0)
+Massif: alloc S. 60 (t:1210, hp:1210, ad:968, st:0)
+Massif: alloc S. 61 (t:1230, hp:1230, ad:984, st:0)
+Massif: alloc S. 62 (t:1250, hp:1250, ad:1000, st:0)
+Massif: alloc S. 63 (t:1270, hp:1270, ad:1016, st:0)
+Massif: alloc S. 64 (t:1290, hp:1290, ad:1032, st:0)
+Massif: alloc S. 65 (t:1310, hp:1310, ad:1048, st:0)
+Massif: alloc S. 66 (t:1330, hp:1330, ad:1064, st:0)
+Massif: alloc S. 67 (t:1350, hp:1350, ad:1080, st:0)
+Massif: alloc S. 68 (t:1370, hp:1370, ad:1096, st:0)
+Massif: alloc Sd 69 (t:1390, hp:1390, ad:1112, st:0)
+Massif: alloc S. 70 (t:1410, hp:1410, ad:1128, st:0)
+Massif: alloc S. 71 (t:1430, hp:1430, ad:1144, st:0)
+Massif: alloc S. 72 (t:1450, hp:1450, ad:1160, st:0)
+Massif: alloc S. 73 (t:1470, hp:1470, ad:1176, st:0)
+Massif: alloc S. 74 (t:1490, hp:1490, ad:1192, st:0)
+Massif: alloc S. 75 (t:1510, hp:1510, ad:1208, st:0)
+Massif: alloc S. 76 (t:1530, hp:1530, ad:1224, st:0)
+Massif: alloc S. 77 (t:1550, hp:1550, ad:1240, st:0)
+Massif: alloc S. 78 (t:1570, hp:1570, ad:1256, st:0)
+Massif: alloc Sd 79 (t:1590, hp:1590, ad:1272, st:0)
+Massif: alloc S. 80 (t:1610, hp:1610, ad:1288, st:0)
+Massif: alloc S. 81 (t:1630, hp:1630, ad:1304, st:0)
+Massif: alloc S. 82 (t:1650, hp:1650, ad:1320, st:0)
+Massif: alloc S. 83 (t:1670, hp:1670, ad:1336, st:0)
+Massif: alloc S. 84 (t:1690, hp:1690, ad:1352, st:0)
+Massif: alloc S. 85 (t:1710, hp:1710, ad:1368, st:0)
+Massif: alloc S. 86 (t:1730, hp:1730, ad:1384, st:0)
+Massif: alloc S. 87 (t:1750, hp:1750, ad:1400, st:0)
+Massif: alloc S. 88 (t:1770, hp:1770, ad:1416, st:0)
+Massif: alloc Sd 89 (t:1790, hp:1790, ad:1432, st:0)
+Massif: alloc S. 90 (t:1810, hp:1810, ad:1448, st:0)
+Massif: alloc S. 91 (t:1830, hp:1830, ad:1464, st:0)
+Massif: alloc S. 92 (t:1850, hp:1850, ad:1480, st:0)
+Massif: alloc S. 93 (t:1870, hp:1870, ad:1496, st:0)
+Massif: alloc S. 94 (t:1890, hp:1890, ad:1512, st:0)
+Massif: alloc S. 95 (t:1910, hp:1910, ad:1528, st:0)
+Massif: alloc S. 96 (t:1930, hp:1930, ad:1544, st:0)
+Massif: alloc S. 97 (t:1950, hp:1950, ad:1560, st:0)
+Massif: alloc S. 98 (t:1970, hp:1970, ad:1576, st:0)
+Massif: alloc Sd 99 (t:1990, hp:1990, ad:1592, st:0)
Massif: Culling...
-Massif: cull 0 (t-span = 40) snapshot 1 (t = 20 B)
-Massif: cull 1 (t-span = 40) snapshot 3 (t = 60 B)
-Massif: cull 2 (t-span = 40) snapshot 5 (t = 100 B)
-Massif: cull 3 (t-span = 40) snapshot 7 (t = 140 B)
-Massif: cull 4 (t-span = 40) snapshot 9 (t = 180 B)
-Massif: cull 5 (t-span = 40) snapshot 11 (t = 220 B)
-Massif: cull 6 (t-span = 40) snapshot 13 (t = 260 B)
-Massif: cull 7 (t-span = 40) snapshot 15 (t = 300 B)
-Massif: cull 8 (t-span = 40) snapshot 17 (t = 340 B)
-Massif: cull 9 (t-span = 40) snapshot 19 (t = 380 B)
-Massif: cull 10 (t-span = 40) snapshot 21 (t = 420 B)
-Massif: cull 11 (t-span = 40) snapshot 23 (t = 460 B)
-Massif: cull 12 (t-span = 40) snapshot 25 (t = 500 B)
-Massif: cull 13 (t-span = 40) snapshot 27 (t = 540 B)
-Massif: cull 14 (t-span = 40) snapshot 29 (t = 580 B)
-Massif: cull 15 (t-span = 40) snapshot 31 (t = 620 B)
-Massif: cull 16 (t-span = 40) snapshot 33 (t = 660 B)
-Massif: cull 17 (t-span = 40) snapshot 35 (t = 700 B)
-Massif: cull 18 (t-span = 40) snapshot 37 (t = 740 B)
-Massif: cull 19 (t-span = 40) snapshot 39 (t = 780 B)
-Massif: cull 20 (t-span = 40) snapshot 41 (t = 820 B)
-Massif: cull 21 (t-span = 40) snapshot 43 (t = 860 B)
-Massif: cull 22 (t-span = 40) snapshot 45 (t = 900 B)
-Massif: cull 23 (t-span = 40) snapshot 47 (t = 940 B)
-Massif: cull 24 (t-span = 40) snapshot 50 (t = 1010 B)
-Massif: cull 25 (t-span = 40) snapshot 52 (t = 1050 B)
-Massif: cull 26 (t-span = 40) snapshot 54 (t = 1090 B)
-Massif: cull 27 (t-span = 40) snapshot 56 (t = 1130 B)
-Massif: cull 28 (t-span = 40) snapshot 58 (t = 1170 B)
-Massif: cull 29 (t-span = 40) snapshot 60 (t = 1210 B)
-Massif: cull 30 (t-span = 40) snapshot 62 (t = 1250 B)
-Massif: cull 31 (t-span = 40) snapshot 64 (t = 1290 B)
-Massif: cull 32 (t-span = 40) snapshot 66 (t = 1330 B)
-Massif: cull 33 (t-span = 40) snapshot 68 (t = 1370 B)
-Massif: cull 34 (t-span = 40) snapshot 70 (t = 1410 B)
-Massif: cull 35 (t-span = 40) snapshot 72 (t = 1450 B)
-Massif: cull 36 (t-span = 40) snapshot 74 (t = 1490 B)
-Massif: cull 37 (t-span = 40) snapshot 76 (t = 1530 B)
-Massif: cull 38 (t-span = 40) snapshot 78 (t = 1570 B)
-Massif: cull 39 (t-span = 40) snapshot 80 (t = 1610 B)
-Massif: cull 40 (t-span = 40) snapshot 82 (t = 1650 B)
-Massif: cull 41 (t-span = 40) snapshot 84 (t = 1690 B)
-Massif: cull 42 (t-span = 40) snapshot 86 (t = 1730 B)
-Massif: cull 43 (t-span = 40) snapshot 88 (t = 1770 B)
-Massif: cull 44 (t-span = 40) snapshot 90 (t = 1810 B)
-Massif: cull 45 (t-span = 40) snapshot 92 (t = 1850 B)
-Massif: cull 46 (t-span = 40) snapshot 94 (t = 1890 B)
-Massif: cull 47 (t-span = 40) snapshot 96 (t = 1930 B)
-Massif: cull 48 (t-span = 40) snapshot 98 (t = 1970 B)
-Massif: cull 49 (t-span = 70) snapshot 48 (t = 960 B)
+Massif: 0 (t-span = 40) S. 1 (t:20, hp:20, ad:16, st:0)
+Massif: 1 (t-span = 40) S. 3 (t:60, hp:60, ad:48, st:0)
+Massif: 2 (t-span = 40) S. 5 (t:100, hp:100, ad:80, st:0)
+Massif: 3 (t-span = 40) S. 7 (t:140, hp:140, ad:112, st:0)
+Massif: 4 (t-span = 40) S. 9 (t:180, hp:180, ad:144, st:0)
+Massif: 5 (t-span = 40) S. 11 (t:220, hp:220, ad:176, st:0)
+Massif: 6 (t-span = 40) S. 13 (t:260, hp:260, ad:208, st:0)
+Massif: 7 (t-span = 40) S. 15 (t:300, hp:300, ad:240, st:0)
+Massif: 8 (t-span = 40) S. 17 (t:340, hp:340, ad:272, st:0)
+Massif: 9 (t-span = 40) S. 19 (t:380, hp:380, ad:304, st:0)
+Massif: 10 (t-span = 40) S. 21 (t:420, hp:420, ad:336, st:0)
+Massif: 11 (t-span = 40) S. 23 (t:460, hp:460, ad:368, st:0)
+Massif: 12 (t-span = 40) S. 25 (t:500, hp:500, ad:400, st:0)
+Massif: 13 (t-span = 40) S. 27 (t:540, hp:540, ad:432, st:0)
+Massif: 14 (t-span = 40) S. 29 (t:580, hp:580, ad:464, st:0)
+Massif: 15 (t-span = 40) S. 31 (t:620, hp:620, ad:496, st:0)
+Massif: 16 (t-span = 40) S. 33 (t:660, hp:660, ad:528, st:0)
+Massif: 17 (t-span = 40) S. 35 (t:700, hp:700, ad:560, st:0)
+Massif: 18 (t-span = 40) S. 37 (t:740, hp:740, ad:592, st:0)
+Massif: 19 (t-span = 40) S. 39 (t:780, hp:780, ad:624, st:0)
+Massif: 20 (t-span = 40) S. 41 (t:820, hp:820, ad:656, st:0)
+Massif: 21 (t-span = 40) S. 43 (t:860, hp:860, ad:688, st:0)
+Massif: 22 (t-span = 40) S. 45 (t:900, hp:900, ad:720, st:0)
+Massif: 23 (t-span = 40) S. 47 (t:940, hp:940, ad:752, st:0)
+Massif: 24 (t-span = 40) S. 50 (t:1010, hp:1010, ad:808, st:0)
+Massif: 25 (t-span = 40) S. 52 (t:1050, hp:1050, ad:840, st:0)
+Massif: 26 (t-span = 40) S. 54 (t:1090, hp:1090, ad:872, st:0)
+Massif: 27 (t-span = 40) S. 56 (t:1130, hp:1130, ad:904, st:0)
+Massif: 28 (t-span = 40) S. 58 (t:1170, hp:1170, ad:936, st:0)
+Massif: 29 (t-span = 40) S. 60 (t:1210, hp:1210, ad:968, st:0)
+Massif: 30 (t-span = 40) S. 62 (t:1250, hp:1250, ad:1000, st:0)
+Massif: 31 (t-span = 40) S. 64 (t:1290, hp:1290, ad:1032, st:0)
+Massif: 32 (t-span = 40) S. 66 (t:1330, hp:1330, ad:1064, st:0)
+Massif: 33 (t-span = 40) S. 68 (t:1370, hp:1370, ad:1096, st:0)
+Massif: 34 (t-span = 40) S. 70 (t:1410, hp:1410, ad:1128, st:0)
+Massif: 35 (t-span = 40) S. 72 (t:1450, hp:1450, ad:1160, st:0)
+Massif: 36 (t-span = 40) S. 74 (t:1490, hp:1490, ad:1192, st:0)
+Massif: 37 (t-span = 40) S. 76 (t:1530, hp:1530, ad:1224, st:0)
+Massif: 38 (t-span = 40) S. 78 (t:1570, hp:1570, ad:1256, st:0)
+Massif: 39 (t-span = 40) S. 80 (t:1610, hp:1610, ad:1288, st:0)
+Massif: 40 (t-span = 40) S. 82 (t:1650, hp:1650, ad:1320, st:0)
+Massif: 41 (t-span = 40) S. 84 (t:1690, hp:1690, ad:1352, st:0)
+Massif: 42 (t-span = 40) S. 86 (t:1730, hp:1730, ad:1384, st:0)
+Massif: 43 (t-span = 40) S. 88 (t:1770, hp:1770, ad:1416, st:0)
+Massif: 44 (t-span = 40) S. 90 (t:1810, hp:1810, ad:1448, st:0)
+Massif: 45 (t-span = 40) S. 92 (t:1850, hp:1850, ad:1480, st:0)
+Massif: 46 (t-span = 40) S. 94 (t:1890, hp:1890, ad:1512, st:0)
+Massif: 47 (t-span = 40) S. 96 (t:1930, hp:1930, ad:1544, st:0)
+Massif: 48 (t-span = 40) S. 98 (t:1970, hp:1970, ad:1576, st:0)
+Massif: 49 (t-span = 70) S. 48 (t:960, hp:960, ad:768, st:0)
Massif: Finished culling ( 50 of 100 deleted)
-Massif: post-cull snapshot 0 (t = 0 B)
-Massif: post-cull snapshot 1 (t = 40 B)
-Massif: post-cull snapshot 2 (t = 80 B)
-Massif: post-cull snapshot 3 (t = 120 B)
-Massif: post-cull snapshot 4 (t = 160 B)
-Massif: post-cull snapshot 5 (t = 200 B)
-Massif: post-cull snapshot 6 (t = 240 B)
-Massif: post-cull snapshot 7 (t = 280 B)
-Massif: post-cull snapshot 8 (t = 320 B)
-Massif: post-cull snapshot 9 (t = 360 B)
-Massif: post-cull snapshot 10 (t = 400 B)
-Massif: post-cull snapshot 11 (t = 440 B)
-Massif: post-cull snapshot 12 (t = 480 B)
-Massif: post-cull snapshot 13 (t = 520 B)
-Massif: post-cull snapshot 14 (t = 560 B)
-Massif: post-cull snapshot 15 (t = 600 B)
-Massif: post-cull snapshot 16 (t = 640 B)
-Massif: post-cull snapshot 17 (t = 680 B)
-Massif: post-cull snapshot 18 (t = 720 B)
-Massif: post-cull snapshot 19 (t = 760 B)
-Massif: post-cull snapshot 20 (t = 800 B)
-Massif: post-cull snapshot 21 (t = 840 B)
-Massif: post-cull snapshot 22 (t = 880 B)
-Massif: post-cull snapshot 23 (t = 920 B)
-Massif: post-cull snapshot 24 (t = 990 B) (detailed)
-Massif: post-cull snapshot 25 (t = 1030 B)
-Massif: post-cull snapshot 26 (t = 1070 B)
-Massif: post-cull snapshot 27 (t = 1110 B)
-Massif: post-cull snapshot 28 (t = 1150 B)
-Massif: post-cull snapshot 29 (t = 1190 B) (detailed)
-Massif: post-cull snapshot 30 (t = 1230 B)
-Massif: post-cull snapshot 31 (t = 1270 B)
-Massif: post-cull snapshot 32 (t = 1310 B)
-Massif: post-cull snapshot 33 (t = 1350 B)
-Massif: post-cull snapshot 34 (t = 1390 B) (detailed)
-Massif: post-cull snapshot 35 (t = 1430 B)
-Massif: post-cull snapshot 36 (t = 1470 B)
-Massif: post-cull snapshot 37 (t = 1510 B)
-Massif: post-cull snapshot 38 (t = 1550 B)
-Massif: post-cull snapshot 39 (t = 1590 B) (detailed)
-Massif: post-cull snapshot 40 (t = 1630 B)
-Massif: post-cull snapshot 41 (t = 1670 B)
-Massif: post-cull snapshot 42 (t = 1710 B)
-Massif: post-cull snapshot 43 (t = 1750 B)
-Massif: post-cull snapshot 44 (t = 1790 B) (detailed)
-Massif: post-cull snapshot 45 (t = 1830 B)
-Massif: post-cull snapshot 46 (t = 1870 B)
-Massif: post-cull snapshot 47 (t = 1910 B)
-Massif: post-cull snapshot 48 (t = 1950 B)
-Massif: post-cull snapshot 49 (t = 1990 B) (detailed)
+Massif: post-cull S. 0 (t:0, hp:0, ad:0, st:0)
+Massif: post-cull S. 1 (t:40, hp:40, ad:32, st:0)
+Massif: post-cull S. 2 (t:80, hp:80, ad:64, st:0)
+Massif: post-cull S. 3 (t:120, hp:120, ad:96, st:0)
+Massif: post-cull S. 4 (t:160, hp:160, ad:128, st:0)
+Massif: post-cull S. 5 (t:200, hp:200, ad:160, st:0)
+Massif: post-cull S. 6 (t:240, hp:240, ad:192, st:0)
+Massif: post-cull S. 7 (t:280, hp:280, ad:224, st:0)
+Massif: post-cull S. 8 (t:320, hp:320, ad:256, st:0)
+Massif: post-cull S. 9 (t:360, hp:360, ad:288, st:0)
+Massif: post-cull S. 10 (t:400, hp:400, ad:320, st:0)
+Massif: post-cull S. 11 (t:440, hp:440, ad:352, st:0)
+Massif: post-cull S. 12 (t:480, hp:480, ad:384, st:0)
+Massif: post-cull S. 13 (t:520, hp:520, ad:416, st:0)
+Massif: post-cull S. 14 (t:560, hp:560, ad:448, st:0)
+Massif: post-cull S. 15 (t:600, hp:600, ad:480, st:0)
+Massif: post-cull S. 16 (t:640, hp:640, ad:512, st:0)
+Massif: post-cull S. 17 (t:680, hp:680, ad:544, st:0)
+Massif: post-cull S. 18 (t:720, hp:720, ad:576, st:0)
+Massif: post-cull S. 19 (t:760, hp:760, ad:608, st:0)
+Massif: post-cull S. 20 (t:800, hp:800, ad:640, st:0)
+Massif: post-cull S. 21 (t:840, hp:840, ad:672, st:0)
+Massif: post-cull S. 22 (t:880, hp:880, ad:704, st:0)
+Massif: post-cull S. 23 (t:920, hp:920, ad:736, st:0)
+Massif: post-cull Sd 24 (t:990, hp:990, ad:792, st:0)
+Massif: post-cull S. 25 (t:1030, hp:1030, ad:824, st:0)
+Massif: post-cull S. 26 (t:1070, hp:1070, ad:856, st:0)
+Massif: post-cull S. 27 (t:1110, hp:1110, ad:888, st:0)
+Massif: post-cull S. 28 (t:1150, hp:1150, ad:920, st:0)
+Massif: post-cull Sd 29 (t:1190, hp:1190, ad:952, st:0)
+Massif: post-cull S. 30 (t:1230, hp:1230, ad:984, st:0)
+Massif: post-cull S. 31 (t:1270, hp:1270, ad:1016, st:0)
+Massif: post-cull S. 32 (t:1310, hp:1310, ad:1048, st:0)
+Massif: post-cull S. 33 (t:1350, hp:1350, ad:1080, st:0)
+Massif: post-cull Sd 34 (t:1390, hp:1390, ad:1112, st:0)
+Massif: post-cull S. 35 (t:1430, hp:1430, ad:1144, st:0)
+Massif: post-cull S. 36 (t:1470, hp:1470, ad:1176, st:0)
+Massif: post-cull S. 37 (t:1510, hp:1510, ad:1208, st:0)
+Massif: post-cull S. 38 (t:1550, hp:1550, ad:1240, st:0)
+Massif: post-cull Sd 39 (t:1590, hp:1590, ad:1272, st:0)
+Massif: post-cull S. 40 (t:1630, hp:1630, ad:1304, st:0)
+Massif: post-cull S. 41 (t:1670, hp:1670, ad:1336, st:0)
+Massif: post-cull S. 42 (t:1710, hp:1710, ad:1368, st:0)
+Massif: post-cull S. 43 (t:1750, hp:1750, ad:1400, st:0)
+Massif: post-cull Sd 44 (t:1790, hp:1790, ad:1432, st:0)
+Massif: post-cull S. 45 (t:1830, hp:1830, ad:1464, st:0)
+Massif: post-cull S. 46 (t:1870, hp:1870, ad:1496, st:0)
+Massif: post-cull S. 47 (t:1910, hp:1910, ad:1528, st:0)
+Massif: post-cull S. 48 (t:1950, hp:1950, ad:1560, st:0)
+Massif: post-cull Sd 49 (t:1990, hp:1990, ad:1592, st:0)
Massif: New time interval = 40 (between snapshots 0 and 1)
Massif: allocs: 200
Massif: zeroallocs: 0 (0%)
Modified: branches/MASSIF2/massif/tests/culling2.stderr.exp
===================================================================
--- branches/MASSIF2/massif/tests/culling2.stderr.exp 2007-09-26 23:01:39 UTC (rev 6918)
+++ branches/MASSIF2/massif/tests/culling2.stderr.exp 2007-09-26 23:28:15 UTC (rev 6919)
@@ -5,514 +5,514 @@
Massif: 4: __builtin_new
Massif: 5: __builtin_vec_new
Massif: 6: malloc
-Massif: startup snapshot 0 (t = 0 B)
-Massif: alloc snapshot 1 (t = 0 B)
-Massif: alloc snapshot 2 (t = 1 B)
-Massif: alloc snapshot 3 (t = 3 B)
-Massif: alloc snapshot 4 (t = 6 B)
-Massif: alloc snapshot 5 (t = 10 B)
-Massif: alloc snapshot 6 (t = 15 B)
-Massif: alloc snapshot 7 (t = 21 B)
-Massif: alloc snapshot 8 (t = 28 B)
-Massif: alloc snapshot 9 (t = 36 B) (detailed)
-Massif: alloc snapshot 10 (t = 45 B)
-Massif: alloc snapshot 11 (t = 55 B)
-Massif: alloc snapshot 12 (t = 66 B)
-Massif: alloc snapshot 13 (t = 78 B)
-Massif: alloc snapshot 14 (t = 91 B)
-Massif: alloc snapshot 15 (t = 105 B)
-Massif: alloc snapshot 16 (t = 120 B)
-Massif: alloc snapshot 17 (t = 136 B)
-Massif: alloc snapshot 18 (t = 153 B)
-Massif: alloc snapshot 19 (t = 171 B) (detailed)
-Massif: alloc snapshot 20 (t = 190 B)
-Massif: alloc snapshot 21 (t = 210 B)
-Massif: alloc snapshot 22 (t = 231 B)
-Massif: alloc snapshot 23 (t = 253 B)
-Massif: alloc snapshot 24 (t = 276 B)
-Massif: alloc snapshot 25 (t = 300 B)
-Massif: alloc snapshot 26 (t = 325 B)
-Massif: alloc snapshot 27 (t = 351 B)
-Massif: alloc snapshot 28 (t = 378 B)
-Massif: alloc snapshot 29 (t = 406 B) (detailed)
-Massif: alloc snapshot 30 (t = 435 B)
-Massif: alloc snapshot 31 (t = 465 B)
-Massif: alloc snapshot 32 (t = 496 B)
-Massif: alloc snapshot 33 (t = 528 B)
-Massif: alloc snapshot 34 (t = 561 B)
-Massif: alloc snapshot 35 (t = 595 B)
-Massif: alloc snapshot 36 (t = 630 B)
-Massif: alloc snapshot 37 (t = 666 B)
-Massif: alloc snapshot 38 (t = 703 B)
-Massif: alloc snapshot 39 (t = 741 B) (detailed)
-Massif: alloc snapshot 40 (t = 780 B)
-Massif: alloc snapshot 41 (t = 820 B)
-Massif: alloc snapshot 42 (t = 861 B)
-Massif: alloc snapshot 43 (t = 903 B)
-Massif: alloc snapshot 44 (t = 946 B)
-Massif: alloc snapshot 45 (t = 990 B)
-Massif: alloc snapshot 46 (t = 1035 B)
-Massif: alloc snapshot 47 (t = 1081 B)
-Massif: alloc snapshot 48 (t = 1128 B)
-Massif: alloc snapshot 49 (t = 1176 B) (detailed)
-Massif: alloc snapshot 50 (t = 1225 B)
-Massif: alloc snapshot 51 (t = 1275 B)
-Massif: alloc snapshot 52 (t = 1326 B)
-Massif: alloc snapshot 53 (t = 1378 B)
-Massif: alloc snapshot 54 (t = 1431 B)
-Massif: alloc snapshot 55 (t = 1485 B)
-Massif: alloc snapshot 56 (t = 1540 B)
-Massif: alloc snapshot 57 (t = 1596 B)
-Massif: alloc snapshot 58 (t = 1653 B)
-Massif: alloc snapshot 59 (t = 1711 B) (detailed)
-Massif: alloc snapshot 60 (t = 1770 B)
-Massif: alloc snapshot 61 (t = 1830 B)
-Massif: alloc snapshot 62 (t = 1891 B)
-Massif: alloc snapshot 63 (t = 1953 B)
-Massif: alloc snapshot 64 (t = 2016 B)
-Massif: alloc snapshot 65 (t = 2080 B)
-Massif: alloc snapshot 66 (t = 2145 B)
-Massif: alloc snapshot 67 (t = 2211 B)
-Massif: alloc snapshot 68 (t = 2278 B)
-Massif: alloc snapshot 69 (t = 2346 B) (detailed)
-Massif: alloc snapshot 70 (t = 2415 B)
-Massif: alloc snapshot 71 (t = 2485 B)
-Massif: alloc snapshot 72 (t = 2556 B)
-Massif: alloc snapshot 73 (t = 2628 B)
-Massif: alloc snapshot 74 (t = 2701 B)
-Massif: alloc snapshot 75 (t = 2775 B)
-Massif: alloc snapshot 76 (t = 2850 B)
-Massif: alloc snapshot 77 (t = 2926 B)
-Massif: alloc snapshot 78 (t = 3003 B)
-Massif: alloc snapshot 79 (t = 3081 B) (detailed)
-Massif: alloc snapshot 80 (t = 3160 B)
-Massif: alloc snapshot 81 (t = 3240 B)
-Massif: alloc snapshot 82 (t = 3321 B)
-Massif: alloc snapshot 83 (t = 3403 B)
-Massif: alloc snapshot 84 (t = 3486 B)
-Massif: alloc snapshot 85 (t = 3570 B)
-Massif: alloc snapshot 86 (t = 3655 B)
-Massif: alloc snapshot 87 (t = 3741 B)
-Massif: alloc snapshot 88 (t = 3828 B)
-Massif: alloc snapshot 89 (t = 3916 B) (detailed)
-Massif: alloc snapshot 90 (t = 4005 B)
-Massif: alloc snapshot 91 (t = 4095 B)
-Massif: alloc snapshot 92 (t = 4186 B)
-Massif: alloc snapshot 93 (t = 4278 B)
-Massif: alloc snapshot 94 (t = 4371 B)
-Massif: alloc snapshot 95 (t = 4465 B)
-Massif: alloc snapshot 96 (t = 4560 B)
-Massif: alloc snapshot 97 (t = 4656 B)
-Massif: alloc snapshot 98 (t = 4753 B)
-Massif: alloc snapshot 99 (t = 4851 B) (detailed)
+Massif: startup S. 0 (t:0, hp:0, ad:0, st:0)
+Massif: alloc S. 1 (t:0, hp:0, ad:8, st:0)
+Massif: alloc S. 2 (t:1, hp:1, ad:16, st:0)
+Massif: alloc S. 3 (t:3, hp:3, ad:24, st:0)
+Massif: alloc S. 4 (t:6, hp:6, ad:32, st:0)
+Massif: alloc S. 5 (t:10, hp:10, ad:40, st:0)
+Massif: alloc S. 6 (t:15, hp:15, ad:48, st:0)
+Massif: alloc S. 7 (t:21, hp:21, ad:56, st:0)
+Massif: alloc S. 8 (t:28, hp:28, ad:64, st:0)
+Massif: alloc Sd 9 (t:36, hp:36, ad:72, st:0)
+Massif: alloc S. 10 (t:45, hp:45, ad:80, st:0)
+Massif: alloc S. 11 (t:55, hp:55, ad:88, st:0)
+Massif: alloc S. 12 (t:66, hp:66, ad:96, st:0)
+Massif: alloc S. 13 (t:78, hp:78, ad:104, st:0)
+Massif: alloc S. 14 (t:91, hp:91, ad:112, st:0)
+Massif: alloc S. 15 (t:105, hp:105, ad:120, st:0)
+Massif: alloc S. 16 (t:120, hp:120, ad:128, st:0)
+Massif: alloc S. 17 (t:136, hp:136, ad:136, st:0)
+Massif: alloc S. 18 (t:153, hp:153, ad:144, st:0)
+Massif: alloc Sd 19 (t:171, hp:171, ad:152, st:0)
+Massif: alloc S. 20 (t:190, hp:190, ad:160, st:0)
+Massif: alloc S. 21 (t:210, hp:210, ad:168, st:0)
+Massif: alloc S. 22 (t:231, hp:231, ad:176, st:0)
+Massif: alloc S. 23 (t:253, hp:253, ad:184, st:0)
+Massif: alloc S. 24 (t:276, hp:276, ad:192, st:0)
+Massif: alloc S. 25 (t:300, hp:300, ad:200, st:0)
+Massif: alloc S. 26 (t:325, hp:325, ad:208, st:0)
+Massif: alloc S. 27 (t:351, hp:351, ad:216, st:0)
+Massif: alloc S. 28 (t:378, hp:378, ad:224, st:0)
+Massif: alloc Sd 29 (t:406, hp:406, ad:232, st:0)
+Massif: alloc S. 30 (t:435, hp:435, ad:240, st:0)
+Massif: alloc S. 31 (t:465, hp:465, ad:248, st:0)
+Massif: alloc S. 32 (t:496, hp:496, ad:256, st:0)
+Massif: alloc S. 33 (t:528, hp:528, ad:264, st:0)
+Massif: alloc S. 34 (t:561, hp:561, ad:272, st:0)
+Massif: alloc S. 35 (t:595, hp:595, ad:280, st:0)
+Massif: alloc S. 36 (t:630, hp:630, ad:288, st:0)
+Massif: alloc S. 37 (t:666, hp:666, ad:296, st:0)
+Massif: alloc S. 38 (t:703, hp:703, ad:304, st:0)
+Massif: alloc Sd 39 (t:741, hp:741, ad:312, st:0)
+Massif: alloc S. 40 (t:780, hp:780, ad:320, st:0)
+Massif: alloc S. 41 (t:820, hp:820, ad:328, st:0)
+Massif: alloc S. 42 (t:861, hp:861, ad:336, st:0)
+Massif: alloc S. 43 (t:903, hp:903, ad:344, st:0)
+Massif: alloc S. 44 (t:946, hp:946, ad:352, st:0)
+Massif: alloc S. 45 (t:990, hp:990, ad:360, st:0)
+Massif: alloc S. 46 (t:1035, hp:1035, ad:368, st:0)
+Massif: alloc S. 47 (t:1081, hp:1081, ad:376, st:0)
+Massif: alloc S. 48 (t:1128, hp:1128, ad:384, st:0)
+Massif: alloc Sd 49 (t:1176, hp:1176, ad:392, st:0)
+Massif: alloc S. 50 (t:1225, hp:1225, ad:400, st:0)
+Massif: alloc S. 51 (t:1275, hp:1275, ad:408, st:0)
+Massif: alloc S. 52 (t:1326, hp:1326, ad:416, st:0)
+Massif: alloc S. 53 (t:1378, hp:1378, ad:424, st:0)
+Massif: alloc S. 54 (t:1431, hp:1431, ad:432, st:0)
+Massif: alloc S. 55 (t:1485, hp:1485, ad:440, st:0)
+Massif: alloc S. 56 (t:1540, hp:1540, ad:448, st:0)
+Massif: alloc S. 57 (t:1596, hp:1596, ad:456, st:0)
+Massif: alloc S. 58 (t:1653, hp:1653, ad:464, st:0)
+Massif: alloc Sd 59 (t:1711, hp:1711, ad:472, st:0)
+Massif: alloc S. 60 (t:1770, hp:1770, ad:480, st:0)
+Massif: alloc S. 61 (t:1830, hp:1830, ad:488, st:0)
+Massif: alloc S. 62 (t:1891, hp:1891, ad:496, st:0)
+Massif: alloc S. 63 (t:1953, hp:1953, ad:504, st:0)
+Massif: alloc S. 64 (t:2016, hp:2016, ad:512, st:0)
+Massif: alloc S. 65 (t:2080, hp:2080, ad:520, st:0)
+Massif: alloc S. 66 (t:2145, hp:2145, ad:528, st:0)
+Massif: alloc S. 67 (t:2211, hp:2211, ad:536, st:0)
+Massif: alloc S. 68 (t:2278, hp:2278, ad:544, st:0)
+Massif: alloc Sd 69 (t:2346, hp:2346, ad:552, st:0)
+Massif: alloc S. 70 (t:2415, hp:2415, ad:560, st:0)
+Massif: alloc S. 71 (t:2485, hp:2485, ad:568, st:0)
+Massif: alloc S. 72 (t:2556, hp:2556, ad:576, st:0)
+Massif: alloc S. 73 (t:2628, hp:2628, ad:584, st:0)
+Massif: alloc S. 74 (t:2701, hp:2701, ad:592, st:0)
+Massif: alloc S. 75 (t:2775, hp:2775, ad:600, st:0)
+Massif: alloc S. 76 (t:2850, hp:2850, ad:608, st:0)
+Massif: alloc S. 77 (t:2926, hp:2926, ad:616, st:0)
+Massif: alloc S. 78 (t:3003, hp:3003, ad:624, st:0)
+Massif: alloc Sd 79 (t:3081, hp:3081, ad:632, st:0)
+Massif: alloc S. 80 (t:3160, hp:3160, ad:640, st:0)
+Massif: alloc S. 81 (t:3240, hp:3240, ad:648, st:0)
+Massif: alloc S. 82 (t:3321, hp:3321, ad:656, st:0)
+Massif: alloc S. 83 (t:3403, hp:3403, ad:664, st:0)
+Massif: alloc S. 84 (t:3486, hp:3486, ad:672, st:0)
+Massif: alloc S. 85 (t:3570, hp:3570, ad:680, st:0)
+Massif: alloc S. 86 (t:3655, hp:3655, ad:688, st:0)
+Massif: alloc S. 87 (t:3741, hp:3741, ad:696, st:0)
+Massif: alloc S. 88 (t:3828, hp:3828, ad:704, st:0)
+Massif: alloc Sd 89 (t:3916, hp:3916, ad:712, st:0)
+Massif: alloc S. 90 (t:4005, hp:4005, ad:720, st:0)
+Massif: alloc S. 91 (t:4095, hp:4095, ad:728, st:0)
+Massif: alloc S. 92 (t:4186, hp:4186, ad:736, st:0)
+Massif: alloc S. 93 (t:4278, hp:4278, ad:744, st:0)
+Massif: alloc S. 94 (t:4371, hp:4371, ad:752, st:0)
+Massif: alloc S. 95 (t:4465, hp:4465, ad:760, st:0)
+Massif: alloc S. 96 (t:4560, hp:4560, ad:768, st:0)
+Massif: alloc S. 97 (t:4656, hp:4656, ad:776, st:0)
+Massif: alloc S. 98 (t:4753, hp:4753, ad:784, st:0)
+Massif: alloc Sd 99 (t:4851, hp:4851, ad:792, st:0)
Massif: Culling...
-Massif: cull 0 (t-span = 1) snapshot 1 (t = 0 B)
-Massif: cull 1 (t-span = 3) snapshot 2 (t = 1 B)
-Massif: cull 2 (t-span = 6) snapshot 3 (t = 3 B)
-Massif: cull 3 (t-span = 9) snapshot 5 (t = 10 B)
-Massif: cull 4 (t-span = 13) snapshot 7 (t = 21 B)
-Massif: cull 5 (t-span = 15) snapshot 4 (t = 6 B)
-Massif: cull 6 (t-span = 17) snapshot 9 (t = 36 B) (detailed)
-Massif: cull 7 (t-span = 21) snapshot 11 (t = 55 B)
-Massif: cull 8 (t-span = 25) snapshot 13 (t = 78 B)
-Massif: cull 9 (t-span = 28) snapshot 6 (t = 15 B)
-Massif: cull 10 (t-span = 29) snapshot 15 (t = 105 B)
-Massif: cull 11 (t-span = 33) snapshot 17 (t = 136 B)
-Massif: cull 12 (t-span = 37) snapshot 19 (t = 171 B) (detailed)
-Massif: cull 13 (t-span = 38) snapshot 10 (t = 45 B)
-Massif: cull 14 (t-span = 41) snapshot 21 (t = 210 B)
-Massif: cull 15 (t-span = 45) snapshot 23 (t = 253 B)
-Massif: cull 16 (t-span = 49) snapshot 25 (t = 300 B)
-Massif: cull 17 (t-span = 53) snapshot 27 (t = 351 B)
-Massif: cull 18 (t-span = 54) snapshot 14 (t = 91 B)
-Massif: cull 19 (t-span = 57) snapshot 29 (t = 406 B) (detailed)
-Massif: cull 20 (t-span = 61) snapshot 31 (t = 465 B)
-Massif: cull 21 (t-span = 65) snapshot 33 (t = 528 B)
-Massif: cull 22 (t-span = 66) snapshot 8 (t = 28 B)
-Massif: cull 23 (t-span = 69) snapshot 35 (t = 595 B)
-Massif: cull 24 (t-span = 70) snapshot 18 (t = 153 B)
-Massif: cull 25 (t-span = 73) snapshot 37 (t = 666 B)
-Massif: cull 26 (t-span = 77) snapshot 39 (t = 741 B) (detailed)
-Massif: cull 27 (t-span = 81) snapshot 41 (t = 820 B)
-Massif: cull 28 (t-span = 85) snapshot 43 (t = 903 B)
-Massif: cull 29 (t-span = 86) snapshot 22 (t = 231 B)
-Massif: cull 30 (t-span = 89) snapshot 45 (t = 990 B)
-Massif: cull 31 (t-span = 93) snapshot 47 (t = 1081 B)
-Massif: cull 32 (t-span = 97) snapshot 49 (t = 1176 B) (detailed)
-Massif: cull 33 (t-span = 101) snapshot 51 (t = 1275 B)
-Massif: cull 34 (t-span = 102) snapshot 26 (t = 325 B)
-Massif: cull 35 (t-span = 105) snapshot 53 (t = 1378 B)
-Massif: cull 36 (t-span = 109) snapshot 55 (t = 1485 B)
-Massif: cull 37 (t-span = 113) snapshot 57 (t = 1596 B)
-Massif: cull 38 (t-span = 117) snapshot 59 (t = 1711 B) (detailed)
-Massif: cull 39 (t-span = 118) snapshot 30 (t = 435 B)
-Massif: cull 40 (t-span = 120) snapshot 12 (t = 66 B)
-Massif: cull 41 (t-span = 121) snapshot 61 (t = 1830 B)
-Massif: cull 42 (t-span = 125) snapshot 63 (t = 1953 B)
-Massif: cull 43 (t-span = 129) snapshot 65 (t = 2080 B)
-Massif: cull 44 (t-span = 133) snapshot 67 (t = 2211 B)
-Massif: cull 45 (t-span = 134) snapshot 34 (t = 561 B)
-Massif: cull 46 (t-span = 137) snapshot 69 (t = 2346 B) (detailed)
-Massif: cull 47 (t-span = 141) snapshot 71 (t = 2485 B)
-Massif: cull 48 (t-span = 145) snapshot 73 (t = 2628 B)
-Massif: cull 49 (t-span = 149) snapshot 75 (t = 2775 B)
+Massif: 0 (t-span = 1) S. 1 (t:0, hp:0, ad:8, st:0)
+Massif: 1 (t-span = 3) S. 2 (t:1, hp:1, ad:16, st:0)
+Massif: 2 (t-span = 6) S. 3 (t:3, hp:3, ad:24, st:0)
+Massif: 3 (t-span = 9) S. 5 (t:10, hp:10, ad:40, st:0)
+Massif: 4 (t-span = 13) S. 7 (t:21, hp:21, ad:56, st:0)
+Massif: 5 (t-span = 15) S. 4 (t:6, hp:6, ad:32, st:0)
+Massif: 6 (t-span = 17) Sd 9 (t:36, hp:36, ad:72, st:0)
+Massif: 7 (t-span = 21) S. 11 (t:55, hp:55, ad:88, st:0)
+Massif: 8 (t-span = 25) S. 13 (t:78, hp:78, ad:104, st:0)
+Massif: 9 (t-span = 28) S. 6 (t:15, hp:15, ad:48, st:0)
+Massif: 10 (t-span = 29) S. 15 (t:105, hp:105, ad:120, st:0)
+Massif: 11 (t-span = 33) S. 17 (t:136, hp:136, ad:136, st:0)
+Massif: 12 (t-span = 37) Sd 19 (t:171, hp:171, ad:152, st:0)
+Massif: 13 (t-span = 38) S. 10 (t:45, hp:45, ad:80, st:0)
+Massif: 14 (t-span = 41) S. 21 (t:210, hp:210, ad:168, st:0)
+Massif: 15 (t-span = 45) S. 23 (t:253, hp:253, ad:184, st:0)
+Massif: 16 (t-span = 49) S. 25 (t:300, hp:300, ad:200, st:0)
+Massif: 17 (t-span = 53) S. 27 (t:351, hp:351, ad:216, st:0)
+Massif: 18 (t-span = 54) S. 14 (t:91, hp:91, ad:112, st:0)
+Massif: 19 (t-span = 57) Sd 29 (t:406, hp:406, ad:232, st:0)
+Massif: 20 (t-span = 61) S. 31 (t:465, hp:465, ad:248, st:0)
+Massif: 21 (t-span = 65) S. 33 (t:528, hp:528, ad:264, st:0)
+Massif: 22 (t-span = 66) S. 8 (t:28, hp:28, ad:64, st:0)
+Massif: 23 (t-span = 69) S. 35 (t:595, hp:595, ad:280, st:0)
+Massif: 24 (t-span = 70) S. 18 (t:153, hp:153, ad:144, st:0)
+Massif: 25 (t-span = 73) S. 37 (t:666, hp:666, ad:296, st:0)
+Massif: 26 (t-span = 77) Sd 39 (t:741, hp:741, ad:312, st:0)
+Massif: 27 (t-span = 81) S. 41 (t:820, hp:820, ad:328, st:0)
+Massif: 28 (t-span = 85) S. 43 (t:903, hp:903, ad:344, st:0)
+Massif: 29 (t-span = 86) S. 22 (t:231, hp:231, ad:176, st:0)
+Massif: 30 (t-span = 89) S. 45 (t:990, hp:990, ad:360, st:0)
+Massif: 31 (t-span = 93) S. 47 (t:1081, hp:1081, ad:376, st:0)
+Massif: 32 (t-span = 97) Sd 49 (t:1176, hp:1176, ad:392, st:0)
+Massif: 33 (t-span = 101) S. 51 (t:1275, hp:1275, ad:408, st:0)
+Massif: 34 (t-span = 102) S. 26 (t:325, hp:325, ad:208, st:0)
+Massif: 35 (t-span = 105) S. 53 (t:1378, hp:1378, ad:424, st:0)
+Massif: 36 (t-span = 109) S. 55 (t:1485, hp:1485, ad:440, st:0)
+Massif: 37 (t-span = 113) S. 57 (t:1596, hp:1596, ad:456, st:0)
+Massif: 38 (t-span = 117) Sd 59 (t:1711, hp:1711, ad:472, st:0)
+Massif: 39 (t-span = 118) S. 30 (t:435, hp:435, ad:240, st:0)
+Massif: 40 (t-span = 120) S. 12 (t:66, hp:66, ad:96, st:0)
+Massif: 41 (t-span = 121) S. 61 (t:1830, hp:1830, ad:488, st:0)
+Massif: 42 (t-span = 125) S. 63 (t:1953, hp:1953, ad:504, st:0)
+Massif: 43 (t-span = 129) S. 65 (t:2080, hp:2080, ad:520, st:0)
+Massif: 44 (t-span = 133) S. 67 (t:2211, hp:2211, ad:536, st:0)
+Massif: 45 (t-span = 134) S. 34 (t:561, hp:561, ad:272, st:0)
+Massif: 46 (t-span = 137) Sd 69 (t:2346, hp:2346, ad:552, st:0)
+Massif: 47 (t-span = 141) S. 71 (t:2485, hp:2485, ad:568, st:0)
+Massif: 48 (t-span = 145) S. 73 (t:2628, hp:2628, ad:584, st:0)
+Massif: 49 (t-span = 149) S. 75 (t:2775, hp:2775, ad:600, st:0)
Massif: Finished culling ( 50 of 100 deleted)
-Massif: post-cull snapshot 0 (t = 0 B)
-Massif: post-cull snapshot 1 (t = 120 B)
-Massif: post-cull snapshot 2 (t = 190 B)
-Massif: post-cull snapshot 3 (t = 276 B)
-Massif: post-cull snapshot 4 (t = 378 B)
-Massif: post-cull snapshot 5 (t = 496 B)
-Massif: post-cull snapshot 6 (t = 630 B)
-Massif: post-cull snapshot 7 (t = 703 B)
-Massif: post-cull snapshot 8 (t = 780 B)
-Massif: post-cull snapshot 9 (t = 861 B)
-Massif: post-cull snapshot 10 (t = 946 B)
-Massif: post-cull snapshot 11 (t = 1035 B)
-Massif: post-cull snapshot 12 (t = 1128 B)
-Massif: post-cull snapshot 13 (t = 1225 B)
-Massif: post-cull snapshot 14 (t = 1326 B)
-Massif: post-cull snapshot 15 (t = 1431 B)
-Massif: post-cull snapshot 16 (t = 1540 B)
-Massif: post-cull snapshot 17 (t = 1653 B)
-Massif: post-cull snapshot 18 (t = 1770 B)
-Massif: post-cull snapshot 19 (t = 1891 B)
-Massif: post-cull snapshot 20 (t = 2016 B)
-Massif: post-cull snapshot 21 (t = 2145 B)
-Massif: post-cull snapshot 22 (t = 2278 B)
-Massif: post-cull snapshot 23 (t = 2415 B)
-Massif: post-cull snapshot 24 (t = 2556 B)
-Massif: post-cull snapshot 25 (t = 2701 B)
-Massif: post-cull snapshot 26 (t = 2850 B)
-Massif: post-cull snapshot 27 (t = 2926 B)
-Massif: post-cull snapshot 28 (t = 3003 B)
-Massif: post-cull snapshot 29 (t = 3081 B) (detailed)
-Massif: post-cull snapshot 30 (t = 3160 B)
-Massif: post-cull snapshot 31 (t = 3240 B)
-Massif: post-cull snapshot 32 (t = 3321 B)
-Massif: post-cull snapshot 33 (t = 3403 B)
-Massif: post-cull snapshot 34 (t = 3486 B)
-Massif: post-cull snapshot 35 (t = 3570 B)
-Massif: post-cull snapshot 36 (t = 3655 B)
-Massif: post-cull snapshot 37 (t = 3741 B)
-Massif: post-cull snapshot 38 (t = 3828 B)
-Massif: post-cull snapshot 39 (t = 3916 B) (detailed)
-Massif: post-cull snapshot 40 (t = 4005 B)
-Massif: post-cull snapshot 41 (t = 4095 B)
-Massif: post-cull snapshot 42 (t = 4186 B)
-Massif: post-cull snapshot 43 (t = 4278 B)
-Massif: post-cull snapshot 44 (t = 4371 B)
-Massif: post-cull snapshot 45 (t = 4465 B)
-Massif: post-cull snapshot 46 (t = 4560 B)
-Massif: post-cull snapshot 47 (t = 4656 B)
-Massif: post-cull snapshot 48 (t = 4753 B)
-Massif: post-cull snapshot 49 (t = 4851 B) (detailed)
+Massif: post-cull S. 0 (t:0, hp:0, ad:0, st:0)
+Massif: post-cull S. 1 (t:120, hp:120, ad:128, st:0)
+Massif: post-cull S. 2 (t:190, hp:190, ad:160, st:0)
+Massif: post-cull S. 3 (t:276, hp:276, ad:192, st:0)
+Massif: post-cull S. 4 (t:378, hp:378, ad:224, st:0)
+Massif: post-cull S. 5 (t:496, hp:496, ad:256, st:0)
+Massif: post-cull S. 6 (t:630, hp:630, ad:288, st:0)
+Massif: post-cull S. 7 (t:703, hp:703, ad:304, st:0)
+Massif: post-cull S. 8 (t:780, hp:780, ad:320, st:0)
+Massif: post-cull S. 9 (t:861, hp:861, ad:336, st:0)
+Massif: post-cull S. 10 (t:946, hp:946, ad:352, st:0)
+Massif: post-cull S. 11 (t:1035, hp:1035, ad:368, st:0)
+Massif: post-cull S. 12 (t:1128, hp:1128, ad:384, st:0)
+Ma...
[truncated message content] |
|
From: <sv...@va...> - 2007-09-26 23:01:37
|
Author: njn
Date: 2007-09-27 00:01:39 +0100 (Thu, 27 Sep 2007)
New Revision: 6918
Log:
When --stacks=yes, try taking snapshots on every stack alloc/dealloc.
Modified:
branches/MASSIF2/massif/ms_main.c
branches/MASSIF2/massif/tests/culling1.stderr.exp
branches/MASSIF2/massif/tests/culling2.stderr.exp
branches/MASSIF2/massif/tests/realloc.stderr.exp
Modified: branches/MASSIF2/massif/ms_main.c
===================================================================
--- branches/MASSIF2/massif/ms_main.c 2007-09-26 22:49:48 UTC (rev 6917)
+++ branches/MASSIF2/massif/ms_main.c 2007-09-26 23:01:39 UTC (rev 6918)
@@ -31,9 +31,10 @@
// XXX:
//---------------------------------------------------------------------------
// Todo:
-// - disable --stacks, unless/until I do it fully and properly -- ie.
-// track every stack alloc/dealloc -- necessary if peak-taking is to be
-// accurate. Stacks stuff is hard to regtest, unfortunately.
+// - -v: give more detail on each snapshot -- sizes, etc
+// - -v: print number of skipped snapshots after each one is taken
+// - Add ability to draw multiple graphs, eg. heap-only, stack-only, total.
+// Give each graph a title.
// - do peak-taking.
// - make file format more generic. Obstacles:
// - unit prefixes are not generic
@@ -249,6 +250,8 @@
static UInt n_zero_allocs = 0;
static UInt n_reallocs = 0;
static UInt n_frees = 0;
+static UInt n_stack_allocs = 0;
+static UInt n_stack_frees = 0;
static UInt n_xpt_init_expansions = 0;
static UInt n_xpt_later_expansions = 0;
static UInt n_getXCon_redo = 0;
@@ -1417,18 +1420,42 @@
//------------------------------------------------------------//
-//--- Tracked events ---//
+//--- Stacks ---//
//------------------------------------------------------------//
+static void update_stack_stats(SSizeT stack_szB_len)
+{
+ total_allocs_deallocs_szB += stack_szB_len;
+}
+
+static void new_mem_stack(Addr a, SizeT len)
+{
+ n_stack_allocs++;
+ update_stack_stats(len);
+ maybe_take_snapshot("stk-new");
+}
+
+static void die_mem_stack(Addr a, SizeT len)
+{
+ n_stack_frees++;
+ update_stack_stats(len);
+ maybe_take_snapshot("stk-die");
+}
+
+
static void new_mem_stack_signal(Addr a, SizeT len)
{
sigstacks_szB += len;
+ update_stack_stats(len);
+ maybe_take_snapshot("sig-new");
}
static void die_mem_stack_signal(Addr a, SizeT len)
{
tl_assert(sigstacks_szB >= len);
sigstacks_szB -= len;
+ update_stack_stats(len);
+ maybe_take_snapshot("sig-die");
}
@@ -1475,9 +1502,11 @@
static Bool is_first_SB = True;
if (is_first_SB) {
- // Do an initial sample for t = 0. We use 'maybe_take_snapshot'
- // instead of 'take_snapshot' to get its internal static variables
- // initialised.
+ // Do an initial sample to guarantee that we have at least one.
+ // We use 'maybe_take_snapshot' instead of 'take_snapshot' to ensure
+ // 'maybe_take_snapshot's internal static variables are initialised.
+ // However, with --stacks=yes this snapshot may not actually be the
+ // first one, surprisingly enough.
maybe_take_snapshot("startup");
is_first_SB = False;
}
@@ -1703,6 +1732,8 @@
( n_allocs ? n_zero_allocs * 100 / n_allocs : 0 ));
VERB("reallocs: %u", n_reallocs);
VERB("frees: %u", n_frees);
+ VERB("stack allocs: %u", n_stack_allocs);
+ VERB("stack frees: %u", n_stack_frees);
VERB("XPts: %u", n_xpts);
VERB("top-XPts: %u (%d%%)",
alloc_xpt->n_children,
@@ -1737,6 +1768,15 @@
}
}
+ if (clo_stacks) {
+ // Events to track
+ VG_(track_new_mem_stack) ( new_mem_stack );
+ VG_(track_die_mem_stack) ( die_mem_stack );
+
+ VG_(track_new_mem_stack_signal)( new_mem_stack_signal );
+ VG_(track_die_mem_stack_signal)( die_mem_stack_signal );
+ }
+
// We don't take a snapshot now, because there's still some core
// initialisation to do, in which case we have an artificial gap.
// Instead we do it when the first translation occurs. See
@@ -1777,10 +1817,6 @@
ms_realloc,
0 );
- // Events to track
- VG_(track_new_mem_stack_signal)( new_mem_stack_signal );
- VG_(track_die_mem_stack_signal)( die_mem_stack_signal );
-
// HP_Chunks
malloc_list = VG_(HT_construct)( 80021 ); // prime, big
Modified: branches/MASSIF2/massif/tests/culling1.stderr.exp
===================================================================
--- branches/MASSIF2/massif/tests/culling1.stderr.exp 2007-09-26 22:49:48 UTC (rev 6917)
+++ branches/MASSIF2/massif/tests/culling1.stderr.exp 2007-09-26 23:01:39 UTC (rev 6918)
@@ -365,6 +365,8 @@
Massif: zeroallocs: 0 (0%)
Massif: reallocs: 0
Massif: frees: 0
+Massif: stack allocs: 0
+Massif: stack frees: 0
Massif: XPts: 2
Massif: top-XPts: 1 (50%)
Massif: dup'd XPts: 30
Modified: branches/MASSIF2/massif/tests/culling2.stderr.exp
===================================================================
--- branches/MASSIF2/massif/tests/culling2.stderr.exp 2007-09-26 22:49:48 UTC (rev 6917)
+++ branches/MASSIF2/massif/tests/culling2.stderr.exp 2007-09-26 23:01:39 UTC (rev 6918)
@@ -518,6 +518,8 @@
Massif: zeroallocs: 1 (0%)
Massif: reallocs: 0
Massif: frees: 0
+Massif: stack allocs: 0
+Massif: stack frees: 0
Massif: XPts: 2
Massif: top-XPts: 1 (50%)
Massif: dup'd XPts: 40
Modified: branches/MASSIF2/massif/tests/realloc.stderr.exp
===================================================================
--- branches/MASSIF2/massif/tests/realloc.stderr.exp 2007-09-26 22:49:48 UTC (rev 6917)
+++ branches/MASSIF2/massif/tests/realloc.stderr.exp 2007-09-26 23:01:39 UTC (rev 6918)
@@ -15,6 +15,8 @@
Massif: zeroallocs: 0 (0%)
Massif: reallocs: 4
Massif: frees: 1
+Massif: stack allocs: 0
+Massif: stack frees: 0
Massif: XPts: 5
Massif: top-XPts: 4 (80%)
Massif: dup'd XPts: 0
|
|
From: <sv...@va...> - 2007-09-26 22:50:25
|
Author: sewardj
Date: 2007-09-26 23:50:27 +0100 (Wed, 26 Sep 2007)
New Revision: 1791
Log:
Track API changes.
Modified:
branches/THRCHECK/test_main.c
Modified: branches/THRCHECK/test_main.c
===================================================================
--- branches/THRCHECK/test_main.c 2007-09-26 22:43:10 UTC (rev 1790)
+++ branches/THRCHECK/test_main.c 2007-09-26 22:50:27 UTC (rev 1791)
@@ -127,7 +127,8 @@
/* FIXME: put sensible values into the .hwcaps fields */
LibVEX_default_VexArchInfo(&vai_x86);
- vai_x86.hwcaps = 0;
+ vai_x86.hwcaps = VEX_HWCAPS_X86_SSE1
+ | VEX_HWCAPS_X86_SSE2 | VEX_HWCAPS_X86_SSE3;
LibVEX_default_VexArchInfo(&vai_amd64);
vai_amd64.hwcaps = 0;
@@ -139,7 +140,7 @@
LibVEX_default_VexAbiInfo(&vbi);
/* ----- Set up args for LibVEX_Translate ----- */
-#if 1 /* ppc32 -> ppc32 */
+#if 0 /* ppc32 -> ppc32 */
vta.arch_guest = VexArchPPC32;
vta.archinfo_guest = vai_ppc32;
vta.arch_host = VexArchPPC32;
@@ -151,7 +152,7 @@
vta.arch_host = VexArchAMD64;
vta.archinfo_host = vai_amd64;
#endif
-#if 0 /* x86 -> x86 */
+#if 1 /* x86 -> x86 */
vta.arch_guest = VexArchX86;
vta.archinfo_guest = vai_x86;
vta.arch_host = VexArchX86;
@@ -187,6 +188,8 @@
vta.dispatch = NULL;
#endif
+ vta.finaltidy = NULL;
+
for (i = 0; i < TEST_N_ITERS; i++)
tres = LibVEX_Translate ( &vta );
|
|
From: <sv...@va...> - 2007-09-26 22:49:46
|
Author: sewardj
Date: 2007-09-26 23:49:48 +0100 (Wed, 26 Sep 2007)
New Revision: 6917
Log:
Continue to review/rationalise suppressions for glibc-2.X w/ Thrcheck.
Modified:
branches/THRCHECK/glibc-2.X-thrcheck.supp
Modified: branches/THRCHECK/glibc-2.X-thrcheck.supp
===================================================================
--- branches/THRCHECK/glibc-2.X-thrcheck.supp 2007-09-26 22:48:59 UTC (rev 6916)
+++ branches/THRCHECK/glibc-2.X-thrcheck.supp 2007-09-26 22:49:48 UTC (rev 6917)
@@ -3,49 +3,49 @@
# Suppressions for the Thrcheck tool when using
# a glibc-2.{2,3,4,5,6} system
-###--- ld.so stuff ---###
-{
- thrcheck-glibc2X-ldso-1
- Thrcheck:Race
- fun:_dl_lookup_symbol_x
- fun:_dl_fixup
- fun:_dl_runtime_resolve
-}
-{
- thrcheck-glibc2X-ldso-2
- Thrcheck:Race
- fun:do_lookup_x
- fun:_dl_lookup_symbol_x
- fun:_dl_fixup
-}
-{
- thrcheck-glibc2X-ldso-3
- Thrcheck:Race
- fun:_dl_map_object_deps
- fun:dl_open_worker
- fun:_dl_catch_error
-}
-{
- thrcheck-glibc2X-ldso-4
- Thrcheck:Race
- fun:setup_direct
- fun:_dl_map_object_deps
- fun:dl_open_worker
-}
-{
- thrcheck-glibc2X-ldso-5
- Thrcheck:Race
- fun:_dl_map_object_from_fd
- fun:_dl_map_object
- fun:dl_open_worker
-}
-{
- thrcheck-glibc2X-ldso-6
- Thrcheck:Race
- fun:_dl_map_object
- fun:dl_open_worker
- fun:_dl_catch_error
-}
+#z###--- ld.so stuff ---###
+#z{
+#z thrcheck-glibc2X-ldso-1
+#z Thrcheck:Race
+#z fun:_dl_lookup_symbol_x
+#z fun:_dl_fixup
+#z fun:_dl_runtime_resolve
+#z}
+#z{
+#z thrcheck-glibc2X-ldso-2
+#z Thrcheck:Race
+#z fun:do_lookup_x
+#z fun:_dl_lookup_symbol_x
+#z fun:_dl_fixup
+#z}
+#z{
+#z thrcheck-glibc2X-ldso-3
+#z Thrcheck:Race
+#z fun:_dl_map_object_deps
+#z fun:dl_open_worker
+#z fun:_dl_catch_error
+#z}
+#z{
+#z thrcheck-glibc2X-ldso-4
+#z Thrcheck:Race
+#z fun:setup_direct
+#z fun:_dl_map_object_deps
+#z fun:dl_open_worker
+#z}
+#z{
+#z thrcheck-glibc2X-ldso-5
+#z Thrcheck:Race
+#z fun:_dl_map_object_from_fd
+#z fun:_dl_map_object
+#z fun:dl_open_worker
+#z}
+#z{
+#z thrcheck-glibc2X-ldso-6
+#z Thrcheck:Race
+#z fun:_dl_map_object
+#z fun:dl_open_worker
+#z fun:_dl_catch_error
+#z}
###--- pthread_join ---###
{
@@ -54,61 +54,61 @@
fun:pthread_join
fun:pthread_join
}
-{
- thrcheck-glibc2X-pthjoin-2
- Thrcheck:Race
- fun:__free_tcb
- fun:pthread_join
- fun:pthread_join
-}
+#z{
+#z thrcheck-glibc2X-pthjoin-2
+#z Thrcheck:Race
+#z fun:__free_tcb
+#z fun:pthread_join
+#z fun:pthread_join
+#z}
+#z
+#z###--- IO_file ---###
+#z{
+#z thrcheck-glibc2X-IOfile-1
+#z Thrcheck:Race
+#z fun:_IO_file_xsputn*
+#z fun:vfprintf
+#z fun:*printf
+#z}
+#z{
+#z thrcheck-glibc2X-IOfile-2
+#z Thrcheck:Race
+#z fun:_IO_file_overflow*
+#z fun:_IO_file_xsputn*
+#z fun:*printf
+#z}
+#z{
+#z thrcheck-glibc2X-IOfile-3
+#z Thrcheck:Race
+#z fun:new_do_write
+#z fun:_IO_do_write*
+#z fun:_IO_file_xsputn*
+#z fun:*printf
+#z}
+#z{
+#z thrcheck-glibc2X-IOfile-4
+#z Thrcheck:Race
+#z fun:new_do_write
+#z fun:_IO_file_xsputn*
+#z fun:*printf
+#z}
+#z{
+#z thrcheck-glibc2X-IOfile-5
+#z Thrcheck:Race
+#z fun:new_do_write
+#z fun:_IO_do_write*
+#z fun:_IO_file_overflow*
+#z fun:_IO_file_xsputn*
+#z}
+#z
+#z###--- thread creation ---###
+#z{
+#z thrcheck-glibc2X-creation-1
+#z Thrcheck:Race
+#z fun:start_thread
+#z fun:clone
+#z}
-###--- IO_file ---###
-{
- thrcheck-glibc2X-IOfile-1
- Thrcheck:Race
- fun:_IO_file_xsputn*
- fun:vfprintf
- fun:*printf
-}
-{
- thrcheck-glibc2X-IOfile-2
- Thrcheck:Race
- fun:_IO_file_overflow*
- fun:_IO_file_xsputn*
- fun:*printf
-}
-{
- thrcheck-glibc2X-IOfile-3
- Thrcheck:Race
- fun:new_do_write
- fun:_IO_do_write*
- fun:_IO_file_xsputn*
- fun:*printf
-}
-{
- thrcheck-glibc2X-IOfile-4
- Thrcheck:Race
- fun:new_do_write
- fun:_IO_file_xsputn*
- fun:*printf
-}
-{
- thrcheck-glibc2X-IOfile-5
- Thrcheck:Race
- fun:new_do_write
- fun:_IO_do_write*
- fun:_IO_file_overflow*
- fun:_IO_file_xsputn*
-}
-
-###--- thread creation ---###
-{
- thrcheck-glibc2X-creation-1
- Thrcheck:Race
- fun:start_thread
- fun:clone
-}
-
###--- thread exit ---###
{
thrcheck-glibc2X-exit-1
@@ -133,7 +133,7 @@
###--- pthread_mutex_destroy ---###
{
- thrcheck-glibc2X-pthmxlock-2
+ thrcheck-glibc2X-pthmxdestroy-1
Thrcheck:Race
fun:pthread_mutex_destroy
fun:pthread_mutex_destroy
@@ -146,13 +146,13 @@
fun:pthread_create@@GLIBC_*
fun:pthread_create@*
}
-{
- thrcheck-glibc2X-pthcreate-2
- Thrcheck:Race
- fun:do_clone
- fun:pthread_create@@GLIBC_*
- fun:pthread_create@*
-}
+#z{
+#z thrcheck-glibc2X-pthcreate-2
+#z Thrcheck:Race
+#z fun:do_clone
+#z fun:pthread_create@@GLIBC_*
+#z fun:pthread_create@*
+#z}
###--- pthread_cond_signal ---###
#
@@ -184,35 +184,43 @@
Thrcheck:Race
fun:pthread_cond_wait@@GLIBC_2.3.2
}
-{
- thrcheck-glibc2X-pthcondwait-2
- Thrcheck:Race
- fun:pthread_cond_wait@@GLIBC_*
- fun:pthread_cond_wait*
-}
+#z{
+#z thrcheck-glibc2X-pthcondwait-2
+#z Thrcheck:Race
+#z fun:pthread_cond_wait@@GLIBC_*
+#z fun:pthread_cond_wait*
+#z}
-###--- pthread_mutex_trylock ---###
+###--- pthread_cond_destroy ---###
# ditto
{
- thrcheck-glibc2X-pthmxtrylock-1
+ thrcheck-glibc2X-pthconddestroy-1
Thrcheck:Race
- fun:pthread_mutex_trylock
+ fun:pthread_cond_destroy@@GLIBC_2.3.2
}
-###--- pthread_cond_timedwait ---###
-{
- thrcheck-glibc2X-pthmxtimedwait-1
- Thrcheck:Race
- fun:pthread_cond_timedwait@@GLIBC_*
- fun:pthread_cond_timedwait*
-}
-{
- thrcheck-glibc2X-pthmxtimedwait-2
- Thrcheck:Race
- fun:__lll_mutex_lock_wait
- fun:pthread_cond_timedwait@@GLIBC_*
- fun:pthread_cond_timedwait*
-}
+#z###--- pthread_mutex_trylock ---###
+#z# ditto
+#z{
+#z thrcheck-glibc2X-pthmxtrylock-1
+#z Thrcheck:Race
+#z fun:pthread_mutex_trylock
+#z}
+#z
+#z###--- pthread_cond_timedwait ---###
+#z{
+#z thrcheck-glibc2X-pthmxtimedwait-1
+#z Thrcheck:Race
+#z fun:pthread_cond_timedwait@@GLIBC_*
+#z fun:pthread_cond_timedwait*
+#z}
+#z{
+#z thrcheck-glibc2X-pthmxtimedwait-2
+#z Thrcheck:Race
+#z fun:__lll_mutex_lock_wait
+#z fun:pthread_cond_timedwait@@GLIBC_*
+#z fun:pthread_cond_timedwait*
+#z}
###--- libpthread internal stuff ---###
{
@@ -220,7 +228,6 @@
Thrcheck:Race
fun:__pthread_mutex_unlock_usercnt
fun:pthread_mutex_unlock
- fun:pthread_mutex_unlock
}
{
thrcheck-glibc2X-libpthread-2
@@ -229,57 +236,73 @@
fun:_L_mutex_unlock_*
fun:__pthread_mutex_unlock_usercnt
}
+#z{
+#z thrcheck-glibc2X-libpthread-3
+#z Thrcheck:Race
+#z fun:__lll_mutex_lock_wait
+#z fun:_L_mutex_lock_*
+#z fun:start_thread
+#z}
+#z{
+#z thrcheck-glibc2X-libpthread-4
+#z Thrcheck:Race
+#z fun:__lll_mutex_lock_wait
+#z fun:_L_mutex_lock_*
+#z fun:pthread_mutex_lock
+#z}
{
- thrcheck-glibc2X-libpthread-3
- Thrcheck:Race
- fun:__lll_mutex_lock_wait
- fun:_L_mutex_lock_*
- fun:start_thread
-}
-{
- thrcheck-glibc2X-libpthread-4
- Thrcheck:Race
- fun:__lll_mutex_lock_wait
- fun:_L_mutex_lock_*
- fun:pthread_mutex_lock
-}
-{
thrcheck-glibc2X-libpthread-5
Thrcheck:Race
fun:mythread_wrapper
fun:start_thread
}
+#z{
+#z thrcheck-glibc2X-libpthread-6
+#z Thrcheck:Race
+#z fun:__deallocate_stack
+#z fun:start_thread
+#z}
+#z{
+#z thrcheck-glibc2X-libpthread-7
+#z Thrcheck:Race
+#z fun:__deallocate_stack
+#z fun:__free_tcb
+#z fun:start_thread
+#z}
+#z{
+#z thrcheck-glibc2X-libpthread-8
+#z Thrcheck:Race
+#z fun:__deallocate_stack
+#z fun:pthread_join
+#z fun:pthread_join
+#z}
+#z
+#z###--- fork ---###
+#z{
+#z thrcheck-glibc2X-fork-1
+#z Thrcheck:Race
+#z fun:__reclaim_stacks
+#z fun:fork
+#z}
+
+###--- glibc-2.5 specific ---###
{
- thrcheck-glibc2X-libpthread-6
+ thrcheck-glibc25-ld25-64bit-1
Thrcheck:Race
- fun:__deallocate_stack
- fun:start_thread
+ obj:/lib64/ld-2.5.so
+ obj:/lib64/ld-2.5.so
+ obj:/lib64/ld-2.5.so
}
{
- thrcheck-glibc2X-libpthread-7
+ thrcheck-glibc25-ld25-32bit-1
Thrcheck:Race
- fun:__deallocate_stack
- fun:__free_tcb
- fun:start_thread
+ obj:/lib/ld-2.5.so
+ obj:/lib/ld-2.5.so
+ obj:/lib/ld-2.5.so
}
-{
- thrcheck-glibc2X-libpthread-8
- Thrcheck:Race
- fun:__deallocate_stack
- fun:pthread_join
- fun:pthread_join
-}
-###--- fork ---###
+###--- glibc-2.6.1 specific ---###
{
- thrcheck-glibc2X-fork-1
- Thrcheck:Race
- fun:__reclaim_stacks
- fun:fork
-}
-
-###--- OpenSUSE 10.3 specific ---###
-{
thrcheck-glibc26-ld261-64bit-1
Thrcheck:Race
obj:/lib64/ld-2.6.1.so
@@ -293,3 +316,11 @@
obj:/lib/ld-2.6.1.so
obj:/lib/ld-2.6.1.so
}
+
+###--- qt4 specific ---###
+{
+ thrcheck-qt4-QMutex::lock()-twice
+ Thrcheck:Race
+ fun:_ZN6QMutex4lockEv
+ fun:_ZN6QMutex4lockEv
+}
|
|
From: <sv...@va...> - 2007-09-26 22:49:04
|
Author: sewardj
Date: 2007-09-26 23:48:59 +0100 (Wed, 26 Sep 2007)
New Revision: 6916
Log:
Major overhaul of Lock handling/representation in preparation for
support of reader-writer locks.
Modified:
branches/THRCHECK/thrcheck/tc_main.c
Modified: branches/THRCHECK/thrcheck/tc_main.c
===================================================================
--- branches/THRCHECK/thrcheck/tc_main.c 2007-09-26 22:47:29 UTC (rev 6915)
+++ branches/THRCHECK/thrcheck/tc_main.c 2007-09-26 22:48:59 UTC (rev 6916)
@@ -224,23 +224,45 @@
'normal' collection of Locks, which can come and go. When the lock
is copied, its .magic is changed from LockN_Magic to
LockP_Magic. */
+
+/* Lock kinds. */
typedef
+ enum {
+ LK_mbRec=1001, /* normal mutex, possibly recursive */
+ LK_nonRec, /* normal mutex, definitely non recursive */
+ LK_rdwr /* reader-writer lock */
+ }
+ LockKind;
+
+typedef
struct _Lock {
/* ADMIN */
struct _Lock* admin;
ULong unique; /* used for persistence-hashing */
UInt magic; /* LockN_MAGIC or LockP_MAGIC */
- /* USEFUL */
- /* If .count is zero, lock is currently unheld, and .thr must
- be NULL. If .count > 0, lock is locked .count times by
- .thr, which must be non-NULL. */
- ULong count;
- Thread* thr;
- /* Guest address of lock */
- Addr guestaddr;
/* EXPOSITION */
/* Place where lock first came to the attention of Thrcheck. */
- ExeContext* appeared_at;
+ ExeContext* appeared_at;
+ /* USEFUL-STATIC */
+ Addr guestaddr; /* Guest address of lock */
+ LockKind kind; /* what kind of lock this is */
+ /* USEFUL-DYNAMIC */
+ Bool heldW;
+ WordBag* heldBy; /* bag of threads that hold this lock */
+ /* .heldBy is NULL: lock is unheld, and .heldW is meaningless
+ but arbitrarily set to False
+ .heldBy is non-NULL:
+ .heldW is True: lock is w-held by threads in heldBy
+ .heldR is False: lock is r-held by threads in heldBy
+ Either way, heldBy may not validly be an empty Bag.
+
+ for LK_nonRec, r-holdings are not allowed, and w-holdings may
+ only have sizeTotal(heldBy) == 1
+
+ for LK_mbRec, r-holdings are not allowed, and w-holdings may
+ only have sizeUnique(heldBy) == 1
+
+ for LK_rdwr, w-holdings may only have sizeTotal(heldBy) == 1 */
}
Lock;
@@ -315,6 +337,8 @@
/* --------- Constructors --------- */
+static inline Bool is_sane_LockN ( Lock* lock ); /* fwds */
+
static Thread* mk_Thread ( WordSetID lockset, SegmentID csegid ) {
static Int indx = 1;
Thread* thread = tc_zalloc( sizeof(Lock) );
@@ -329,16 +353,18 @@
return thread;
}
// Make a new lock which is unlocked (hence ownerless)
-static Lock* mk_LockN ( Addr guestaddr ) {
+static Lock* mk_LockN ( LockKind kind, Addr guestaddr ) {
static ULong unique = 0;
Lock* lock = tc_zalloc( sizeof(Lock) );
lock->admin = admin_locks;
lock->unique = unique++;
lock->magic = LockN_MAGIC;
- lock->count = 0;
- lock->thr = NULL;
+ lock->appeared_at = NULL;
lock->guestaddr = guestaddr;
- lock->appeared_at = NULL;
+ lock->kind = kind;
+ lock->heldW = False;
+ lock->heldBy = NULL;
+ tl_assert(is_sane_LockN(lock));
admin_locks = lock;
return lock;
}
@@ -356,26 +382,164 @@
return seg;
}
+static inline Bool is_sane_Segment ( Segment* seg ) {
+ return seg != NULL && seg->magic == Segment_MAGIC;
+}
static inline Bool is_sane_Thread ( Thread* thr ) {
return thr != NULL && thr->magic == Thread_MAGIC;
}
-static inline Bool is_sane_LockN ( Lock* lock ) {
- return lock != NULL
- && lock->magic == LockN_MAGIC
- && (lock->thr ? lock->count > 0 : lock->count == 0);
+
+static Bool is_sane_Bag_of_Threads ( WordBag* bag )
+{
+ Thread* thr;
+ Word count;
+ TC_(initIterBag)( bag );
+ while (TC_(nextIterBag)( bag, (Word*)&thr, &count )) {
+ if (count < 1) return False;
+ if (!is_sane_Thread(thr)) return False;
+ }
+ TC_(doneIterBag)( bag );
+ return True;
}
+static Bool is_sane_Lock_BASE ( Lock* lock )
+{
+ if (lock == NULL
+ || (lock->magic != LockN_MAGIC && lock->magic != LockP_MAGIC))
+ return False;
+ switch (lock->kind) {
+ case LK_mbRec: case LK_nonRec: case LK_rdwr: break;
+ default: return False;
+ }
+ if (lock->heldBy == NULL) {
+ /* Unheld. We arbitrarily require heldW to be False. */
+ return !lock->heldW;
+ }
+
+ /* If heldBy is non-NULL, we require it to contain at least one
+ thread. */
+ if (TC_(isEmptyBag)(lock->heldBy))
+ return False;
+
+ /* Lock is either r- or w-held. */
+ if (!is_sane_Bag_of_Threads(lock->heldBy))
+ return False;
+ if (lock->heldW) {
+ /* Held in write-mode */
+ if ((lock->kind == LK_nonRec || lock->kind == LK_rdwr)
+ && !TC_(isSingletonTotalBag)(lock->heldBy))
+ return False;
+ } else {
+ /* Held in read-mode */
+ if (lock->kind != LK_rdwr) return False;
+ }
+ return True;
+}
static inline Bool is_sane_LockP ( Lock* lock ) {
return lock != NULL
&& lock->magic == LockP_MAGIC
- && (lock->thr ? lock->count > 0 : lock->count == 0);
+ && is_sane_Lock_BASE(lock);
}
+static inline Bool is_sane_LockN ( Lock* lock ) {
+ return lock != NULL
+ && lock->magic == LockN_MAGIC
+ && is_sane_Lock_BASE(lock);
+}
static inline Bool is_sane_LockNorP ( Lock* lock ) {
- return is_sane_LockN(lock) || is_sane_LockP(lock);
+ return is_sane_Lock_BASE(lock);
}
-static inline Bool is_sane_Segment ( Segment* seg ) {
- return seg != NULL && seg->magic == Segment_MAGIC;
+
+/* Release storage for a Lock. Also release storage in .heldBy, if
+ any. */
+static void del_LockN ( Lock* lk )
+{
+ tl_assert(is_sane_LockN(lk));
+ if (lk->heldBy)
+ TC_(deleteBag)( lk->heldBy );
+ VG_(memset)(lk, 0xAA, sizeof(*lk));
+ tc_free(lk);
}
+/* Update 'lk' to reflect that 'thr' now has a write-acquisition of
+ it. This is done strictly: only combinations resulting from
+ correct program and libpthread behaviour are allowed. */
+static void lockN_acquire_writer ( Lock* lk, Thread* thr )
+{
+ tl_assert(is_sane_LockN(lk));
+ tl_assert(is_sane_Thread(thr));
+ switch (lk->kind) {
+ case LK_nonRec:
+ case_LK_nonRec:
+ tl_assert(lk->heldBy == NULL); /* can't w-lock recursively */
+ tl_assert(!lk->heldW);
+ lk->heldW = True;
+ lk->heldBy = TC_(newBag)( tc_zalloc, tc_free );
+ TC_(addToBag)( lk->heldBy, (Word)thr );
+ break;
+ case LK_mbRec:
+ if (lk->heldBy == NULL)
+ goto case_LK_nonRec;
+ /* 2nd and subsequent locking of a lock by its owner */
+ tl_assert(lk->heldW);
+ /* assert: lk is only held by one thread .. */
+ tl_assert(TC_(sizeUniqueBag(lk->heldBy)) == 1);
+ /* assert: .. and that thread is 'thr'. */
+ tl_assert(TC_(elemBag)(lk->heldBy, (Word)thr)
+ == TC_(sizeTotalBag)(lk->heldBy));
+ TC_(addToBag)(lk->heldBy, (Word)thr);
+ break;
+ case LK_rdwr:
+ tl_assert(lk->heldBy == NULL && !lk->heldW); /* must be unheld */
+ goto case_LK_nonRec;
+ default:
+ tl_assert(0);
+ }
+ tl_assert(is_sane_LockN(lk));
+}
+
+static void lockN_acquire_reader ( Lock* lk, Thread* thr )
+{
+ tl_assert(is_sane_LockN(lk));
+ tl_assert(is_sane_Thread(thr));
+ /* can only add reader to a reader-writer lock. */
+ tl_assert(lk->kind == LK_rdwr);
+ /* lk must be free or already r-held. */
+ tl_assert(lk->heldBy == NULL
+ || (lk->heldBy != NULL && !lk->heldW));
+ if (lk->heldBy) {
+ TC_(addToBag)(lk->heldBy, (Word)thr);
+ } else {
+ lk->heldW = False;
+ lk->heldBy = TC_(newBag)( tc_zalloc, tc_free );
+ TC_(addToBag)( lk->heldBy, (Word)thr );
+ }
+ tl_assert(!lk->heldW);
+ tl_assert(is_sane_LockN(lk));
+}
+
+/* Update 'lk' to reflect a release of it by 'thr'. This is done
+ strictly: only combinations resulting from correct program and
+ libpthread behaviour are allowed. */
+
+static void lockN_release ( Lock* lk, Thread* thr )
+{
+ Bool b;
+ tl_assert(is_sane_LockN(lk));
+ tl_assert(is_sane_Thread(thr));
+ /* lock must be held by someone */
+ tl_assert(lk->heldBy);
+ /* Remove it from the holder set */
+ b = TC_(delFromBag)(lk->heldBy, (Word)thr);
+ /* thr must actually have been a holder of lk */
+ tl_assert(b);
+ /* normalise */
+ if (TC_(isEmptyBag)(lk->heldBy)) {
+ TC_(deleteBag)(lk->heldBy);
+ lk->heldBy = NULL;
+ lk->heldW = False;
+ }
+ tl_assert(is_sane_LockN(lk));
+}
+
/* --------- xxxID functions --------- */
/* Proposal (for debugging sanity):
@@ -574,15 +738,37 @@
space(d); VG_(printf)("}\n");
}
+static const HChar* show_LockKind ( LockKind lkk ) {
+ switch (lkk) {
+ case LK_mbRec: return "mbRec";
+ case LK_nonRec: return "nonRec";
+ case LK_rdwr: return "rdwr";
+ default: tl_assert(0);
+ }
+}
+
static void pp_Lock ( Int d, Lock* lk )
{
- space(d+0); VG_(printf)("Lock %p {\n", lk);
+ space(d+0); VG_(printf)("Lock %p (ga %p) {\n", lk, lk->guestaddr);
if (sHOW_ADMIN) {
- space(d+3); VG_(printf)("admin %p\n", lk->admin);
- space(d+3); VG_(printf)("magic 0x%x\n", (UInt)lk->magic);
+ space(d+3); VG_(printf)("admin %p\n", lk->admin);
+ space(d+3); VG_(printf)("magic 0x%x\n", (UInt)lk->magic);
}
- space(d+3); VG_(printf)("count %llu\n", lk->count);
- space(d+3); VG_(printf)("thr %p\n", lk->thr);
+ space(d+3); VG_(printf)("unique %llu\n", lk->unique);
+ space(d+3); VG_(printf)("kind %s\n", show_LockKind(lk->kind));
+ space(d+3); VG_(printf)("heldW %s\n", lk->heldW ? "yes" : "no");
+ space(d+3); VG_(printf)("heldBy %p", lk->heldBy);
+ if (lk->heldBy) {
+ Thread* thr;
+ Word count;
+ VG_(printf)(" { ");
+ TC_(initIterBag)( lk->heldBy );
+ while (TC_(nextIterBag)( lk->heldBy, (Word*)&thr, &count ))
+ VG_(printf)("%lu:%p ", count, thr);
+ TC_(doneIterBag)( lk->heldBy );
+ VG_(printf)("}");
+ }
+ VG_(printf)("\n");
space(d+0); VG_(printf)("}\n");
}
@@ -811,7 +997,7 @@
map_locks = TC_(newFM)( tc_zalloc, tc_free, NULL/*unboxed Word cmp*/);
tl_assert(map_locks != NULL);
- __bus_lock_Lock = mk_LockN( (Addr)&__bus_lock );
+ __bus_lock_Lock = mk_LockN( LK_nonRec, (Addr)&__bus_lock );
tl_assert(is_sane_LockN(__bus_lock_Lock));
TC_(addToFM)( map_locks, (Word)&__bus_lock, (Word)__bus_lock_Lock );
@@ -916,16 +1102,17 @@
/*----------------------------------------------------------------*/
/* Make sure there is a lock table entry for the given (lock) guest
- address. If not, create one in state UnlockedNew. In any case,
- return the address of the existing or new Lock. */
-static Lock* map_locks_lookup_or_create ( Addr ga, ThreadId tid )
+ address. If not, create one of the stated 'kind' in unheld state.
+ In any case, return the address of the existing or new Lock. */
+static
+Lock* map_locks_lookup_or_create ( LockKind lkk, Addr ga, ThreadId tid )
{
Bool found;
Lock* oldlock = NULL;
tl_assert(is_sane_ThreadId(tid));
found = TC_(lookupFM)( map_locks, NULL, (Word*)&oldlock, (Word)ga );
if (!found) {
- Lock* lock = mk_LockN(ga);
+ Lock* lock = mk_LockN(lkk, ga);
lock->appeared_at = VG_(record_ExeContext)( tid, 0 );
tl_assert(is_sane_LockN(lock));
TC_(addToFM)( map_locks, (Word)ga, (Word)lock );
@@ -1576,6 +1763,15 @@
*/
+/* Return True iff 'thr' holds 'lk' in some mode. */
+static Bool thread_is_a_holder_of_Lock ( Thread* thr, Lock* lk )
+{
+ if (lk->heldBy)
+ return TC_(elemBag)( lk->heldBy, (Word)thr ) > 0;
+ else
+ return False;
+}
+
/* Sanity check Threads, as far as possible */
static void threads__sanity_check ( Char* who )
{
@@ -1597,8 +1793,7 @@
if (!is_sane_LockN(lk)) BAD("2");
// Thread.lockset: each Lock in set is actually held by that
// thread
- if (lk->count == 0) BAD("3a"); /* lock not held! */
- if (lk->thr != thr) BAD("3b"); /* lock held by some other thread */
+ if (!thread_is_a_holder_of_Lock(thr,lk)) BAD("3");
// Thread.csegid is a valid SegmentID
if (!is_sane_SegmentID(thr->csegid)) BAD("4");
// and the associated Segment has .thr == t
@@ -1636,7 +1831,8 @@
TC_(doneIterFM)( map_locks );
// scan through admin_locks ...
for (lk = admin_locks; lk; lk = lk->admin) {
- // lock is sane
+ // lock is sane. Quite comprehensive, also checks that
+ // referenced (holder) threads are sane.
if (!is_sane_LockN(lk)) BAD("3");
// map_locks binds guest address back to this lock
if (lk != map_locks_maybe_lookup(lk->guestaddr)) BAD("4");
@@ -1645,15 +1841,23 @@
// that attempts to lock in (eg) freed memory. Detect this
// and warn about it in the pre/post-mutex-lock event handler.
if (is_SHMEM_NoAccess(shmem__read_32(lk->guestaddr))) BAD("5");
- if (lk->count > 0) {
- if (lk->thr == NULL) BAD("6a");
- if (!is_sane_Thread(lk->thr)) BAD("6");
- if (!TC_(elemWS)(univ_lsets, lk->thr->lockset, (Word)lk))
- BAD("7");
- break;
+ // look at all threads mentioned as holders of this lock. Ensure
+ // this lock is mentioned in their locksets.
+ if (lk->heldBy) {
+ Thread* thr;
+ Word count;
+ TC_(initIterBag)( lk->heldBy );
+ while (TC_(nextIterBag)( lk->heldBy, (Word*)&thr, &count )) {
+ // is_sane_LockN above ensures these
+ tl_assert(count >= 1);
+ tl_assert(is_sane_Thread(thr));
+ if (!TC_(elemWS)(univ_lsets, thr->lockset, (Word)lk))
+ BAD("7");
+ }
+ TC_(doneIterBag)( lk->heldBy );
} else {
/* lock not held by anybody */
- if (lk->thr != NULL) BAD("7a");
+ if (lk->heldW) BAD("7a"); /* should be False if !heldBy */
// since lk is unheld, then (no lockset contains lk)
// hmm, this is really too expensive to check. Hmm.
}
@@ -1823,6 +2027,8 @@
static void record_error_DestroyLocked ( Thread*, Lock* );
static void record_error_PthAPIerror ( Thread*, HChar*, Word, HChar* );
+static void record_error_Misc ( Thread*, HChar* );
+
static WordSetID add_BHL ( WordSetID lockset )
{
return TC_(addToWS)( univ_lsets, lockset, (Word)__bus_lock_Lock );
@@ -2212,6 +2418,24 @@
/*--- Address range handlers ---*/
/*----------------------------------------------------------------*/
+static void remove_Lock_from_locksets_of_all_owning_Threads( Lock* lk )
+{
+ Thread* thr;
+ if (!lk->heldBy) {
+ tl_assert(!lk->heldW);
+ return;
+ }
+ TC_(initIterBag)( lk->heldBy );
+ while (TC_(nextIterBag)( lk->heldBy, (Word*)&thr, NULL )) {
+ tl_assert(is_sane_Thread(thr));
+ tl_assert(TC_(elemWS)( univ_lsets,
+ thr->lockset, (Word)lk ));
+ thr->lockset
+ = TC_(delFromWS)( univ_lsets, thr->lockset, (Word)lk );
+ }
+ TC_(doneIterBag)( lk->heldBy );
+}
+
/* Deletion of memory containing locks:
If the range of memory to be deleted contains no locks, then this
@@ -2294,14 +2518,19 @@
if (gla < a || gla >= a+len)
continue;
locksToDelete = TC_(addToWS)( univ_lsets, locksToDelete, (Word)lk );
- if (lk->count > 0) {
- tl_assert(lk->thr);
- record_error_FreeMemLock( thr, lk );
- /* remove lock from currlocks of the owning thread */
- tl_assert(TC_(elemWS)( univ_lsets,
- lk->thr->lockset, (Word)lk ));
- lk->thr->lockset
- = TC_(delFromWS)( univ_lsets, lk->thr->lockset, (Word)lk );
+ /* If the lock is held, we must remove it from the currlock sets
+ of all threads that hold it. Also take the opportunity to
+ report an error. To report an error we need to know at least
+ one of the threads that holds it; really we should mention
+ them all, but that's too much hassle. So choose one
+ arbitrarily. */
+ if (lk->heldBy) {
+ tl_assert(!TC_(isEmptyBag)(lk->heldBy));
+ record_error_FreeMemLock( (Thread*)TC_(anyElementOfBag)(lk->heldBy),
+ lk );
+ /* remove lock from locksets of all owning threads */
+ remove_Lock_from_locksets_of_all_owning_Threads( lk );
+ /* Leave lk->heldBy in place; del_Lock below will free it up. */
}
}
TC_(doneIterFM)( map_locks );
@@ -2374,9 +2603,9 @@
}
/* and get it out of map_locks */
map_locks_delete(lk->guestaddr);
+ /* release storage (incl. associated .heldBy Bag) */
{ Lock* tmp = lk->admin;
- VG_(memset)(lk, 0xAA, sizeof(Lock));
- tc_free(lk);
+ del_LockN(lk);
lk = tmp;
}
}
@@ -2482,52 +2711,103 @@
thr->csegid = *new_segidP;
}
-static void ev__thread_acquires_lock ( Thread* thr, Addr lock_ga )
+static
+void ev__post_thread_w_acquires_lock ( Thread* thr,
+ LockKind lkk, Addr lock_ga )
{
- Lock* lock = map_locks_lookup_or_create(
- lock_ga, map_threads_reverse_lookup_SLOW(thr) );
- tl_assert( is_sane_LockN(lock) );
+ Lock* lk;
+
+ /* be paranoid w.r.t hint bits, even if lock_ga is complete
+ nonsense */
shmem__set_anyLocks( lock_ga, True );
- if (lock->count > 0) {
- /* the lock is already taken?! */
- /* perhaps this is a recursive mutex. In which case it's OK for
- the owner thread to lock it again. FIXME: how do we know
- it's a recursive one? */
- tl_assert(lock->thr != NULL);
- tl_assert(is_sane_Thread(lock->thr));
- if (lock->thr == thr /* && FIXME: is recursive */) {
- lock->count++; /* 64 bit -- wraparound implausible */
- if (0)
- VG_(printf)("XXX count is now %llu\n", lock->count);
- } else {
- /* this can't happen unless the thread library is buggy */
- VG_(message)(Vg_DebugMsg, "Thrcheck: lock already locked?!");
- tl_assert(0);
- }
- } else {
- /* Lock is not locked. Mark it as locked. */
- tl_assert(lock->thr == NULL);
- tl_assert(is_sane_Thread(thr));
- tl_assert(!TC_(elemWS)( univ_lsets, thr->lockset, (Word)lock ));
- lock->thr = thr;
- lock->count = 1;
+ tl_assert(is_sane_Thread(thr));
+ /* Try to find the lock. If we can't, then create a new one with
+ kind 'lkk'. */
+ lk = map_locks_lookup_or_create(
+ lkk, lock_ga, map_threads_reverse_lookup_SLOW(thr) );
+ tl_assert( is_sane_LockN(lk) );
+ shmem__set_anyLocks( lock_ga, True );
+
+ /* Basically what we need to do is call lockN_acquire_writer.
+ However, that will barf if any 'invalid' lock states would
+ result. Therefore check before calling. Side effect is that
+ 'is_sane_LockN(lk)' is both a pre- and post-condition of this
+ routine.
+
+ Because this routine is only called after successful lock
+ acquisition, we should not be asked to move the lock into any
+ invalid states. Requests to do so are bugs in libpthread, since
+ that should have rejected any such requests. */
+
+ if (lk->heldBy == NULL) {
+ /* the lock isn't held. Simple. */
+ tl_assert(!lk->heldW);
+ lockN_acquire_writer( lk, thr );
+ goto noerror;
}
+ /* So the lock is already held. If held as a r-lock then
+ libpthread must be buggy. */
+ tl_assert(lk->heldBy);
+ if (!lk->heldW) {
+ record_error_Misc( thr, "Bug in libpthread: write lock "
+ "acquired on lock which has read locks");
+ goto error;
+ }
+
+ /* So the lock is held in w-mode. If it's held by some other
+ thread, then libpthread must be buggy. */
+ tl_assert(TC_(sizeUniqueBag)(lk->heldBy) == 1); /* from precondition */
+
+ if (thr != (Thread*)TC_(anyElementOfBag)(lk->heldBy)) {
+ record_error_Misc( thr, "Bug in libpthread: write lock "
+ "acquired on lock which is w-locked by "
+ "a different thread");
+ goto error;
+ }
+
+ /* So the lock is already held in w-mode by 'thr'. That means this
+ is an attempt to lock it recursively, which is only allowable
+ for LK_mbRec kinded locks. Since this routine is called only
+ once the lock has been acquired, this must also be a libpthread
+ bug. */
+ if (lk->kind != LK_mbRec) {
+ record_error_Misc( thr, "Bug in libpthread: recursive w-lock "
+ "was unexpectedly allowed");
+ goto error;
+ }
+
+ /* So we are recursively re-locking a lock we already w-hold. */
+ lockN_acquire_writer( lk, thr );
+ goto noerror;
+
+ noerror:
/* update the thread's held-locks set */
- tl_assert(is_sane_LockN(lock));
- thr->lockset = TC_(addToWS)( univ_lsets, thr->lockset, (Word)lock );
+ thr->lockset = TC_(addToWS)( univ_lsets, thr->lockset, (Word)lk );
+ /* fall through */
+
+ error:
+ tl_assert(is_sane_LockN(lk));
}
-static void ev__thread_releases_lock ( Thread* thr, Addr lock_ga )
+static void ev__pre_thread_releases_lock ( Thread* thr, Addr lock_ga )
{
- Bool update_held_locks = True;
- Lock* lock = map_locks_maybe_lookup( lock_ga );
+ Lock* lock;
+ Word n;
+ /* This routine is called prior to a lock release, before
+ libpthread has had a chance to validate the call. Hence we need
+ to detect and reject any attempts to move the lock into an
+ invalid state. Such attempts are bugs in the client. */
+
/* be paranoid w.r.t hint bits, even if lock_ga is complete
nonsense */
shmem__set_anyLocks( lock_ga, True );
+ tl_assert(is_sane_Thread(thr));
+ lock = map_locks_maybe_lookup( lock_ga );
+
if (!lock) {
/* We know nothing about a lock at 'lock_ga'. Nevertheless
the client is trying to unlock it. So complain, then ignore
@@ -2536,42 +2816,64 @@
return;
}
+ tl_assert(lock->guestaddr == lock_ga);
tl_assert(is_sane_LockN(lock));
- if (lock->count > 0) {
- /* lock is locked */
- tl_assert(is_sane_Thread(lock->thr));
- if (lock->thr != thr) {
- /* We are not the lock's owner. This is a bug in the guest,
- and (per POSIX pthread rules) the unlock attempt will
- fail. So just complain and do nothing else. */
- tl_assert(!TC_(elemWS)( univ_lsets, thr->lockset, (Word)lock ));
- record_error_UnlockForeign( thr, lock->thr, lock );
- }
- else
- if (lock->count > 1 /* FIXME && lock is recursive*/) {
- /* unlocking recursively locked lock. Just dec the count. */
- tl_assert(TC_(elemWS)( univ_lsets, thr->lockset, (Word)lock ));
- lock->count--;
- update_held_locks = False;
- } else {
- /* Mark the lock as unlocked by this thread (segment) */
- tl_assert(lock->count == 1);
- tl_assert(TC_(elemWS)( univ_lsets, thr->lockset, (Word)lock ));
- lock->count = 0;
- lock->thr = NULL;
- }
- } else {
- /* Complain that lock is not held. If this happens, it
- indicates a serious bug in the guest. */
+
+ if (!lock->heldBy) {
+ /* The lock is not held. This indicates a serious bug in the
+ client. */
+ tl_assert(!lock->heldW);
record_error_UnlockUnlocked( thr, lock );
tl_assert(!TC_(elemWS)( univ_lsets, thr->lockset, (Word)lock ));
+ goto error;
}
- /* update the thread's held-locks set */
- tl_assert(is_sane_LockN(lock));
- if (update_held_locks)
+ /* The lock is held. Is this thread one of the holders? If not,
+ report a bug in the client. */
+ n = TC_(elemBag)( lock->heldBy, (Word)thr );
+ tl_assert(n >= 0);
+ if (n == 0) {
+ /* We are not a current holder of the lock. This is a bug in
+ the guest, and (per POSIX pthread rules) the unlock
+ attempt will fail. So just complain and do nothing
+ else. */
+ Thread* realOwner = (Thread*)TC_(anyElementOfBag)( lock->heldBy );
+ tl_assert(is_sane_Thread(realOwner));
+ tl_assert(realOwner != thr);
+ tl_assert(!TC_(elemWS)( univ_lsets, thr->lockset, (Word)lock ));
+ record_error_UnlockForeign( thr, realOwner, lock );
+ goto error;
+ }
+
+ /* Ok, we hold the lock 'n' times. */
+ tl_assert(n >= 1);
+
+ lockN_release( lock, thr );
+
+ n--;
+ tl_assert(n >= 0);
+
+ if (n > 0) {
+ tl_assert(lock->heldBy);
+ tl_assert(n == TC_(elemBag)( lock->heldBy, (Word)thr ));
+ /* We still hold the lock. So either it's a recursive lock
+ or a rwlock which is currently r-held. */
+ tl_assert(lock->kind == LK_mbRec
+ || (lock->kind == LK_rdwr && !lock->heldW));
+ tl_assert(TC_(elemWS)( univ_lsets, thr->lockset, (Word)lock ));
+ } else {
+ /* We no longer hold the lock. */
+ if (lock->heldBy) {
+ tl_assert(0 == TC_(elemBag)( lock->heldBy, (Word)thr ));
+ }
+ /* update this thread's lockset accordingly. */
thr->lockset
= TC_(delFromWS)( univ_lsets, thr->lockset, (Word)lock );
+ }
+ /* fall through */
+
+ error:
+ tl_assert(is_sane_LockN(lock));
}
static void ev__pre_thread_create ( ThreadId parent, ThreadId child )
@@ -2889,7 +3191,11 @@
(Int)tid, (void*)mutex );
if (sanity_flags & SCE_LOCKS)
all__sanity_check("evim__post_mutex_lock-pre");
- ev__thread_acquires_lock( map_threads_lookup(tid), (Addr)mutex );
+ ev__post_thread_w_acquires_lock(
+ map_threads_lookup(tid),
+ LK_mbRec, /* if not known, create new lock with this LockKind */
+ (Addr)mutex
+ );
if (sanity_flags & SCE_LOCKS)
all__sanity_check("evim__post_mutex_lock-post");
}
@@ -2899,7 +3205,7 @@
if (SHOW_EVENTS >= 1)
VG_(printf)("evim__post_mutex_unlock(ctid=%d, %p)\n",
(Int)tid, (void*)mutex );
- ev__thread_releases_lock( map_threads_lookup(tid), (Addr)mutex );
+ ev__pre_thread_releases_lock( map_threads_lookup(tid), (Addr)mutex );
if (sanity_flags & SCE_LOCKS)
all__sanity_check("evim__post_mutex_unlock-post");
}
@@ -3027,12 +3333,18 @@
}
static void evim__bus_lock(void) {
+ Thread* thr;
if (0) VG_(printf)("evim__bus_lock()\n");
- evim__post_mutex_lock( VG_(get_running_tid)(), &__bus_lock );
+ thr = map_threads_maybe_lookup( VG_(get_running_tid)() );
+ tl_assert(thr); /* cannot fail - Thread* must already exist */
+ ev__post_thread_w_acquires_lock( thr, LK_nonRec, (Addr)&__bus_lock );
}
static void evim__bus_unlock(void) {
+ Thread* thr;
if (0) VG_(printf)("evim__bus_unlock()\n");
- evim__post_mutex_unlock( VG_(get_running_tid)(), &__bus_lock );
+ thr = map_threads_maybe_lookup( VG_(get_running_tid)() );
+ tl_assert(thr); /* cannot fail - Thread* must already exist */
+ ev__pre_thread_releases_lock( thr, (Addr)&__bus_lock );
}
@@ -3043,12 +3355,15 @@
show where it was first locked. Intercepting lock initialisations
is not necessary for the basic operation of the race checker. */
static
-void evim__tc_PTHREAD_MUTEX_INIT_POST( ThreadId tid, void* mutex )
+void evim__tc_PTHREAD_MUTEX_INIT_POST( ThreadId tid,
+ void* mutex, Word mbRec )
{
if (SHOW_EVENTS >= 1)
- VG_(printf)("evim__tc_PTHREAD_MUTEX_INIT_POST(ctid=%d, %p)\n",
- (Int)tid, (void*)mutex );
- map_locks_lookup_or_create( (Addr)mutex, tid );
+ VG_(printf)("evim__tc_PTHREAD_MUTEX_INIT_POST(ctid=%d, mbRec=%ld, %p)\n",
+ (Int)tid, mbRec, (void*)mutex );
+ tl_assert(mbRec == 0 || mbRec == 1);
+ map_locks_lookup_or_create( mbRec ? LK_mbRec : LK_nonRec,
+ (Addr)mutex, tid );
if (sanity_flags & SCE_LOCKS)
all__sanity_check("evim__tc_PTHREAD_MUTEX_INIT_POST");
}
@@ -3069,11 +3384,17 @@
lk = map_locks_maybe_lookup( (Addr)mutex );
if (lk) {
tl_assert( is_sane_LockN(lk) );
- if (lk->count > 0) {
+ tl_assert( lk->guestaddr == (Addr)mutex );
+ if (lk->heldBy) {
+ /* Basically act like we unlocked the lock */
record_error_DestroyLocked( thr, lk );
- lk->count = 0;
- lk->thr = NULL;
+ /* remove lock from locksets of all owning threads */
+ remove_Lock_from_locksets_of_all_owning_Threads( lk );
+ TC_(deleteBag)( lk->heldBy );
+ lk->heldBy = NULL;
+ lk->heldW = False;
}
+ tl_assert( !lk->heldBy );
tl_assert( is_sane_LockN(lk) );
}
if (sanity_flags & SCE_LOCKS)
@@ -3085,6 +3406,7 @@
/* Just check the mutex is sane; nothing else to do. */
// 'mutex' may be invalid - not checked by wrapper
Thread* thr;
+ Lock* lk;
if (SHOW_EVENTS >= 1)
VG_(printf)("evim__tc_PTHREAD_MUTEX_LOCK_PRE(ctid=%d, mutex=%p)\n",
(Int)tid, (void*)mutex );
@@ -3092,7 +3414,17 @@
thr = map_threads_maybe_lookup( tid );
tl_assert(thr); /* cannot fail - Thread* must already exist */
- // error-if: we already hold mutex, but is not a recursive one
+ lk = map_locks_maybe_lookup( (Addr)mutex );
+ if ( lk
+ && (lk->kind == LK_nonRec || lk->kind == LK_rdwr)
+ && lk->heldBy
+ && lk->heldW
+ && TC_(elemBag)( lk->heldBy, (Word)thr ) > 0 ) {
+ /* uh, it's a non-recursive lock and we already w-hold it. Duh.
+ Deadlock coming up; but at least produce an error message. */
+ record_error_Misc( thr, "Attempt to re-lock a "
+ "non-recursive lock I already hold" );
+ }
}
static void evim__TC_PTHREAD_MUTEX_LOCK_POST ( ThreadId tid, void* mutex )
@@ -3106,7 +3438,11 @@
thr = map_threads_maybe_lookup( tid );
tl_assert(thr); /* cannot fail - Thread* must already exist */
- ev__thread_acquires_lock( thr, (Addr)mutex );
+ ev__post_thread_w_acquires_lock(
+ thr,
+ LK_mbRec, /* if not known, create new lock with this LockKind */
+ (Addr)mutex
+ );
}
static void evim__TC_PTHREAD_MUTEX_UNLOCK_PRE ( ThreadId tid, void* mutex )
@@ -3120,11 +3456,7 @@
thr = map_threads_maybe_lookup( tid );
tl_assert(thr); /* cannot fail - Thread* must already exist */
- // error-if: cannot find any previous record of this mutex
- // error-if: mutex is locked by some other thread
- // error-if: mutex is not locked
-
- ev__thread_releases_lock( thr, (Addr)mutex );
+ ev__pre_thread_releases_lock( thr, (Addr)mutex );
}
static void evim__tc_PTHREAD_MUTEX_UNLOCK_POST ( ThreadId tid, void* mutex )
@@ -3819,7 +4151,7 @@
lock initialisations is not necessary for the basic operation
of the race checker. */
case _VG_USERREQ__tc_PTHREAD_MUTEX_INIT_POST:
- evim__tc_PTHREAD_MUTEX_INIT_POST( tid, (void*)args[1] );
+ evim__tc_PTHREAD_MUTEX_INIT_POST( tid, (void*)args[1], args[2] );
break;
case _VG_USERREQ__TC_PTHREAD_MUTEX_DESTROY_POST:
@@ -3929,6 +4261,9 @@
*lkp = *lkn;
lkp->admin = NULL;
lkp->magic = LockP_MAGIC;
+ /* Forget about the bag of lock holders - don't copy that. */
+ lkp->heldW = False;
+ lkp->heldBy = NULL;
TC_(addToFM)( yaWFM, (Word)lkp, (Word)lkp );
}
tl_assert( is_sane_LockP(lkp) );
@@ -3955,13 +4290,14 @@
/* Error kinds */
typedef
enum {
- XE_Race=52, // race
+ XE_Race=1101, // race
XE_FreeMemLock, // freeing memory containing a locked lock
XE_UnlockUnlocked, // unlocking a not-locked lock
XE_UnlockForeign, // unlocking a lock held by some other thread
XE_UnlockBogus, // unlocking an address not known to be a lock
XE_DestroyLocked, // pth_mx_destroy on locked lock
- XE_PthAPIerror // error from the POSIX pthreads API
+ XE_PthAPIerror, // error from the POSIX pthreads API
+ XE_Misc // misc other error (w/ string to describe it)
}
XErrorTag;
@@ -4006,6 +4342,10 @@
Word err; /* pth error code */
HChar* errstr; /* persistent, in tool-arena */
} PthAPIerror;
+ struct {
+ Thread* thr;
+ HChar* errstr; /* persistent, in tool-arena */
+ } Misc;
} XE;
}
XError;
@@ -4019,13 +4359,14 @@
/* Extensions of suppressions */
typedef
enum {
- XS_Race=72, /* race */
+ XS_Race=1201, /* race */
XS_FreeMemLock,
XS_UnlockUnlocked,
XS_UnlockForeign,
XS_UnlockBogus,
XS_DestroyLocked,
- XS_PthAPIerror
+ XS_PthAPIerror,
+ XS_Misc
}
XSuppTag;
@@ -4135,6 +4476,8 @@
Word err, HChar* errstr ) {
XError xe;
tl_assert( is_sane_Thread(thr) );
+ tl_assert(fnname);
+ tl_assert(errstr);
init_XError(&xe);
xe.tag = XE_PthAPIerror;
xe.XE.PthAPIerror.thr = thr;
@@ -4146,6 +4489,19 @@
XE_PthAPIerror, 0, NULL, &xe );
}
+static void record_error_Misc ( Thread* thr, HChar* errstr ) {
+ XError xe;
+ tl_assert( is_sane_Thread(thr) );
+ tl_assert(errstr);
+ init_XError(&xe);
+ xe.tag = XE_Misc;
+ xe.XE.Misc.thr = thr;
+ xe.XE.Misc.errstr = string_table_strdup(errstr);
+ // FIXME: tid vs thr
+ VG_(maybe_record_error)( map_threads_reverse_lookup_SLOW(thr),
+ XE_Misc, 0, NULL, &xe );
+}
+
static Bool tc_eq_Error ( VgRes not_used, Error* e1, Error* e2 )
{
Char *e1s, *e2s;
@@ -4184,6 +4540,9 @@
&& 0==VG_(strcmp)(xe1->XE.PthAPIerror.fnname,
xe2->XE.PthAPIerror.fnname)
&& xe1->XE.PthAPIerror.err == xe2->XE.PthAPIerror.err;
+ case XE_Misc:
+ return xe1->XE.Misc.thr == xe2->XE.Misc.thr
+ && 0==VG_(strcmp)(xe1->XE.Misc.errstr, xe2->XE.Misc.errstr);
default:
tl_assert(0);
}
@@ -4280,13 +4639,28 @@
switch (VG_(get_error_kind)(err)) {
+ case XE_Misc: {
+ tl_assert(xe);
+ tl_assert( is_sane_Thread( xe->XE.Misc.thr ) );
+ announce_one_thread( xe->XE.Misc.thr );
+ VG_(message)(Vg_UserMsg,
+ "Thread #%d: %s",
+ (Int)xe->XE.Misc.thr->errmsg_index,
+ xe->XE.Misc.errstr);
+ VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+ break;
+ }
+
case XE_PthAPIerror: {
tl_assert(xe);
tl_assert( is_sane_Thread( xe->XE.PthAPIerror.thr ) );
+ announce_one_thread( xe->XE.PthAPIerror.thr );
VG_(message)(Vg_UserMsg,
- "Thread #%d's call to %s failed with error %ld (%s)",
+ "Thread #%d's call to %s failed",
(Int)xe->XE.PthAPIerror.thr->errmsg_index,
- xe->XE.PthAPIerror.fnname,
+ xe->XE.PthAPIerror.fnname);
+ VG_(message)(Vg_UserMsg,
+ " with error code %ld (%s)",
xe->XE.PthAPIerror.err,
xe->XE.PthAPIerror.errstr);
VG_(pp_ExeContext)( VG_(get_error_where)(err) );
@@ -4296,6 +4670,7 @@
case XE_UnlockBogus: {
tl_assert(xe);
tl_assert( is_sane_Thread( xe->XE.UnlockBogus.thr ) );
+ announce_one_thread( xe->XE.UnlockBogus.thr );
VG_(message)(Vg_UserMsg,
"Thread #%d unlocked an invalid lock at %p ",
(Int)xe->XE.UnlockBogus.thr->errmsg_index,
@@ -4502,6 +4877,7 @@
case XE_UnlockBogus: return "UnlockBogus";
case XE_DestroyLocked: return "DestroyLocked";
case XE_PthAPIerror: return "PthAPIerror";
+ case XE_Misc: return "Misc";
default: tl_assert(0); /* fill in missing case */
}
}
@@ -4520,6 +4896,7 @@
TRY("UnlockBogus", XS_UnlockBogus);
TRY("DestroyLocked", XS_DestroyLocked);
TRY("PthAPIerror", XS_PthAPIerror);
+ TRY("Misc", XS_Misc);
return False;
# undef TRY
}
@@ -4542,6 +4919,7 @@
case XS_UnlockBogus: return VG_(get_error_kind)(err) == XE_UnlockBogus;
case XS_DestroyLocked: return VG_(get_error_kind)(err) == XE_DestroyLocked;
case XS_PthAPIerror: return VG_(get_error_kind)(err) == XE_PthAPIerror;
+ case XS_Misc: return VG_(get_error_kind)(err) == XE_Misc;
//case XS_: return VG_(get_error_kind)(err) == XE_;
default: tl_assert(0); /* fill in missing cases */
}
|
|
From: <sv...@va...> - 2007-09-26 22:47:29
|
Author: sewardj
Date: 2007-09-26 23:47:29 +0100 (Wed, 26 Sep 2007)
New Revision: 6915
Log:
* very experimental support for intercepting QMutex calls in Qt 4
* handling of pthread_mutex_init: deal with recursive mutexes
Modified:
branches/THRCHECK/thrcheck/tc_intercepts.c
Modified: branches/THRCHECK/thrcheck/tc_intercepts.c
===================================================================
--- branches/THRCHECK/thrcheck/tc_intercepts.c 2007-09-26 22:45:14 UTC (rev 6914)
+++ branches/THRCHECK/thrcheck/tc_intercepts.c 2007-09-26 22:47:29 UTC (rev 6915)
@@ -44,6 +44,7 @@
#include "thrcheck.h"
#define TRACE_PTH_FNS 0
+#define TRACE_QT4_FNS 0
/*----------------------------------------------------------------*/
@@ -136,6 +137,7 @@
"for defined data type";
case EBUSY: return "EBUSY: Device or resource busy";
case ETIMEDOUT: return "ETIMEDOUT: Connection timed out";
+ case EDEADLK: return "EDEADLK: Resource deadlock would occur";
default: return "tc_intercepts.c: lame_strerror(): "
"unhandled case -- please fix me!";
}
@@ -280,24 +282,26 @@
pthread_mutexattr_t* attr)
{
int ret;
+ long mbRec;
OrigFn fn;
VALGRIND_GET_ORIG_FN(fn);
if (TRACE_PTH_FNS) {
fprintf(stderr, "<< pthread_mxinit %p", mutex); fflush(stderr);
}
-#if 0
-if (attr) {
-int ty, zzz;
-zzz = pthread_mutexattr_gettype(attr, &ty);
-if (zzz == 0 && ty == PTHREAD_MUTEX_RECURSIVE)
- fprintf(stderr, "ZZZZZ recursive!\n");
-}
-#endif
+
+ mbRec = 0;
+ if (attr) {
+ int ty, zzz;
+ zzz = pthread_mutexattr_gettype(attr, &ty);
+ if (zzz == 0 && ty == PTHREAD_MUTEX_RECURSIVE)
+ mbRec = 1;
+ }
+
CALL_FN_W_WW(ret, fn, mutex,attr);
if (ret == 0 /*success*/) {
- DO_CREQ_v_W(_VG_USERREQ__tc_PTHREAD_MUTEX_INIT_POST,
- pthread_mutex_t*,mutex);
+ DO_CREQ_v_WW(_VG_USERREQ__tc_PTHREAD_MUTEX_INIT_POST,
+ pthread_mutex_t*,mutex, long,mbRec);
} else {
DO_PthAPIerror( "pthread_mutex_init", ret );
}
@@ -590,6 +594,96 @@
}
+/*----------------------------------------------------------------*/
+/*--- ---*/
+/*----------------------------------------------------------------*/
+
+// soname is libQtCore.so.4 ; match against libQtCore.so*
+#define QT4_FUNC(ret_ty, f, args...) \
+ ret_ty I_WRAP_SONAME_FNNAME_ZZ(libQtCoreZdsoZa,f)(args); \
+ ret_ty I_WRAP_SONAME_FNNAME_ZZ(libQtCoreZdsoZa,f)(args)
+
+QT4_FUNC(void, ZuZZN6QMutex4lockEv, // _ZN6QMutex4lockEv == QMutex::lock()
+ void* self)
+{
+ OrigFn fn;
+ VALGRIND_GET_ORIG_FN(fn);
+ if (TRACE_QT4_FNS) {
+ fprintf(stderr, "<< QMutex::lock %p", self); fflush(stderr);
+ }
+
+ DO_CREQ_v_W(_VG_USERREQ__tc_PTHREAD_MUTEX_LOCK_PRE,
+ void*, self);
+
+ CALL_FN_v_W(fn, self);
+
+ DO_CREQ_v_W(_VG_USERREQ__TC_PTHREAD_MUTEX_LOCK_POST,
+ void*, self);
+
+ if (TRACE_QT4_FNS) {
+ fprintf(stderr, " :: QMutex::lock done >>\n");
+ }
+}
+
+QT4_FUNC(void, ZuZZN6QMutex6unlockEv, // _ZN6QMutex6unlockEv == QMutex::unlock()
+ void* self)
+{
+ OrigFn fn;
+ VALGRIND_GET_ORIG_FN(fn);
+
+ if (TRACE_QT4_FNS) {
+ fprintf(stderr, "<< QMutex::unlock %p", self); fflush(stderr);
+ }
+
+ DO_CREQ_v_W(_VG_USERREQ__TC_PTHREAD_MUTEX_UNLOCK_PRE,
+ void*, self);
+
+ CALL_FN_v_W(fn, self);
+
+ DO_CREQ_v_W(_VG_USERREQ__tc_PTHREAD_MUTEX_UNLOCK_POST,
+ void*, self);
+
+ if (TRACE_QT4_FNS) {
+ fprintf(stderr, " QMutex::unlock done >>\n");
+ }
+}
+
+// _ZN6QMutex7tryLockEv == bool QMutex::tryLock()
+// using 'long' to mimic C++ 'bool'
+QT4_FUNC(long, ZuZZN6QMutex7tryLockEv,
+ void* self)
+{
+ OrigFn fn;
+ long ret;
+ VALGRIND_GET_ORIG_FN(fn);
+ if (1|| TRACE_QT4_FNS) {
+ fprintf(stderr, "<< QMutex::tryLock %p", self); fflush(stderr);
+ }
+
+ DO_CREQ_v_W(_VG_USERREQ__tc_PTHREAD_MUTEX_LOCK_PRE,
+ void*, self);
+
+ CALL_FN_W_W(ret, fn, self);
+
+ // assumes that only the low 8 bits of the 'bool' are significant
+ if (ret & 0xFF) {
+ DO_CREQ_v_W(_VG_USERREQ__TC_PTHREAD_MUTEX_LOCK_POST,
+ void*, self);
+ }
+
+ if (1|| TRACE_QT4_FNS) {
+ fprintf(stderr, " :: QMutex::tryLock -> %lu >>\n", ret);
+ }
+
+ return ret;
+}
+
+/*
+bool QMutex::tryLock(int timeout) _ZN6QMutex7tryLockEi
+ _ZN6QMutex7tryLockEv
+*/
+
+
/*--------------------------------------------------------------------*/
/*--- end tc_intercepts.c ---*/
/*--------------------------------------------------------------------*/
|
|
From: <sv...@va...> - 2007-09-26 22:45:13
|
Author: sewardj
Date: 2007-09-26 23:45:14 +0100 (Wed, 26 Sep 2007)
New Revision: 6914
Log:
Use the underlying WordFM machinery to implement bags (multisets) of
(unboxed) words.
Modified:
branches/THRCHECK/thrcheck/tc_wordfm.c
branches/THRCHECK/thrcheck/tc_wordfm.h
Modified: branches/THRCHECK/thrcheck/tc_wordfm.c
===================================================================
--- branches/THRCHECK/thrcheck/tc_wordfm.c 2007-09-26 22:31:05 UTC (rev 6913)
+++ branches/THRCHECK/thrcheck/tc_wordfm.c 2007-09-26 22:45:14 UTC (rev 6914)
@@ -67,7 +67,7 @@
Word key;
Word val;
struct _AvlNode* child[2]; /* [0] is left subtree, [1] is right */
- Char balance;
+ Char balance; /* do not make this unsigned */
}
AvlNode;
@@ -496,13 +496,11 @@
return nyu;
}
-/* --- Public interface functions --- */
-
/* Initialise a WordFM. */
-void TC_(initFM) ( WordFM* fm,
- void* (*alloc_nofail)( SizeT ),
- void (*dealloc)(void*),
- Word (*kCmp)(Word,Word) )
+static void initFM ( WordFM* fm,
+ void* (*alloc_nofail)( SizeT ),
+ void (*dealloc)(void*),
+ Word (*kCmp)(Word,Word) )
{
fm->root = 0;
fm->kCmp = kCmp;
@@ -511,6 +509,8 @@
fm->stackTop = 0;
}
+/* --- Public interface functions --- */
+
/* Allocate and Initialise a WordFM. */
WordFM* TC_(newFM) ( void* (*alloc_nofail)( SizeT ),
void (*dealloc)(void*),
@@ -518,7 +518,7 @@
{
WordFM* fm = alloc_nofail(sizeof(WordFM));
tl_assert(fm);
- TC_(initFM)(fm, alloc_nofail, dealloc, kCmp);
+ initFM(fm, alloc_nofail, dealloc, kCmp);
return fm;
}
@@ -685,6 +685,145 @@
//--- Implementation ---//
//------------------------------------------------------------------//
+//------------------------------------------------------------------//
+//--- WordBag (unboxed words only) ---//
+//--- Implementation ---//
+//------------------------------------------------------------------//
+
+/* A trivial container, to make it opaque. */
+struct _WordBag {
+ WordFM* fm;
+};
+
+WordBag* TC_(newBag) ( void* (*alloc_nofail)( SizeT ),
+ void (*dealloc)(void*) )
+{
+ WordBag* bag = alloc_nofail(sizeof(WordBag));
+ bag->fm = TC_(newFM)( alloc_nofail, dealloc, NULL );
+ return bag;
+}
+
+void TC_(deleteBag) ( WordBag* bag )
+{
+ void (*dealloc)(void*) = bag->fm->dealloc;
+ TC_(deleteFM)( bag->fm, NULL, NULL );
+ VG_(memset)(bag, 0, sizeof(WordBag));
+ dealloc(bag);
+}
+
+void TC_(addToBag)( WordBag* bag, Word w )
+{
+ Word key, count;
+ if (TC_(lookupFM)(bag->fm, &key, &count, w)) {
+ tl_assert(key == w);
+ tl_assert(count >= 1);
+ TC_(addToFM)(bag->fm, w, count+1);
+ } else {
+ TC_(addToFM)(bag->fm, w, 1);
+ }
+}
+
+Word TC_(elemBag) ( WordBag* bag, Word w )
+{
+ Word key, count;
+ if (TC_(lookupFM)( bag->fm, &key, &count, w)) {
+ tl_assert(key == w);
+ tl_assert(count >= 1);
+ return count;
+ } else {
+ return 0;
+ }
+}
+
+Word TC_(sizeUniqueBag) ( WordBag* bag )
+{
+ return TC_(sizeFM)( bag->fm );
+}
+
+static Word sizeTotalBag_wrk ( AvlNode* nd )
+{
+ /* unchecked pre: nd is non-NULL */
+ Word w = nd->val;
+ tl_assert(w >= 1);
+ if (nd->child[0])
+ w += sizeTotalBag_wrk(nd->child[0]);
+ if (nd->child[1])
+ w += sizeTotalBag_wrk(nd->child[1]);
+ return w;
+}
+Word TC_(sizeTotalBag)( WordBag* bag )
+{
+ if (bag->fm->root)
+ return sizeTotalBag_wrk(bag->fm->root);
+ else
+ return 0;
+}
+
+Bool TC_(delFromBag)( WordBag* bag, Word w )
+{
+ Word key, count;
+ if (TC_(lookupFM)(bag->fm, &key, &count, w)) {
+ tl_assert(key == w);
+ tl_assert(count >= 1);
+ if (count > 1) {
+ TC_(addToFM)(bag->fm, w, count-1);
+ } else {
+ tl_assert(count == 1);
+ TC_(delFromFM)( bag->fm, NULL, w );
+ }
+ return True;
+ } else {
+ return False;
+ }
+}
+
+Bool TC_(isEmptyBag)( WordBag* bag )
+{
+ return TC_(sizeFM)(bag->fm) == 0;
+}
+
+Bool TC_(isSingletonTotalBag)( WordBag* bag )
+{
+ AvlNode* nd;
+ if (TC_(sizeFM)(bag->fm) != 1)
+ return False;
+ nd = bag->fm->root;
+ tl_assert(nd);
+ tl_assert(!nd->child[0]);
+ tl_assert(!nd->child[1]);
+ return nd->val == 1;
+}
+
+Word TC_(anyElementOfBag)( WordBag* bag )
+{
+ /* Return an arbitrarily chosen element in the bag. We might as
+ well return the one at the root of the underlying AVL tree. */
+ AvlNode* nd = bag->fm->root;
+ tl_assert(nd); /* if this fails, 'bag' is empty - caller is in error. */
+ tl_assert(nd->val >= 1);
+ return nd->key;
+}
+
+void TC_(initIterBag)( WordBag* bag )
+{
+ TC_(initIterFM)(bag->fm);
+}
+
+Bool TC_(nextIterBag)( WordBag* bag, /*OUT*/Word* pVal, /*OUT*/Word* pCount )
+{
+ return TC_(nextIterFM)( bag->fm, pVal, pCount );
+}
+
+void TC_(doneIterBag)( WordBag* bag )
+{
+ TC_(doneIterFM)( bag->fm );
+}
+
+//------------------------------------------------------------------//
+//--- end WordBag (unboxed words only) ---//
+//--- Implementation ---//
+//------------------------------------------------------------------//
+
/*--------------------------------------------------------------------*/
/*--- end tc_wordfm.c ---*/
/*--------------------------------------------------------------------*/
Modified: branches/THRCHECK/thrcheck/tc_wordfm.h
===================================================================
--- branches/THRCHECK/thrcheck/tc_wordfm.h 2007-09-26 22:31:05 UTC (rev 6913)
+++ branches/THRCHECK/thrcheck/tc_wordfm.h 2007-09-26 22:45:14 UTC (rev 6914)
@@ -59,12 +59,6 @@
typedef struct _WordFM WordFM; /* opaque */
-/* Initialise a WordFM */
-void TC_(initFM) ( WordFM* t,
- void* (*alloc_nofail)( SizeT ),
- void (*dealloc)(void*),
- Word (*kCmp)(Word,Word) );
-
/* Allocate and initialise a WordFM */
WordFM* TC_(newFM) ( void* (*alloc_nofail)( SizeT ),
void (*dealloc)(void*),
@@ -86,6 +80,7 @@
Bool TC_(lookupFM) ( WordFM* fm,
/*OUT*/Word* keyP, /*OUT*/Word* valP, Word key );
+// How many elements are there in fm?
Word TC_(sizeFM) ( WordFM* fm );
// set up FM for iteration
@@ -113,6 +108,52 @@
//--- Public interface ---//
//------------------------------------------------------------------//
+//------------------------------------------------------------------//
+//--- WordBag (unboxed words only) ---//
+//--- Public interface ---//
+//------------------------------------------------------------------//
+
+typedef struct _WordBag WordBag; /* opaque */
+
+/* Allocate and initialise a WordBag */
+WordBag* TC_(newBag) ( void* (*alloc_nofail)( SizeT ),
+ void (*dealloc)(void*) );
+
+/* Free up the Bag. */
+void TC_(deleteBag) ( WordBag* );
+
+/* Add a word. */
+void TC_(addToBag)( WordBag*, Word );
+
+/* Find out how many times the given word exists in the bag. */
+Word TC_(elemBag) ( WordBag*, Word );
+
+/* Delete a word from the bag. */
+Bool TC_(delFromBag)( WordBag*, Word );
+
+/* Is the bag empty? */
+Bool TC_(isEmptyBag)( WordBag* );
+
+/* Does the bag have exactly one element? */
+Bool TC_(isSingletonTotalBag)( WordBag* );
+
+/* Return an arbitrary element from the bag. */
+Word TC_(anyElementOfBag)( WordBag* );
+
+/* How many different / total elements are in the bag? */
+Word TC_(sizeUniqueBag)( WordBag* ); /* fast */
+Word TC_(sizeTotalBag)( WordBag* ); /* warning: slow */
+
+/* Iterating over the elements of a bag. */
+void TC_(initIterBag)( WordBag* );
+Bool TC_(nextIterBag)( WordBag*, /*OUT*/Word* pVal, /*OUT*/Word* pCount );
+void TC_(doneIterBag)( WordBag* );
+
+//------------------------------------------------------------------//
+//--- end WordBag (unboxed words only) ---//
+//--- Public interface ---//
+//------------------------------------------------------------------//
+
#endif /* ! __TC_WORDFM_H */
/*--------------------------------------------------------------------*/
|
|
From: <sv...@va...> - 2007-09-26 22:43:08
|
Author: sewardj
Date: 2007-09-26 23:43:10 +0100 (Wed, 26 Sep 2007)
New Revision: 1790
Log:
XCHG reg,mem automatically asserts LOCK# even without a LOCK prefix --
handle it correctly.
Modified:
branches/THRCHECK/priv/guest-amd64/toIR.c
branches/THRCHECK/priv/guest-x86/toIR.c
Modified: branches/THRCHECK/priv/guest-amd64/toIR.c
===================================================================
--- branches/THRCHECK/priv/guest-amd64/toIR.c 2007-09-16 11:04:24 UTC (rev 1789)
+++ branches/THRCHECK/priv/guest-amd64/toIR.c 2007-09-26 22:43:10 UTC (rev 1790)
@@ -13727,6 +13727,12 @@
/* ------------------------ XCHG ----------------------- */
+ /* XCHG reg,mem automatically asserts LOCK# even without a LOCK
+ prefix. Therefore, surround it with a IRStmt_MBE(Imbe_BusLock)
+ and IRStmt_MBE(Imbe_BusUnlock) pair. But be careful; if it is
+ used with an explicit LOCK prefix, we don't want to end up with
+ two IRStmt_MBE(Imbe_BusLock)s -- one made here and one made by
+ the generic LOCK logic at the top of disInstr. */
case 0x86: /* XCHG Gb,Eb */
sz = 1;
/* Fall through ... */
@@ -13745,6 +13751,18 @@
nameISize(sz), nameIRegG(sz, pfx, modrm),
nameIRegE(sz, pfx, modrm));
} else {
+ /* Need to add IRStmt_MBE(Imbe_BusLock). */
+ if (pfx & PFX_LOCK) {
+ /* check it's already been taken care of */
+ vassert(unlock_bus_after_insn);
+ } else {
+ vassert(!unlock_bus_after_insn);
+ stmt( IRStmt_MBE(Imbe_BusLock) );
+ unlock_bus_after_insn = True;
+ }
+ /* Because unlock_bus_after_insn is now True, generic logic
+ at the bottom of disInstr will add the
+ IRStmt_MBE(Imbe_BusUnlock). */
addr = disAMode ( &alen, pfx, delta, dis_buf, 0 );
assign( t1, loadLE(ty, mkexpr(addr)) );
assign( t2, getIRegG(sz, pfx, modrm) );
Modified: branches/THRCHECK/priv/guest-x86/toIR.c
===================================================================
--- branches/THRCHECK/priv/guest-x86/toIR.c 2007-09-16 11:04:24 UTC (rev 1789)
+++ branches/THRCHECK/priv/guest-x86/toIR.c 2007-09-26 22:43:10 UTC (rev 1790)
@@ -12306,6 +12306,12 @@
/* ------------------------ XCHG ----------------------- */
+ /* XCHG reg,mem automatically asserts LOCK# even without a LOCK
+ prefix. Therefore, surround it with a IRStmt_MBE(Imbe_BusLock)
+ and IRStmt_MBE(Imbe_BusUnlock) pair. But be careful; if it is
+ used with an explicit LOCK prefix, we don't want to end up with
+ two IRStmt_MBE(Imbe_BusLock)s -- one made here and one made by
+ the generic LOCK logic at the top of disInstr. */
case 0x86: /* XCHG Gb,Eb */
sz = 1;
/* Fall through ... */
@@ -12323,6 +12329,18 @@
nameISize(sz), nameIReg(sz,gregOfRM(modrm)),
nameIReg(sz,eregOfRM(modrm)));
} else {
+ /* Need to add IRStmt_MBE(Imbe_BusLock). */
+ if (pfx_lock) {
+ /* check it's already been taken care of */
+ vassert(unlock_bus_after_insn);
+ } else {
+ vassert(!unlock_bus_after_insn);
+ stmt( IRStmt_MBE(Imbe_BusLock) );
+ unlock_bus_after_insn = True;
+ }
+ /* Because unlock_bus_after_insn is now True, generic logic
+ at the bottom of disInstr will add the
+ IRStmt_MBE(Imbe_BusUnlock). */
addr = disAMode ( &alen, sorb, delta, dis_buf );
assign( t1, loadLE(ty,mkexpr(addr)) );
assign( t2, getIReg(sz,gregOfRM(modrm)) );
|
|
From: <sv...@va...> - 2007-09-26 22:31:06
|
Author: njn Date: 2007-09-26 23:31:05 +0100 (Wed, 26 Sep 2007) New Revision: 6913 Log: notes Modified: branches/MASSIF2/massif/ms_main.c Modified: branches/MASSIF2/massif/ms_main.c =================================================================== --- branches/MASSIF2/massif/ms_main.c 2007-09-26 09:43:23 UTC (rev 6912) +++ branches/MASSIF2/massif/ms_main.c 2007-09-26 22:31:05 UTC (rev 6913) @@ -31,14 +31,15 @@ // XXX: //--------------------------------------------------------------------------- // Todo: +// - disable --stacks, unless/until I do it fully and properly -- ie. +// track every stack alloc/dealloc -- necessary if peak-taking is to be +// accurate. Stacks stuff is hard to regtest, unfortunately. +// - do peak-taking. // - make file format more generic. Obstacles: // - unit prefixes are not generic // - preset column widths for stats are not generic // - preset column headers are not generic // - "Massif arguments:" line is not generic -// - get rid of --stacks, unless/until I do it fully and properly -- ie. -// track every stack alloc/dealloc -- necessary if peak-taking is to be -// accurate. Stacks stuff is hard to regtest, unfortunately. // - consider 'instructions executed' as a time unit -- more regular than // ms, less artificial than B // - do a graph-drawing test @@ -48,7 +49,6 @@ // - write a good basic test that shows how the tool works, suitable for // documentation // - Check MALLOCLIKE_BLOCK works, write regtest -// - work out peak-taking // - do snapshots on client requests (after peak-taking is done) // - make everything configurable, eg. min/max number of snapshots (which // also determine culling proportion), frequency of detailed snapshots, |
|
From: <js...@ac...> - 2007-09-26 13:36:31
|
Nightly build on minnie ( SuSE 10.0, ppc32 ) started at 2007-09-26 09:00:02 BST 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 == 220 tests, 10 stderr failures, 6 stdout failures, 0 posttest failures == memcheck/tests/leak-tree (stderr) memcheck/tests/leakotron (stdout) memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_changes (stderr) memcheck/tests/xml1 (stderr) none/tests/faultstatus (stderr) none/tests/fdleak_cmsg (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) none/tests/ppc32/jm-fp (stdout) none/tests/ppc32/jm-fp (stderr) none/tests/ppc32/round (stdout) none/tests/ppc32/round (stderr) none/tests/ppc32/test_fx (stdout) none/tests/ppc32/test_fx (stderr) none/tests/ppc32/test_gx (stdout) |
|
From: Dirk M. <dm...@gm...> - 2007-09-26 09:44:47
|
On Wednesday, 26. September 2007, Nicholas Nethercote wrote: > > add format argument checking. might find useful portability issues > That causes *lots* of warnings. Will you have a chance to work on fixing > them? Yes, I`ll go through them step by step and clean it up. Is there a particular urgency? If so, I can just revert the patch again. I think its still more important to have the warning in order to not introduce further issues in the future. Thanks, Dirk |
|
From: <sv...@va...> - 2007-09-26 09:43:22
|
Author: njn Date: 2007-09-26 10:43:23 +0100 (Wed, 26 Sep 2007) New Revision: 6912 Log: add notes Modified: branches/MASSIF2/massif/ms_main.c Modified: branches/MASSIF2/massif/ms_main.c =================================================================== --- branches/MASSIF2/massif/ms_main.c 2007-09-26 09:36:11 UTC (rev 6911) +++ branches/MASSIF2/massif/ms_main.c 2007-09-26 09:43:23 UTC (rev 6912) @@ -31,6 +31,16 @@ // XXX: //--------------------------------------------------------------------------- // Todo: +// - make file format more generic. Obstacles: +// - unit prefixes are not generic +// - preset column widths for stats are not generic +// - preset column headers are not generic +// - "Massif arguments:" line is not generic +// - get rid of --stacks, unless/until I do it fully and properly -- ie. +// track every stack alloc/dealloc -- necessary if peak-taking is to be +// accurate. Stacks stuff is hard to regtest, unfortunately. +// - consider 'instructions executed' as a time unit -- more regular than +// ms, less artificial than B // - do a graph-drawing test // - do tests with complicated stack traces -- big ones, ones that require // XCon_redo, ones that exceed --depth, etc. @@ -39,6 +49,7 @@ // documentation // - Check MALLOCLIKE_BLOCK works, write regtest // - work out peak-taking +// - do snapshots on client requests (after peak-taking is done) // - make everything configurable, eg. min/max number of snapshots (which // also determine culling proportion), frequency of detailed snapshots, // etc. |
|
From: <sv...@va...> - 2007-09-26 09:36:11
|
Author: njn
Date: 2007-09-26 10:36:11 +0100 (Wed, 26 Sep 2007)
New Revision: 6911
Log:
Break up a big function into 3 smaller ones.
Modified:
branches/MASSIF2/massif/ms_main.c
Modified: branches/MASSIF2/massif/ms_main.c
===================================================================
--- branches/MASSIF2/massif/ms_main.c 2007-09-25 22:05:04 UTC (rev 6910)
+++ branches/MASSIF2/massif/ms_main.c 2007-09-26 09:36:11 UTC (rev 6911)
@@ -1033,25 +1033,8 @@
return min_timespan;
}
-// Take a snapshot. Note that with bigger depths, snapshots can be slow,
-// eg. konqueror snapshots can easily take 50ms!
-// [XXX: is that still true?]
-static void take_snapshot(Char* kind)
+static Time get_time(void)
{
- // 'min_time_interval' is the minimum time interval between snapshots;
- // if we try to take a snapshot and less than this much time has passed,
- // we don't take it. Initialised to zero so that we begin by taking
- // snapshots as quickly as possible.
- static Time min_time_interval = 0;
- static Time time_of_prev_snapshot = 0;
- // Zero allows startup snapshot.
- static Time earliest_possible_time_of_next_snapshot = 0;
- static Int n_snapshots_since_last_detailed = 0;
-
- Time time, time_since_prev;
- Snapshot* snapshot;
- Int this_snapshot_i = next_snapshot_i;
-
// Get current time, in whatever time unit we're using.
if (clo_time_unit == TimeMS) {
// Some stuff happens between the millisecond timer being initialised
@@ -1067,29 +1050,29 @@
static Time start_time_ms;
if (is_first_snapshot) {
start_time_ms = VG_(read_millisecond_timer)();
- time = 0;
is_first_snapshot = False;
+ return 0;
} else {
- time = VG_(read_millisecond_timer)() - start_time_ms;
+ return VG_(read_millisecond_timer)() - start_time_ms;
}
} else if (clo_time_unit == TimeB) {
- time = total_allocs_deallocs_szB;
+ return total_allocs_deallocs_szB;
} else {
tl_assert2(0, "bad --time-unit value");
}
+}
- // Only do a snapshot if it's time.
- time_since_prev = time - time_of_prev_snapshot;
- if (time < earliest_possible_time_of_next_snapshot) {
- n_skipped_snapshots++;
- return;
- }
+// Take a snapshot. Note that with bigger depths, snapshots can be slow,
+// eg. konqueror snapshots can easily take 50ms!
+// [XXX: is that still true?]
+static void take_snapshot(Int snapshot_i, Time time, Char* kind)
+{
+ static Int n_snapshots_since_last_detailed = 0;
+ Snapshot* snapshot = &snapshots[snapshot_i];
+
// Right! We're taking a real snapshot.
n_real_snapshots++;
- snapshot = & snapshots[next_snapshot_i];
- next_snapshot_i++;
- tl_assert(!is_snapshot_in_use(snapshot));
// Heap -------------------------------------------------------------
if (clo_heap) {
@@ -1136,9 +1119,40 @@
}
if (VG_(clo_verbosity) > 1) {
- VERB_snapshot(kind, this_snapshot_i);
+ VERB_snapshot(kind, snapshot_i);
}
+}
+
+// Take a snapshot, if it's time.
+static void maybe_take_snapshot(Char* kind)
+{
+ // 'min_time_interval' is the minimum time interval between snapshots;
+ // if we try to take a snapshot and less than this much time has passed,
+ // we don't take it. Initialised to zero so that we begin by taking
+ // snapshots as quickly as possible.
+ static Time min_time_interval = 0;
+ static Time time_of_prev_snapshot = 0;
+ // Zero allows startup snapshot.
+ static Time earliest_possible_time_of_next_snapshot = 0;
+
+ Time time, time_since_prev;
+ Snapshot* snapshot;
+
+ time = get_time();
+
+ // Only do a snapshot if it's time.
+ time_since_prev = time - time_of_prev_snapshot;
+ if (time < earliest_possible_time_of_next_snapshot) {
+ n_skipped_snapshots++;
+ return;
+ }
+
+ snapshot = & snapshots[next_snapshot_i];
+ tl_assert(!is_snapshot_in_use(snapshot));
+ take_snapshot(next_snapshot_i, time, kind);
+ next_snapshot_i++;
+
// Cull the entries, if our snapshot table is full.
if (MAX_N_SNAPSHOTS == next_snapshot_i) {
min_time_interval = cull_snapshots();
@@ -1239,8 +1253,8 @@
}
VG_(HT_add_node)(malloc_list, hc);
- // Do a snapshot!
- take_snapshot(" alloc");
+ // Maybe take a snapshot.
+ maybe_take_snapshot(" alloc");
return p;
}
@@ -1272,8 +1286,8 @@
if (!custom_free)
VG_(cli_free)( p );
- // Do a snapshot!
- take_snapshot("dealloc");
+ // Maybe take a snapshot.
+ maybe_take_snapshot("dealloc");
}
static __inline__
@@ -1334,8 +1348,8 @@
// than growing it, and this way simplifies the growing case.
VG_(HT_add_node)(malloc_list, hc);
- // Do a snapshot!
- take_snapshot("realloc");
+ // Maybe take a snapshot.
+ maybe_take_snapshot("realloc");
return p_new;
}
@@ -1450,8 +1464,10 @@
static Bool is_first_SB = True;
if (is_first_SB) {
- // Do an initial sample for t = 0
- take_snapshot("startup");
+ // Do an initial sample for t = 0. We use 'maybe_take_snapshot'
+ // instead of 'take_snapshot' to get its internal static variables
+ // initialised.
+ maybe_take_snapshot("startup");
is_first_SB = False;
}
|
|
From: Bart V. A. <bar...@gm...> - 2007-09-26 06:52:34
|
In my opinion enabling gcc's format argument checking for Valgrind source code is a bad idea: Valgrind's format specifications are not identical to the ANSI C format specifications. Valgrind e.g. supports format specifications like "%,d", which are not allowed by ANSI C. For an example of code that uses this kind of format specifications, see e.g. memcheck/mc_malloc_wrappers.c. Bart. On 9/24/07, sv...@va... < sv...@va...> wrote: > > Author: dirk > Date: 2007-09-24 14:25:24 +0100 (Mon, 24 Sep 2007) > New Revision: 6909 > > Log: > add format argument checking. might find useful portability issues > > Modified: > trunk/include/pub_tool_libcprint.h > > > Modified: trunk/include/pub_tool_libcprint.h > =================================================================== > --- trunk/include/pub_tool_libcprint.h 2007-09-24 13:24:50 UTC (rev 6908) > +++ trunk/include/pub_tool_libcprint.h 2007-09-24 13:25:24 UTC (rev 6909) > > @@ -35,19 +35,26 @@ > Basic printing > ------------------------------------------------------------------ */ > > +#ifdef __GNUC__ > +# define PRINTF_CHECK(x,y) __attribute__((format(__printf__, x, y))) > +#else > +# define PRINTF_CHECK(x,y) /* x, y */ > +#endif > + > /* Note that they all output to the file descriptor given by the > * --log-fd/--log-file/--log-socket argument, which defaults to 2 > (stderr). > * Hence no need for VG_(fprintf)(). > */ > -extern UInt VG_(printf) ( const HChar *format, ... ); > + > +extern UInt VG_(printf) ( const HChar *format, ... ) PRINTF_CHECK(1,2); > extern UInt VG_(vprintf) ( const HChar *format, va_list vargs ); > /* too noisy ... __attribute__ ((format (printf, 1, 2))) ; */ > > -extern UInt VG_(sprintf) ( Char* buf, const HChar* format, ... ); > +extern UInt VG_(sprintf) ( Char* buf, const HChar* format, ... ) > PRINTF_CHECK(2,3); > extern UInt VG_(vsprintf) ( Char* buf, const HChar* format, va_list vargs > ); > > extern UInt VG_(snprintf) ( Char* buf, Int size, > - const HChar *format, ... ); > + const HChar *format, ... ) > PRINTF_CHECK(3,4); > extern UInt VG_(vsnprintf)( Char* buf, Int size, > const HChar *format, va_list vargs > ); > |
|
From: Florian K. <br...@ac...> - 2007-09-26 04:48:46
|
On Tuesday 25 September 2007 11:19 pm, Nicholas Nethercote wrote: > On Mon, 24 Sep 2007 sv...@va... wrote: > > Log: > > add format argument checking. might find useful portability issues > > That causes *lots* of warnings. Will you have a chance to work on fixing > them? > This warning: int format, UWord arg is fixed by a patch I had sent two weeks ago or so.. The other one: format argument is not a pointer .. I think you agreed to not fix that which suggests that -Wformat should probably not be enabled by default. But you could still use it occasionally and grep the build log to find the format inconsistencies that you're interested in.. Florian |
|
From: Nicholas N. <nj...@cs...> - 2007-09-26 03:19:09
|
On Mon, 24 Sep 2007 sv...@va... wrote: > Log: > add format argument checking. might find useful portability issues That causes *lots* of warnings. Will you have a chance to work on fixing them? Nick |
|
From: Tom H. <th...@cy...> - 2007-09-26 02:30:44
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2007-09-26 03:15:02 BST 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 == 256 tests, 27 stderr failures, 1 stdout failure, 0 posttest 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/match-overrun (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/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) memcheck/tests/x86/xor-undef-x86 (stderr) memcheck/tests/xml1 (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) |
|
From: Tom H. <th...@cy...> - 2007-09-26 02:26:23
|
Nightly build on dellow ( x86_64, Fedora 7 ) started at 2007-09-26 03:10:05 BST 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 == 293 tests, 4 stderr failures, 2 stdout failures, 0 posttest failures == 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) |