perftools.rb 0.3.6 → 0.3.7

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -21,6 +21,14 @@ google-perftools for ruby code
21
21
 
22
22
  $ CPUPROFILE=/tmp/my_app_profile RUBYOPT="-r`gem which perftools | tail -1`" ruby my_app.rb
23
23
 
24
+ Change the sampling interval (defaults to 100 times a second, valid range is 1-4000):
25
+
26
+ $ CPUPROFILE_FREQUENCY=500 ruby my_app.rb
27
+
28
+ Use walltime instead of cputime profiling:
29
+
30
+ $ CPUPROFILE_REALTIME=1 ruby my_app.rb
31
+
24
32
 
25
33
  === Reporting
26
34
 
data/ext/extconf.rb CHANGED
@@ -45,7 +45,8 @@ Dir.chdir('src') do
45
45
  ['perftools-gc', true],
46
46
  ['perftools-osx', RUBY_PLATFORM =~ /darwin/],
47
47
  ['perftools-osx-106', RUBY_PLATFORM =~ /darwin10/],
48
- ['perftools-debug', true]
48
+ ['perftools-debug', true],
49
+ ['perftools-realtime', true]
49
50
  ].each do |patch, apply|
50
51
  if apply
51
52
  sys("patch -p1 < ../../../patches/#{patch}.patch")
data/ext/perftools.c CHANGED
@@ -54,7 +54,7 @@ static VALUE I__send__;
54
54
  */
55
55
 
56
56
  for (; frame && (n = frame->node); frame = frame->prev) {
57
- if (frame->prev && frame->prev->last_func) {
57
+ if (frame->prev > 0xff && frame->prev->last_func) {
58
58
  if (frame->prev->node == n) {
59
59
  if (frame->prev->last_func == frame->last_func) continue;
60
60
  }
@@ -0,0 +1,68 @@
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, &current_timer), "getitimer");
47
+ + RAW_CHECK(0 == getitimer(realtime_ ? ITIMER_REAL : ITIMER_PROF, &current_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) {
@@ -1,9 +1,3 @@
1
- commit 4ba520684b8171488971ba2039730122a0bc7faf
2
- Author: Aman Gupta <aman@tmm1.net>
3
- Date: Mon Oct 26 16:10:31 2009 -0700
4
-
5
- perftools
6
-
7
1
  diff --git a/Makefile.in b/Makefile.in
8
2
  index 232d2ec..566d77c 100644
9
3
  --- a/Makefile.in
data/perftools.rb.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'perftools.rb'
3
- s.version = '0.3.6'
4
- s.date = '2009-10-26'
3
+ s.version = '0.3.7'
4
+ s.date = '2009-11-03'
5
5
  s.rubyforge_project = 'perftools-rb'
6
6
  s.summary = 'google-perftools for ruby code'
7
7
  s.description = 'A sampling profiler for ruby code based on patches to google-perftools'
@@ -28,6 +28,7 @@ spec = Gem::Specification.new do |s|
28
28
  "patches/perftools-osx-106.patch",
29
29
  "patches/perftools-osx.patch",
30
30
  "patches/perftools-pprof.patch",
31
+ "patches/perftools-realtime.patch",
31
32
  "patches/perftools-notests.patch",
32
33
  "patches/perftools.patch",
33
34
  "perftools.rb.gemspec"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: perftools.rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aman Gupta
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-26 00:00:00 -07:00
12
+ date: 2009-11-03 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -32,6 +32,7 @@ files:
32
32
  - patches/perftools-osx-106.patch
33
33
  - patches/perftools-osx.patch
34
34
  - patches/perftools-pprof.patch
35
+ - patches/perftools-realtime.patch
35
36
  - patches/perftools-notests.patch
36
37
  - patches/perftools.patch
37
38
  - perftools.rb.gemspec