perftools.rb 0.4.4 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/ext/perftools.c +24 -21
  2. data/perftools.rb.gemspec +2 -2
  3. metadata +5 -17
@@ -1,3 +1,10 @@
1
+ #ifndef _GNU_SOURCE
2
+ #define _GNU_SOURCE
3
+ #endif
4
+ #ifndef _XOPEN_SOURCE
5
+ #define _XOPEN_SOURCE 600
6
+ #endif
7
+
1
8
  #include <assert.h>
2
9
  #include <ruby.h>
3
10
 
@@ -261,13 +268,6 @@ cpuprofiler_gc_mark()
261
268
 
262
269
  /* ObjProfiler */
263
270
 
264
- #ifndef _GNU_SOURCE
265
- #define _GNU_SOURCE
266
- #endif
267
- #ifndef _XOPEN_SOURCE
268
- #define _XOPEN_SOURCE 600
269
- #endif
270
-
271
271
  #include <assert.h>
272
272
  #include <ucontext.h>
273
273
  #include <unistd.h>
@@ -281,7 +281,7 @@ static VALUE bObjProfilerRunning;
281
281
  #define NUM_ORIG_BYTES 2
282
282
 
283
283
  struct {
284
- void *location;
284
+ char *location;
285
285
  unsigned char value;
286
286
  } orig_bytes[NUM_ORIG_BYTES];
287
287
 
@@ -292,14 +292,11 @@ page_align(void *addr) {
292
292
  }
293
293
 
294
294
  static void
295
- copy_instructions(void *dest, void *src, size_t count) {
296
- assert(dest != NULL);
297
- assert(src != NULL);
298
-
299
- void *aligned_addr = page_align(dest);
300
- if (mprotect(aligned_addr, (dest - aligned_addr) + count, PROT_READ|PROT_WRITE|PROT_EXEC) != 0)
295
+ unprotect_page(void *addr) {
296
+ assert(addr != NULL);
297
+ void *aligned_addr = page_align(addr);
298
+ if (mprotect(aligned_addr, (addr - aligned_addr), PROT_READ|PROT_WRITE|PROT_EXEC) != 0)
301
299
  perror("mprotect");
302
- memcpy(dest, src, count);
303
300
  }
304
301
 
305
302
  static inline void**
@@ -309,7 +306,11 @@ uc_get_ip(ucontext_t *uc) {
309
306
  #elif defined(__dietlibc__)
310
307
  return (void**)&uc->uc_mcontext.rip;
311
308
  #elif defined(__APPLE__)
312
- return (void**)&uc->uc_mcontext->__ss.__rip;
309
+ #if defined(__LP64__)
310
+ return (void**)&uc->uc_mcontext->__ss.__rip;
311
+ #else
312
+ return (void**)&uc->uc_mcontext->__ss.__eip;
313
+ #endif
313
314
  #else
314
315
  return (void**)&uc->uc_mcontext.gregs[REG_RIP];
315
316
  #endif
@@ -326,10 +327,10 @@ trap_handler(int sig, siginfo_t *info, void *data) {
326
327
  for (i=0; i<NUM_ORIG_BYTES; i++) {
327
328
  if (orig_bytes[i].location == *ip-1) {
328
329
  // restore original byte
329
- copy_instructions(orig_bytes[i].location, &orig_bytes[i].value, 1);
330
+ orig_bytes[i].location[0] = orig_bytes[i].value;
330
331
 
331
332
  // setup next breakpoint
332
- copy_instructions(orig_bytes[(i+1)%NUM_ORIG_BYTES].location, "\xCC", 1);
333
+ orig_bytes[(i+1)%NUM_ORIG_BYTES].location[0] = '\xCC';
333
334
 
334
335
  // first breakpoint is the notification
335
336
  if (i == 0)
@@ -354,10 +355,12 @@ objprofiler_setup()
354
355
  sigemptyset(&sig.sa_mask);
355
356
  sigaction(SIGTRAP, &sig, NULL);
356
357
 
358
+ unprotect_page(rb_newobj);
359
+
357
360
  for (i=0; i<NUM_ORIG_BYTES; i++) {
358
- orig_bytes[i].location = rb_newobj + i;
361
+ orig_bytes[i].location = (char *)(rb_newobj + i);
359
362
  orig_bytes[i].value = ((unsigned char*)rb_newobj)[i];
360
- copy_instructions(rb_newobj + i, "\xCC", 1);
363
+ orig_bytes[i].location[0] = '\xCC';
361
364
  }
362
365
 
363
366
  // setenv("CPUPROFILE_OBJECTS", "1", 1);
@@ -377,7 +380,7 @@ objprofiler_teardown()
377
380
  sigaction(SIGTRAP, &sig, NULL);
378
381
 
379
382
  for (i=0; i<NUM_ORIG_BYTES; i++) {
380
- copy_instructions(orig_bytes[i].location, &orig_bytes[i].value, 1);
383
+ orig_bytes[i].location[0] = orig_bytes[i].value;
381
384
  }
382
385
 
383
386
  // unsetenv("CPUPROFILE_OBJECTS");
@@ -1,7 +1,7 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'perftools.rb'
3
- s.version = '0.4.4'
4
- s.date = '2010-08-01'
3
+ s.version = '0.4.5'
4
+ s.date = '2010-08-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'
metadata CHANGED
@@ -1,13 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: perftools.rb
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 4
9
- - 4
10
- version: 0.4.4
4
+ version: 0.4.5
11
5
  platform: ruby
12
6
  authors:
13
7
  - Aman Gupta
@@ -15,7 +9,7 @@ autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
11
 
18
- date: 2010-08-01 00:00:00 -07:00
12
+ date: 2010-08-03 00:00:00 -07:00
19
13
  default_executable:
20
14
  dependencies: []
21
15
 
@@ -55,27 +49,21 @@ rdoc_options: []
55
49
  require_paths:
56
50
  - lib
57
51
  required_ruby_version: !ruby/object:Gem::Requirement
58
- none: false
59
52
  requirements:
60
53
  - - ">="
61
54
  - !ruby/object:Gem::Version
62
- hash: 3
63
- segments:
64
- - 0
65
55
  version: "0"
56
+ version:
66
57
  required_rubygems_version: !ruby/object:Gem::Requirement
67
- none: false
68
58
  requirements:
69
59
  - - ">="
70
60
  - !ruby/object:Gem::Version
71
- hash: 3
72
- segments:
73
- - 0
74
61
  version: "0"
62
+ version:
75
63
  requirements: []
76
64
 
77
65
  rubyforge_project: perftools-rb
78
- rubygems_version: 1.3.7
66
+ rubygems_version: 1.3.5
79
67
  signing_key:
80
68
  specification_version: 3
81
69
  summary: google-perftools for ruby code