perftools.rb 0.5.2 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/extconf.rb +2 -4
- data/ext/src/google-perftools-1.6.tar.gz +0 -0
- data/patches/perftools-notests.patch +5 -5
- data/patches/perftools-objects.patch +11 -17
- data/patches/perftools-pprof.patch +39 -22
- data/patches/perftools.patch +0 -17
- data/perftools.rb.gemspec +1 -1
- metadata +3 -5
- data/ext/src/google-perftools-1.4.tar.gz +0 -0
- data/patches/perftools-osx-106.patch +0 -96
- data/patches/perftools-realtime.patch +0 -68
data/ext/extconf.rb
CHANGED
@@ -3,7 +3,7 @@ CWD = File.expand_path(File.dirname(__FILE__))
|
|
3
3
|
def sys(cmd)
|
4
4
|
puts " -- #{cmd}"
|
5
5
|
unless ret = xsystem(cmd)
|
6
|
-
raise "#{cmd} failed, please report to perftools@tmm1.net with pastie.org link to #{CWD}/mkmf.log and #{CWD}/src/google-perftools-1.
|
6
|
+
raise "#{cmd} failed, please report to perftools@tmm1.net with pastie.org link to #{CWD}/mkmf.log and #{CWD}/src/google-perftools-1.6/config.log"
|
7
7
|
end
|
8
8
|
ret
|
9
9
|
end
|
@@ -23,7 +23,7 @@ if RUBY_VERSION >= "1.9"
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
perftools = File.basename('google-perftools-1.
|
26
|
+
perftools = File.basename('google-perftools-1.6.tar.gz')
|
27
27
|
dir = File.basename(perftools, '.tar.gz')
|
28
28
|
|
29
29
|
puts "(I'm about to compile google-perftools.. this will definitely take a while)"
|
@@ -45,9 +45,7 @@ Dir.chdir('src') do
|
|
45
45
|
['perftools-pprof', true],
|
46
46
|
['perftools-gc', true],
|
47
47
|
['perftools-osx', RUBY_PLATFORM =~ /darwin/],
|
48
|
-
['perftools-osx-106', RUBY_PLATFORM =~ /darwin10/],
|
49
48
|
['perftools-debug', true],
|
50
|
-
['perftools-realtime', true],
|
51
49
|
['perftools-objects', true],
|
52
50
|
['perftools-frames', true]
|
53
51
|
].each do |patch, apply|
|
Binary file
|
@@ -1,14 +1,14 @@
|
|
1
1
|
diff --git a/Makefile.in b/Makefile.in
|
2
|
-
index
|
2
|
+
index b301f4d..969db5e 100644
|
3
3
|
--- a/Makefile.in
|
4
4
|
+++ b/Makefile.in
|
5
|
-
@@ -
|
6
|
-
@ENABLE_FRAME_POINTERS_TRUE@@
|
7
|
-
@ENABLE_FRAME_POINTERS_FALSE@@
|
5
|
+
@@ -65,9 +65,7 @@ host_triplet = @host@
|
6
|
+
@ENABLE_FRAME_POINTERS_TRUE@@X86_64_AND_NO_FP_BY_DEFAULT_TRUE@am__append_3 = -fno-omit-frame-pointer
|
7
|
+
@ENABLE_FRAME_POINTERS_FALSE@@X86_64_AND_NO_FP_BY_DEFAULT_TRUE@am__append_4 = -DNO_FRAME_POINTER
|
8
8
|
@MINGW_TRUE@am__append_5 = -Wl,-u__tcmalloc
|
9
9
|
-noinst_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
|
10
10
|
- $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \
|
11
|
-
- $(am__EXEEXT_7) $(am__EXEEXT_8) $(
|
11
|
+
- $(am__EXEEXT_7) $(am__EXEEXT_8) $(am__EXEEXT_23)
|
12
12
|
+noinst_PROGRAMS =
|
13
13
|
bin_PROGRAMS =
|
14
14
|
@MINGW_TRUE@am__append_6 = libwindows.la libspinlock.la
|
@@ -1,14 +1,8 @@
|
|
1
|
-
commit 5ffd87871619a750ad19e247670a0887a6d38fbd
|
2
|
-
Author: Aman Gupta <aman@tmm1.net>
|
3
|
-
Date: Sun Aug 1 18:50:38 2010 -0700
|
4
|
-
|
5
|
-
perftools-objects
|
6
|
-
|
7
1
|
diff --git a/src/profile-handler.cc b/src/profile-handler.cc
|
8
|
-
index
|
2
|
+
index 5df5054..2335617 100644
|
9
3
|
--- a/src/profile-handler.cc
|
10
4
|
+++ b/src/profile-handler.cc
|
11
|
-
@@ -
|
5
|
+
@@ -395,6 +395,8 @@ void ProfileHandler::GetState(ProfileHandlerState* state) {
|
12
6
|
}
|
13
7
|
|
14
8
|
void ProfileHandler::StartTimer() {
|
@@ -17,7 +11,7 @@ index 619b980..2ecf2c0 100644
|
|
17
11
|
struct itimerval timer;
|
18
12
|
timer.it_interval.tv_sec = 0;
|
19
13
|
timer.it_interval.tv_usec = 1000000 / frequency_;
|
20
|
-
@@ -
|
14
|
+
@@ -403,12 +405,16 @@ void ProfileHandler::StartTimer() {
|
21
15
|
}
|
22
16
|
|
23
17
|
void ProfileHandler::StopTimer() {
|
@@ -25,16 +19,16 @@ index 619b980..2ecf2c0 100644
|
|
25
19
|
+
|
26
20
|
struct itimerval timer;
|
27
21
|
memset(&timer, 0, sizeof timer);
|
28
|
-
setitimer(
|
22
|
+
setitimer(timer_type_, &timer, 0);
|
29
23
|
}
|
30
24
|
|
31
25
|
bool ProfileHandler::IsTimerRunning() {
|
32
26
|
+ if (getenv("CPUPROFILE_OBJECTS") || getenv("CPUPROFILE_METHODS")) return false;
|
33
27
|
+
|
34
28
|
struct itimerval current_timer;
|
35
|
-
RAW_CHECK(0 == getitimer(
|
29
|
+
RAW_CHECK(0 == getitimer(timer_type_, ¤t_timer), "getitimer");
|
36
30
|
return (current_timer.it_value.tv_sec != 0 ||
|
37
|
-
@@ -
|
31
|
+
@@ -416,6 +422,8 @@ bool ProfileHandler::IsTimerRunning() {
|
38
32
|
}
|
39
33
|
|
40
34
|
void ProfileHandler::EnableHandler() {
|
@@ -43,7 +37,7 @@ index 619b980..2ecf2c0 100644
|
|
43
37
|
struct sigaction sa;
|
44
38
|
sa.sa_sigaction = SignalHandler;
|
45
39
|
sa.sa_flags = SA_RESTART | SA_SIGINFO;
|
46
|
-
@@ -
|
40
|
+
@@ -425,6 +433,8 @@ void ProfileHandler::EnableHandler() {
|
47
41
|
}
|
48
42
|
|
49
43
|
void ProfileHandler::DisableHandler() {
|
@@ -53,10 +47,10 @@ index 619b980..2ecf2c0 100644
|
|
53
47
|
sa.sa_handler = SIG_IGN;
|
54
48
|
sa.sa_flags = SA_RESTART;
|
55
49
|
diff --git a/src/profiler.cc b/src/profiler.cc
|
56
|
-
index
|
50
|
+
index f408cf8..7645c45 100644
|
57
51
|
--- a/src/profiler.cc
|
58
52
|
+++ b/src/profiler.cc
|
59
|
-
@@ -
|
53
|
+
@@ -102,6 +102,10 @@ class CpuProfiler {
|
60
54
|
|
61
55
|
static CpuProfiler instance_;
|
62
56
|
|
@@ -67,7 +61,7 @@ index 37234b2..905288f 100644
|
|
67
61
|
private:
|
68
62
|
// This lock implements the locking requirements described in the ProfileData
|
69
63
|
// documentation, specifically:
|
70
|
-
@@ -
|
64
|
+
@@ -130,10 +134,6 @@ class CpuProfiler {
|
71
65
|
|
72
66
|
// Disables receiving SIGPROF interrupt.
|
73
67
|
void DisableHandler();
|
@@ -78,7 +72,7 @@ index 37234b2..905288f 100644
|
|
78
72
|
};
|
79
73
|
|
80
74
|
// Profile data structure singleton: Constructor will check to see if
|
81
|
-
@@ -
|
75
|
+
@@ -323,6 +323,10 @@ extern "C" PERFTOOLS_DLL_DECL void ProfilerFlush() {
|
82
76
|
extern "C" PERFTOOLS_DLL_DECL void ProfilerGcMark(void (*cb)(VALUE)) {
|
83
77
|
CpuProfiler::instance_.GcMark(cb);
|
84
78
|
}
|
@@ -1,8 +1,14 @@
|
|
1
|
+
commit 1828f461a3ea523b7018d03ab83850621cf66ba9
|
2
|
+
Author: Aman Gupta <aman@tmm1.net>
|
3
|
+
Date: Fri Nov 12 16:33:15 2010 -0600
|
4
|
+
|
5
|
+
perftools-pprof
|
6
|
+
|
1
7
|
diff --git a/src/pprof b/src/pprof
|
2
|
-
index
|
8
|
+
index e67e42e..b04d988 100755
|
3
9
|
--- a/src/pprof
|
4
10
|
+++ b/src/pprof
|
5
|
-
@@ -
|
11
|
+
@@ -560,7 +560,8 @@ sub Main() {
|
6
12
|
my $symbol_map = {};
|
7
13
|
|
8
14
|
# Read one profile, pick the last item on the list
|
@@ -12,36 +18,38 @@ index b5ef29a..25b956d 100755
|
|
12
18
|
my $profile = $data->{profile};
|
13
19
|
my $pcs = $data->{pcs};
|
14
20
|
my $libs = $data->{libs}; # Info about main program and shared libraries
|
15
|
-
@@ -
|
16
|
-
$symbols = ExtractSymbols($libs, $pcs);
|
17
|
-
}
|
21
|
+
@@ -589,7 +590,18 @@ sub Main() {
|
18
22
|
|
23
|
+
# Collect symbols
|
24
|
+
my $symbols;
|
25
|
+
- if ($main::use_symbolized_profile) {
|
19
26
|
+ if (-e "$fname.symbols") {
|
20
27
|
+ open(SYMBOLS, "<$fname.symbols");
|
21
28
|
+ while(<SYMBOLS>){
|
22
29
|
+ chop;
|
23
30
|
+ if (m/(.+?)\s*:\s*(.*)/){
|
24
31
|
+ $symbols->{$1}[0] = $2;
|
32
|
+
+ $symbols->{$1}[1] = "?";
|
33
|
+
+ $symbols->{$1}[2] = $2;
|
25
34
|
+ }
|
26
35
|
+ }
|
27
36
|
+ close(SYMBOLS);
|
28
|
-
+ }
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
37
|
+
+ } elsif ($main::use_symbolized_profile) {
|
38
|
+
$symbols = FetchSymbols($pcs, $symbol_map);
|
39
|
+
} elsif ($main::use_symbol_page) {
|
40
|
+
$symbols = FetchSymbols($pcs);
|
41
|
+
@@ -2425,6 +2437,10 @@ sub RemoveUninterestingFrames {
|
42
|
+
foreach my $name ('ProfileData::Add', # historical
|
43
|
+
'ProfileData::prof_handler', # historical
|
44
|
+
'CpuProfiler::prof_handler',
|
45
|
+
+ 'PerfTools::CpuProfiler.start',
|
46
|
+
+ 'Array#each',
|
47
|
+
+ 'Proc#call',
|
48
|
+
+ 'Class#new',
|
36
49
|
'__FRAME_END__',
|
37
|
-
|
38
|
-
|
39
|
-
+
|
40
|
-
+ 'Class#new',
|
41
|
-
'__pthread_sighandler',
|
42
|
-
'__restore') {
|
43
|
-
$skip{$name} = 1;
|
44
|
-
@@ -1935,6 +1936,7 @@ sub RemoveUninterestingFrames {
|
50
|
+
'__pthread_sighandler',
|
51
|
+
'__restore') {
|
52
|
+
@@ -2434,6 +2450,7 @@ sub RemoveUninterestingFrames {
|
45
53
|
# Nothing skipped for unknown types
|
46
54
|
}
|
47
55
|
|
@@ -49,7 +57,7 @@ index b5ef29a..25b956d 100755
|
|
49
57
|
if ($main::profile_type eq 'cpu') {
|
50
58
|
# If all the second-youngest program counters are the same,
|
51
59
|
# this STRONGLY suggests that it is an artifact of measurement,
|
52
|
-
@@ -
|
60
|
+
@@ -2458,6 +2475,7 @@ sub RemoveUninterestingFrames {
|
53
61
|
$profile = $result;
|
54
62
|
}
|
55
63
|
}
|
@@ -57,3 +65,12 @@ index b5ef29a..25b956d 100755
|
|
57
65
|
|
58
66
|
my $result = {};
|
59
67
|
foreach my $k (keys(%{$profile})) {
|
68
|
+
@@ -3360,7 +3378,7 @@ sub ReadCPUProfile {
|
69
|
+
# file, in which case the subtract-one was done when the file
|
70
|
+
# was written.
|
71
|
+
if ($j > 0 && !$main::use_symbolized_profile) {
|
72
|
+
- $pc--;
|
73
|
+
+ # $pc--;
|
74
|
+
}
|
75
|
+
$pc = sprintf("%0*x", $address_length, $pc);
|
76
|
+
$pcs->{$pc} = 1;
|
data/patches/perftools.patch
CHANGED
@@ -264,20 +264,3 @@ index d158eea..e8509fe 100644
|
|
264
264
|
# error Cannot calculate stack trace: will need to write for your environment
|
265
265
|
#endif
|
266
266
|
+#endif
|
267
|
-
diff --git a/src/stacktrace_with_context.cc b/src/stacktrace_with_context.cc
|
268
|
-
index ed7bfe3..a90c070 100644
|
269
|
-
--- a/src/stacktrace_with_context.cc
|
270
|
-
+++ b/src/stacktrace_with_context.cc
|
271
|
-
@@ -41,6 +41,7 @@
|
272
|
-
// may inline this code anyway. Let's hope they respect
|
273
|
-
// ATTRIBUTE_NOINLINE.
|
274
|
-
|
275
|
-
+#ifndef BUILD_FOR_RUBY
|
276
|
-
#include <config.h>
|
277
|
-
#include <google/stacktrace.h>
|
278
|
-
#include "stacktrace_config.h"
|
279
|
-
@@ -59,3 +60,4 @@ int GetStackTraceWithContext(void** result, int max_depth,
|
280
|
-
return GetStackTrace(result, max_depth, skip_count + 1);
|
281
|
-
}
|
282
|
-
#endif
|
283
|
-
+#endif
|
data/perftools.rb.gemspec
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 5
|
8
|
-
-
|
9
|
-
version: 0.5.
|
8
|
+
- 3
|
9
|
+
version: 0.5.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Aman Gupta
|
@@ -31,7 +31,7 @@ files:
|
|
31
31
|
- bin/pprof.rb
|
32
32
|
- ext/extconf.rb
|
33
33
|
- ext/perftools.c
|
34
|
-
- ext/src/google-perftools-1.
|
34
|
+
- ext/src/google-perftools-1.6.tar.gz
|
35
35
|
- objalloc_tests/Makefile
|
36
36
|
- objalloc_tests/trap.c
|
37
37
|
- patches/perftools-debug.patch
|
@@ -39,10 +39,8 @@ files:
|
|
39
39
|
- patches/perftools-gc.patch
|
40
40
|
- patches/perftools-notests.patch
|
41
41
|
- patches/perftools-objects.patch
|
42
|
-
- patches/perftools-osx-106.patch
|
43
42
|
- patches/perftools-osx.patch
|
44
43
|
- patches/perftools-pprof.patch
|
45
|
-
- patches/perftools-realtime.patch
|
46
44
|
- patches/perftools.patch
|
47
45
|
- perftools.rb.gemspec
|
48
46
|
has_rdoc: true
|
Binary file
|
@@ -1,96 +0,0 @@
|
|
1
|
-
diff --git a/Makefile.in b/Makefile.in
|
2
|
-
index c613939..1a901d5 100644
|
3
|
-
--- a/Makefile.in
|
4
|
-
diff --git a/src/base/sysinfo.cc b/src/base/sysinfo.cc
|
5
|
-
index a2bc2a9..10b8886 100644
|
6
|
-
--- a/src/base/sysinfo.cc
|
7
|
-
+++ b/src/base/sysinfo.cc
|
8
|
-
@@ -728,26 +728,59 @@ bool ProcMapsIterator::NextExt(uint64 *start, uint64 *end, char **flags,
|
9
|
-
|
10
|
-
// We start with the next load command (we've already looked at this one).
|
11
|
-
for (current_load_cmd_--; current_load_cmd_ >= 0; current_load_cmd_--) {
|
12
|
-
- const char* lc = ((const char *)hdr + sizeof(struct mach_header));
|
13
|
-
+ const char* lc;
|
14
|
-
+ uint32_t seg_marker;
|
15
|
-
+ #if defined(MH_MAGIC_64)
|
16
|
-
+ if (hdr->magic == MH_MAGIC_64) {
|
17
|
-
+ lc = ((const char *)hdr + sizeof(struct mach_header_64));
|
18
|
-
+ seg_marker = LC_SEGMENT_64;
|
19
|
-
+ } else {
|
20
|
-
+ #endif
|
21
|
-
+ lc = ((const char *)hdr + sizeof(struct mach_header));
|
22
|
-
+ seg_marker = LC_SEGMENT;
|
23
|
-
+ #if defined(MH_MAGIC_64)
|
24
|
-
+ }
|
25
|
-
+ #endif
|
26
|
-
// TODO(csilvers): make this not-quadradic (increment and hold state)
|
27
|
-
for (int j = 0; j < current_load_cmd_; j++) // advance to *our* load_cmd
|
28
|
-
lc += ((const load_command *)lc)->cmdsize;
|
29
|
-
- if (((const load_command *)lc)->cmd == LC_SEGMENT) {
|
30
|
-
+ if (((const load_command *)lc)->cmd == seg_marker) {
|
31
|
-
const intptr_t dlloff = _dyld_get_image_vmaddr_slide(current_image_);
|
32
|
-
- const segment_command* sc = (const segment_command *)lc;
|
33
|
-
- if (start) *start = sc->vmaddr + dlloff;
|
34
|
-
- if (end) *end = sc->vmaddr + sc->vmsize + dlloff;
|
35
|
-
- if (flags) *flags = kDefaultPerms; // can we do better?
|
36
|
-
- if (offset) *offset = sc->fileoff;
|
37
|
-
- if (inode) *inode = 0;
|
38
|
-
- if (filename)
|
39
|
-
- *filename = const_cast<char*>(_dyld_get_image_name(current_image_));
|
40
|
-
- if (file_mapping) *file_mapping = 0;
|
41
|
-
- if (file_pages) *file_pages = 0; // could we use sc->filesize?
|
42
|
-
- if (anon_mapping) *anon_mapping = 0;
|
43
|
-
- if (anon_pages) *anon_pages = 0;
|
44
|
-
- if (dev) *dev = 0;
|
45
|
-
- return true;
|
46
|
-
+ #if defined(MH_MAGIC_64)
|
47
|
-
+ if (hdr->magic == MH_MAGIC_64) {
|
48
|
-
+ const segment_command_64* sc = (const segment_command_64 *)lc;
|
49
|
-
+ if (start) *start = sc->vmaddr + dlloff;
|
50
|
-
+ if (end) *end = sc->vmaddr + sc->vmsize + dlloff;
|
51
|
-
+ if (flags) *flags = kDefaultPerms; // can we do better?
|
52
|
-
+ if (offset) *offset = sc->fileoff;
|
53
|
-
+ if (inode) *inode = 0;
|
54
|
-
+ if (filename)
|
55
|
-
+ *filename = const_cast<char*>(_dyld_get_image_name(current_image_));
|
56
|
-
+ if (file_mapping) *file_mapping = 0;
|
57
|
-
+ if (file_pages) *file_pages = 0; // could we use sc->filesize?
|
58
|
-
+ if (anon_mapping) *anon_mapping = 0;
|
59
|
-
+ if (anon_pages) *anon_pages = 0;
|
60
|
-
+ if (dev) *dev = 0;
|
61
|
-
+ return true;
|
62
|
-
+ } else {
|
63
|
-
+ #endif
|
64
|
-
+ const segment_command* sc = (const segment_command *)lc;
|
65
|
-
+ if (start) *start = sc->vmaddr + dlloff;
|
66
|
-
+ if (end) *end = sc->vmaddr + sc->vmsize + dlloff;
|
67
|
-
+ if (flags) *flags = kDefaultPerms; // can we do better?
|
68
|
-
+ if (offset) *offset = sc->fileoff;
|
69
|
-
+ if (inode) *inode = 0;
|
70
|
-
+ if (filename)
|
71
|
-
+ *filename = const_cast<char*>(_dyld_get_image_name(current_image_));
|
72
|
-
+ if (file_mapping) *file_mapping = 0;
|
73
|
-
+ if (file_pages) *file_pages = 0; // could we use sc->filesize?
|
74
|
-
+ if (anon_mapping) *anon_mapping = 0;
|
75
|
-
+ if (anon_pages) *anon_pages = 0;
|
76
|
-
+ if (dev) *dev = 0;
|
77
|
-
+ return true;
|
78
|
-
+ #if defined(MH_MAGIC_64)
|
79
|
-
+ }
|
80
|
-
+ #endif
|
81
|
-
}
|
82
|
-
}
|
83
|
-
// If we get here, no more load_cmd's in this image talk about
|
84
|
-
diff --git a/src/pprof b/src/pprof
|
85
|
-
index 3531300..b256ed2 100755
|
86
|
-
--- a/src/pprof
|
87
|
-
+++ b/src/pprof
|
88
|
-
@@ -3193,7 +3193,7 @@ sub ParseTextSectionHeaderFromOtool {
|
89
|
-
$sectname = $1;
|
90
|
-
} elsif ($line =~ /segname (\w+)/) {
|
91
|
-
$segname = $1;
|
92
|
-
- } elsif (!($cmd eq "LC_SEGMENT" &&
|
93
|
-
+ } elsif (!(($cmd eq "LC_SEGMENT" || $cmd eq "LC_SEGMENT_64") &&
|
94
|
-
$sectname eq "__text" &&
|
95
|
-
$segname eq "__TEXT")) {
|
96
|
-
next;
|
@@ -1,68 +0,0 @@
|
|
1
|
-
diff --git a/src/profile-handler.cc b/src/profile-handler.cc
|
2
|
-
index 370d012..619b980 100644
|
3
|
-
--- a/src/profile-handler.cc
|
4
|
-
+++ b/src/profile-handler.cc
|
5
|
-
@@ -133,6 +133,9 @@ class ProfileHandler {
|
6
|
-
// SIGPROF interrupt frequency, read-only after construction.
|
7
|
-
int32 frequency_;
|
8
|
-
|
9
|
-
+ // use SIGALRM/ITIMER_REAL
|
10
|
-
+ bool realtime_;
|
11
|
-
+
|
12
|
-
// Counts the number of callbacks registered.
|
13
|
-
int32 callback_count_ GUARDED_BY(control_lock_);
|
14
|
-
|
15
|
-
@@ -241,6 +244,13 @@ ProfileHandler::ProfileHandler()
|
16
|
-
callback_count_(0),
|
17
|
-
timer_sharing_(TIMERS_UNTOUCHED) {
|
18
|
-
SpinLockHolder cl(&control_lock_);
|
19
|
-
+
|
20
|
-
+ const char* rt = getenv("CPUPROFILE_REALTIME");
|
21
|
-
+ if (rt != NULL)
|
22
|
-
+ realtime_ = true;
|
23
|
-
+ else
|
24
|
-
+ realtime_ = false;
|
25
|
-
+
|
26
|
-
// Get frequency of interrupts (if specified)
|
27
|
-
char junk;
|
28
|
-
const char* fr = getenv("CPUPROFILE_FREQUENCY");
|
29
|
-
@@ -396,18 +406,18 @@ void ProfileHandler::StartTimer() {
|
30
|
-
timer.it_interval.tv_sec = 0;
|
31
|
-
timer.it_interval.tv_usec = 1000000 / frequency_;
|
32
|
-
timer.it_value = timer.it_interval;
|
33
|
-
- setitimer(ITIMER_PROF, &timer, 0);
|
34
|
-
+ setitimer(realtime_ ? ITIMER_REAL : ITIMER_PROF, &timer, 0);
|
35
|
-
}
|
36
|
-
|
37
|
-
void ProfileHandler::StopTimer() {
|
38
|
-
struct itimerval timer;
|
39
|
-
memset(&timer, 0, sizeof timer);
|
40
|
-
- setitimer(ITIMER_PROF, &timer, 0);
|
41
|
-
+ setitimer(realtime_ ? ITIMER_REAL : ITIMER_PROF, &timer, 0);
|
42
|
-
}
|
43
|
-
|
44
|
-
bool ProfileHandler::IsTimerRunning() {
|
45
|
-
struct itimerval current_timer;
|
46
|
-
- RAW_CHECK(0 == getitimer(ITIMER_PROF, ¤t_timer), "getitimer");
|
47
|
-
+ RAW_CHECK(0 == getitimer(realtime_ ? ITIMER_REAL : ITIMER_PROF, ¤t_timer), "getitimer");
|
48
|
-
return (current_timer.it_value.tv_sec != 0 ||
|
49
|
-
current_timer.it_value.tv_usec != 0);
|
50
|
-
}
|
51
|
-
@@ -417,7 +427,7 @@ void ProfileHandler::EnableHandler() {
|
52
|
-
sa.sa_sigaction = SignalHandler;
|
53
|
-
sa.sa_flags = SA_RESTART | SA_SIGINFO;
|
54
|
-
sigemptyset(&sa.sa_mask);
|
55
|
-
- RAW_CHECK(sigaction(SIGPROF, &sa, NULL) == 0, "sigprof (enable)");
|
56
|
-
+ RAW_CHECK(sigaction(realtime_ ? SIGALRM : SIGPROF, &sa, NULL) == 0, "sigprof (enable)");
|
57
|
-
}
|
58
|
-
|
59
|
-
void ProfileHandler::DisableHandler() {
|
60
|
-
@@ -425,7 +435,7 @@ void ProfileHandler::DisableHandler() {
|
61
|
-
sa.sa_handler = SIG_IGN;
|
62
|
-
sa.sa_flags = SA_RESTART;
|
63
|
-
sigemptyset(&sa.sa_mask);
|
64
|
-
- RAW_CHECK(sigaction(SIGPROF, &sa, NULL) == 0, "sigprof (disable)");
|
65
|
-
+ RAW_CHECK(sigaction(realtime_ ? SIGALRM : SIGPROF, &sa, NULL) == 0, "sigprof (disable)");
|
66
|
-
}
|
67
|
-
|
68
|
-
void ProfileHandler::SignalHandler(int sig, siginfo_t* sinfo, void* ucontext) {
|