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
(15) |
2
(17) |
3
(23) |
4
(13) |
5
(7) |
6
(8) |
7
(9) |
|
8
(8) |
9
(31) |
10
(31) |
11
(19) |
12
(11) |
13
(38) |
14
(14) |
|
15
(8) |
16
(11) |
17
(7) |
18
(17) |
19
(12) |
20
(12) |
21
(17) |
|
22
(19) |
23
(33) |
24
(42) |
25
(37) |
26
(23) |
27
(27) |
28
(27) |
|
29
(16) |
30
(52) |
31
(33) |
|
|
|
|
|
From: Nicholas N. <nj...@ca...> - 2004-08-06 17:06:28
|
CVS commit by nethercote:
Made cpu-feature detection simpler -- got rid of the confusing global state,
put it all into static state within a single function. Also, now the callers
of get_cpu_features() don't have to worry about whether it's been called
before.
M +58 -51 vg_to_ucode.c 1.146
--- valgrind/coregrind/vg_to_ucode.c #1.145:1.146
@@ -55,17 +55,4 @@
#define VG_CPU_VENDOR_AMD 2
-static Int cpu_vendor = VG_CPU_VENDOR_GENERIC;
-
-static const struct cpu_vendor {
- const Char *vendorstr;
- Int vendorid;
-} cpu_vendors[] = {
- { "GenuineIntel", VG_CPU_VENDOR_INTEL },
- { "AuthenticAMD", VG_CPU_VENDOR_AMD },
-};
-
-static Int cpuid_level = -2; /* -2 -> not initialized */
-static UInt cpu_features[VG_N_FEATURE_WORDS];
-
/* Standard macro to see if a specific flag is changeable */
static inline Bool flag_is_changeable(UInt flag)
@@ -96,37 +83,52 @@ static Bool has_cpuid(void)
}
-static void get_cpu_features(void)
+// Returns the CPU features, and also the vendorid. Only ever calls CPUID
+// once, and caches the necessary info in static variables for later reuse.
+static UInt* get_cpu_features(Int* cpu_vendorid_ptr)
{
Char vendorstr[13];
- Int i;
+ Int i, cpuid_level;
+ static Bool done_before = False;
+ static Int cpu_vendorid = VG_CPU_VENDOR_GENERIC;
+ static UInt cpu_features[VG_N_FEATURE_WORDS];
+ static const struct {
+ const Char *vendorstr;
+ Int vendorid;
+ } cpu_vendors[] = {
+ { "GenuineIntel", VG_CPU_VENDOR_INTEL },
+ { "AuthenticAMD", VG_CPU_VENDOR_AMD },
+ };
- if (!has_cpuid()) {
- cpuid_level = -1;
- return;
- }
+ // If we haven't already worked this stuff out...
+ if (!done_before && has_cpuid()) {
cpu_features[VG_INT_FEAT] |= (1 << (VG_X86_FEAT_CPUID%32));
- VG_(cpuid)(0, &cpuid_level, (UInt *)&vendorstr[0], (UInt *)&vendorstr[8], (UInt *)&vendorstr[4]);
+ // Get vendor string, eg. "GenuineIntel". Note characteristically
+ // stupid word order chosen by Intel.
+ VG_(cpuid)(0, &cpuid_level, (UInt *)&vendorstr[0],
+ (UInt *)&vendorstr[8],
+ (UInt *)&vendorstr[4]);
vendorstr[12] = '\0';
- for(i = 0; i < sizeof(cpu_vendors)/sizeof(*cpu_vendors); i++)
+ // Determine vendor ID
+ for (i = 0; i < sizeof(cpu_vendors)/sizeof(*cpu_vendors); i++)
if (VG_(memcmp)(vendorstr, cpu_vendors[i].vendorstr, 12) == 0) {
- cpu_vendor = cpu_vendors[i].vendorid;
+ cpu_vendorid = cpu_vendors[i].vendorid;
break;
}
+ // Determine CPU features
if (cpuid_level >= 1)
- VG_(cpuid)(1, NULL, NULL, &cpu_features[VG_EXT_FEAT], &cpu_features[VG_X86_FEAT]);
+ VG_(cpuid)(1, NULL, NULL, &cpu_features[VG_EXT_FEAT],
+ &cpu_features[VG_X86_FEAT]);
- switch(cpu_vendor) {
- case VG_CPU_VENDOR_AMD:
+ if (VG_CPU_VENDOR_AMD == cpu_vendorid) {
/* get AMD-specific flags */
VG_(cpuid)(0x80000001, NULL, NULL, NULL, &cpu_features[VG_AMD_FEAT]);
- break;
-
- default:
- break;
}
+ }
+ if (NULL != cpu_vendorid_ptr) *cpu_vendorid_ptr = cpu_vendorid;
+ return cpu_features;
}
@@ -135,11 +137,11 @@ Bool VG_(cpu_has_feature)(UInt feature)
UInt word = feature / 32;
UInt bit = feature % 32;
-
- if (cpuid_level == -2)
- get_cpu_features();
+ UInt* cpu_features;
vg_assert(word >= 0 && word < VG_N_FEATURE_WORDS);
- return !!(cpu_features[word] & (1 << bit));
+ cpu_features = get_cpu_features(NULL);
+
+ return !!( cpu_features[word] & (1 << bit) );
}
@@ -230,10 +232,15 @@ Bool VG_(cpu_has_feature)(UInt feature)
vendor-specific parts of CPUID.
*/
-void VG_(helperc_CPUID)(UInt op, UInt *eax_ret, UInt *ebx_ret, UInt *ecx_ret, UInt *edx_ret)
+void VG_(helperc_CPUID)(UInt op, UInt *eax_ret, UInt *ebx_ret,
+ UInt *ecx_ret, UInt *edx_ret)
{
UInt eax, ebx, ecx, edx;
+ Int cpu_vendorid;
- if (cpuid_level == -2)
- get_cpu_features(); /* for cpu_vendor */
+ // This function should not be called unless the CPU has CPUID.
+ vg_assert( VG_(cpu_has_feature)(VG_X86_FEAT_CPUID) );
+
+ // Get vendor ID.
+ get_cpu_features( &cpu_vendorid );
VG_(cpuid)(op, &eax, &ebx, &ecx, &edx);
@@ -258,5 +265,5 @@ void VG_(helperc_CPUID)(UInt op, UInt *e
/* Vendor-specific mangling of the results */
- switch(cpu_vendor) {
+ switch (cpu_vendorid) {
case VG_CPU_VENDOR_INTEL:
switch(op) {
|
|
From: Nicholas N. <nj...@ca...> - 2004-08-06 12:38:21
|
Greetings, A lot of my recent commits have been aimed at simplifying and compacting Valgrind's code. Some of this has been simple cleaning and refactoring, eg. my clean-up of all the cruft that had accumulated in vg_include.h. Other parts required a bit more insight into how things worked, eg. my changes to the way memory is allocated. That's all well and good, but there's one part of Valgrind that worries me more than any other in this respect -- the unholy triumvirate of vg_scheduler.c, vg_signals.c and vg_proxylwp.c. In my opinion, they form the most complex part of Valgrind, the part that has the most bugs, the part that requires the most maintenance in the face of changes to things outside Valgrind, such as glibc and distro quirks. They also represent some of the worst software engineering aspects, in that they are highly coupled and have fairly low cohesion. They also happen to be the part of Valgrind that I understand least, althought that's beside the point. I've been looking at them (and to a lesser extent, their part-time accomplices vg_libpthread.c and vg_syscalls.c) a bit, in an attempt to find ways to make them smaller, simpler, and/or less coupled. I haven't had much luck. A large part of the problem is that this stuff -- threads, signals and blocking syscalls -- is just really complicated; it's unavoidable that the code dealing with these aspects is going to be nasty in places. But I still think there must be room for improvement. I've certainly been able to improve some other areas, but this part defeated me because it's too big and tangled. For example, my starting point for the allocation improvements was the call-graph for the involved functions; the call-graph for the threads/signals/etc stuff was too big and painful to work out by hand. (BTW, does anyone know any good call-graph drawing programs? I couldn't find any that worked on my machine.) One critical factor is that all these files spend a lot of time fiddling about with the ThreadState of different threads. ThreadState is a huge, ugly data structure. Large parts of it are unavoidable -- every thread must have a stack, an alt-stack, a clean-up stack, TLS, a sigmask, an ldt, saved reg state, etc -- that's just a consequence of threads being complex in general. But I wonder if other parts could be removed or simplified in some way? Or if fewer pieces of code could be made to touch this structure? Too many pieces of code just jump in and fiddle about with it. Another factor is that the proxyLWP stuff, while undoubtedly very clever, duplicates a lot of the code in vg_signals.c and vg_scheduler.c. Well, not quite duplicates, but does stuff that is annoyingly similar. Perhaps this situation could be improved? And it's pretty complicated in many ways too; just look at do_pthread_syscall() and the reason for its existence. Yuk. The current work being done on architecture ports should help clean up and factor out a lot of the stuff on that front. I'm fairly confident architecture abstraction can be done cleanly and without disturbing things too much. Our experience with vg_to_ucode.c and vg_from_ucode.c have shown that the processor stuff, although reasonably complicated, is sufficiently self-contained and unchanging that it doesn't cause many problems. Once it's correct, it tends to stay correct. In comparison, I'm not so confident about the OS ports side, because that stuff has three nasty properties: it's complicated, not neatly contained, and it does change. (This brings to mind fine words from Julian, which I paraphrase: "contained complexity is ok; distributed complexity is death".) It also concerns me every time some obscure bug gets fixed, and the patch adds another 50, 100, or 200 lines of code to Valgrind. Valgrind grows mostly by evolving, like any other open-source project. I like to cut some clean paths through the accreted jungle with a machete. This message has a couple of aims: - to provoke ideas/discussion about specific improvements to the current vg_scheduler.c/vg_signals.c/vg_proxylwp.c mess; - to provoke more general, long-term ideas/discussion about modularity, complexity, etc. I'm not meaning to criticise anyone or their code. I'm not really interested in hearing explanations about why a particular piece of code works the way it is, eg. "feature X is required because of Y and Z", unless they somehow feed into the next point... I am interested in hearing ideas about how things can be improved, eg. "A and B have a lot in common, if we factor the commonality out it will cut 100 lines of code and make C easier to understand", or "I noticed that we no longer need D since we changed E", or "merging F and G means that we can convert H from a global function into a local one", or higher-level things. Ideas are welcome; let 'em rip. N |
|
From: <js...@ac...> - 2004-08-06 02:58:44
|
Nightly build on nemesis ( SuSE 9.1 ) started at 2004-08-06 03:50:00 BST Checking out source tree ... done Configuring ... done Building ... done Running regression tests ... done Last 20 lines of log.verbose follow sem: valgrind ./sem semlimit: valgrind ./semlimit sha1_test: valgrind ./sha1_test shortpush: valgrind ./shortpush shorts: valgrind ./shorts smc1: valgrind ./smc1 susphello: valgrind ./susphello syscall-restart1: valgrind ./syscall-restart1 syscall-restart2: valgrind ./syscall-restart2 system: valgrind ./system yield: valgrind ./yield -- Finished tests in none/tests ---------------------------------------- == 169 tests, 4 stderr failures, 0 stdout failures ================= corecheck/tests/as_mmap (stderr) corecheck/tests/fdleak_fcntl (stderr) memcheck/tests/writev (stderr) memcheck/tests/zeropage (stderr) make: *** [regtest] Error 1 |
|
From: Tom H. <to...@co...> - 2004-08-06 02:25:07
|
Nightly build on dunsmere ( Fedora Core 2 ) started at 2004-08-06 03:20:01 BST Checking out source tree ... done Configuring ... done Building ... done Running regression tests ... done Last 20 lines of log.verbose follow shorts: valgrind ./shorts smc1: valgrind ./smc1 susphello: valgrind ./susphello syscall-restart1: valgrind ./syscall-restart1 syscall-restart2: valgrind ./syscall-restart2 system: valgrind ./system yield: valgrind ./yield -- Finished tests in none/tests ---------------------------------------- == 174 tests, 7 stderr failures, 1 stdout failure ================= corecheck/tests/fdleak_cmsg (stderr) corecheck/tests/fdleak_fcntl (stderr) corecheck/tests/fdleak_ipv4 (stderr) corecheck/tests/fdleak_socketpair (stderr) memcheck/tests/buflen_check (stderr) memcheck/tests/execve (stderr) memcheck/tests/writev (stderr) none/tests/exec-sigmask (stdout) make: *** [regtest] Error 1 |
|
From: Tom H. <th...@cy...> - 2004-08-06 02:20:05
|
Nightly build on audi ( Red Hat 9 ) started at 2004-08-06 03:15:02 BST Checking out source tree ... done Configuring ... done Building ... done Running regression tests ... done Last 20 lines of log.verbose follow shortpush: valgrind ./shortpush shorts: valgrind ./shorts smc1: valgrind ./smc1 susphello: valgrind ./susphello syscall-restart1: valgrind ./syscall-restart1 syscall-restart2: valgrind ./syscall-restart2 system: valgrind ./system yield: valgrind ./yield -- Finished tests in none/tests ---------------------------------------- == 174 tests, 7 stderr failures, 0 stdout failures ================= corecheck/tests/fdleak_cmsg (stderr) corecheck/tests/fdleak_fcntl (stderr) corecheck/tests/fdleak_ipv4 (stderr) corecheck/tests/fdleak_socketpair (stderr) memcheck/tests/buflen_check (stderr) memcheck/tests/execve (stderr) memcheck/tests/writev (stderr) make: *** [regtest] Error 1 |
|
From: Tom H. <th...@cy...> - 2004-08-06 02:13:18
|
Nightly build on ginetta ( Red Hat 8.0 ) started at 2004-08-06 03:10:02 BST Checking out source tree ... done Configuring ... done Building ... done Running regression tests ... done Last 20 lines of log.verbose follow seg_override: valgrind ./seg_override sem: valgrind ./sem semlimit: valgrind ./semlimit sha1_test: valgrind ./sha1_test shortpush: valgrind ./shortpush shorts: valgrind ./shorts smc1: valgrind ./smc1 susphello: valgrind ./susphello syscall-restart1: valgrind ./syscall-restart1 syscall-restart2: valgrind ./syscall-restart2 system: valgrind ./system yield: valgrind ./yield -- Finished tests in none/tests ---------------------------------------- == 174 tests, 3 stderr failures, 0 stdout failures ================= helgrind/tests/race (stderr) helgrind/tests/race2 (stderr) memcheck/tests/writev (stderr) make: *** [regtest] Error 1 |
|
From: Tom H. <th...@cy...> - 2004-08-06 02:08:15
|
Nightly build on alvis ( Red Hat 7.3 ) started at 2004-08-06 03:05:01 BST Checking out source tree ... done Configuring ... done Building ... done Running regression tests ... done Last 20 lines of log.verbose follow susphello: valgrind ./susphello syscall-restart1: valgrind ./syscall-restart1 syscall-restart2: valgrind ./syscall-restart2 system: valgrind ./system yield: valgrind ./yield -- Finished tests in none/tests ---------------------------------------- == 174 tests, 9 stderr failures, 1 stdout failure ================= addrcheck/tests/toobig-allocs (stderr) helgrind/tests/deadlock (stderr) helgrind/tests/race (stderr) helgrind/tests/race2 (stderr) memcheck/tests/badjump (stderr) memcheck/tests/brk (stderr) memcheck/tests/error_counts (stdout) memcheck/tests/new_nothrow (stderr) memcheck/tests/toobig-allocs (stderr) memcheck/tests/writev (stderr) make: *** [regtest] Error 1 |
|
From: Tom H. <th...@cy...> - 2004-08-06 02:06:48
|
Nightly build on standard ( Red Hat 7.2 ) started at 2004-08-06 03:00:02 BST Checking out source tree ... done Configuring ... done Building ... done Running regression tests ... done Last 20 lines of log.verbose follow rcrl: valgrind ./rcrl readline1: valgrind ./readline1 resolv: valgrind ./resolv rlimit_nofile: valgrind ./rlimit_nofile seg_override: valgrind ./seg_override sem: valgrind ./sem semlimit: valgrind ./semlimit sha1_test: valgrind ./sha1_test shortpush: valgrind ./shortpush shorts: valgrind ./shorts smc1: valgrind ./smc1 susphello: valgrind ./susphello syscall-restart1: valgrind ./syscall-restart1 syscall-restart2: valgrind ./syscall-restart2 system: valgrind ./system yield: valgrind ./yield -- Finished tests in none/tests ---------------------------------------- == 174 tests, 0 stderr failures, 0 stdout failures ================= |