gvltools 0.1.0 → 0.2.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +2 -1
- data/ext/gvltools/extconf.rb +4 -1
- data/ext/gvltools/instrumentation.c +16 -14
- data/lib/gvltools/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed2a6e0154120c8b048e3b92db8e6f6c4a87d2b653b105b90a06a171ca61895b
|
4
|
+
data.tar.gz: a976aab0ebf0da04af47d53587c144b7e89eeeef8f078c5b115d037db0fe3f6b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: baca86f153a68a90ca36213775bd22d5263325e98fdf3cd3332c4b3db953014c7c9a8e14c9ddee27ad0b19de5300065fd77d79d795d7ad8f931d45838f797921
|
7
|
+
data.tar.gz: be738a183964c4b6e0ef4f9ff5b9aac5e1a9b983d3fffe38034a338416260dc8be5fd95fcc23fe35697c2cc9d79ab8b1e8689deb3907e07468fe8e9985247911
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/ext/gvltools/extconf.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "mkmf"
|
4
|
-
if RUBY_ENGINE == "ruby" &&
|
4
|
+
if RUBY_ENGINE == "ruby" &&
|
5
|
+
have_header("stdatomic.h") &&
|
6
|
+
have_func("rb_internal_thread_add_event_hook", ["ruby/thread.h"])
|
7
|
+
|
5
8
|
$CFLAGS << " -O3 -Wall "
|
6
9
|
create_makefile("gvltools/instrumentation")
|
7
10
|
else
|
@@ -1,7 +1,9 @@
|
|
1
1
|
#include <time.h>
|
2
2
|
#include <ruby.h>
|
3
3
|
#include <ruby/thread.h>
|
4
|
-
#include <
|
4
|
+
#include <stdatomic.h>
|
5
|
+
|
6
|
+
typedef unsigned long long counter_t;
|
5
7
|
|
6
8
|
// Metrics
|
7
9
|
static rb_internal_thread_event_hook_t *gt_hook = NULL;
|
@@ -31,8 +33,8 @@ static inline void gt_gettime(struct timespec *time) {
|
|
31
33
|
}
|
32
34
|
}
|
33
35
|
|
34
|
-
static inline
|
35
|
-
|
36
|
+
static inline counter_t gt_time_diff_ns(struct timespec before, struct timespec after) {
|
37
|
+
counter_t total = 0;
|
36
38
|
total += (after.tv_nsec - before.tv_nsec);
|
37
39
|
total += (after.tv_sec - before.tv_sec) * SECONDS_TO_NANOSECONDS;
|
38
40
|
return total;
|
@@ -67,16 +69,16 @@ static VALUE gt_disable_metric(VALUE module, VALUE metric) {
|
|
67
69
|
}
|
68
70
|
|
69
71
|
// GVLTools::LocalTimer and GVLTools::GlobalTimer
|
70
|
-
static
|
71
|
-
static THREAD_LOCAL_SPECIFIER
|
72
|
+
static _Atomic counter_t global_timer_total = 0;
|
73
|
+
static THREAD_LOCAL_SPECIFIER counter_t local_timer_total = 0;
|
72
74
|
static THREAD_LOCAL_SPECIFIER struct timespec timer_ready_at = {0};
|
73
75
|
|
74
76
|
static VALUE global_timer_monotonic_time(VALUE module) {
|
75
|
-
return
|
77
|
+
return ULL2NUM(global_timer_total);
|
76
78
|
}
|
77
79
|
|
78
80
|
static VALUE global_timer_reset(VALUE module) {
|
79
|
-
|
81
|
+
global_timer_total = 0;
|
80
82
|
return Qtrue;
|
81
83
|
}
|
82
84
|
|
@@ -90,14 +92,14 @@ static VALUE local_timer_reset(VALUE module) {
|
|
90
92
|
}
|
91
93
|
|
92
94
|
// Thread counts
|
93
|
-
static
|
95
|
+
static _Atomic counter_t waiting_threads_total = 0;
|
94
96
|
|
95
97
|
static VALUE waiting_threads_count(VALUE module) {
|
96
|
-
return
|
98
|
+
return ULL2NUM(waiting_threads_total);
|
97
99
|
}
|
98
100
|
|
99
101
|
static VALUE waiting_threads_reset(VALUE module) {
|
100
|
-
|
102
|
+
waiting_threads_total = 0;
|
101
103
|
return Qtrue;
|
102
104
|
}
|
103
105
|
|
@@ -120,7 +122,7 @@ static void gt_thread_callback(rb_event_flag_t event, const rb_internal_thread_e
|
|
120
122
|
if (!was_ready) was_ready = true;
|
121
123
|
|
122
124
|
if (ENABLED(WAITING_THREADS)) {
|
123
|
-
|
125
|
+
waiting_threads_total++;
|
124
126
|
}
|
125
127
|
|
126
128
|
if (ENABLED(TIMER_GLOBAL | TIMER_LOCAL)) {
|
@@ -132,20 +134,20 @@ static void gt_thread_callback(rb_event_flag_t event, const rb_internal_thread_e
|
|
132
134
|
if (!was_ready) break; // In case we registered the hook while some threads were already waiting on the GVL
|
133
135
|
|
134
136
|
if (ENABLED(WAITING_THREADS)) {
|
135
|
-
|
137
|
+
waiting_threads_total--;
|
136
138
|
}
|
137
139
|
|
138
140
|
if (ENABLED(TIMER_GLOBAL | TIMER_LOCAL)) {
|
139
141
|
struct timespec current_time;
|
140
142
|
gt_gettime(¤t_time);
|
141
|
-
|
143
|
+
counter_t diff = gt_time_diff_ns(timer_ready_at, current_time);
|
142
144
|
|
143
145
|
if (ENABLED(TIMER_LOCAL)) {
|
144
146
|
local_timer_total += diff;
|
145
147
|
}
|
146
148
|
|
147
149
|
if (ENABLED(TIMER_GLOBAL)) {
|
148
|
-
|
150
|
+
global_timer_total += diff;
|
149
151
|
}
|
150
152
|
}
|
151
153
|
}
|
data/lib/gvltools/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gvltools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean Boussier
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-03-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -67,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
requirements: []
|
70
|
-
rubygems_version: 3.4.
|
70
|
+
rubygems_version: 3.4.6
|
71
71
|
signing_key:
|
72
72
|
specification_version: 4
|
73
73
|
summary: Set of GVL instrumentation tools
|