gvltools 0.2.0 → 0.3.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/.rubocop.yml +9 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +1 -1
- data/ext/gvltools/instrumentation.c +8 -2
- data/lib/gvltools/version.rb +1 -1
- data/lib/gvltools.rb +19 -0
- 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: 5ffb320bec5fdc8a0d4940d8b370af1607a20383e1a9a8f939cc759588ca6627
|
4
|
+
data.tar.gz: 223bee0c124c17296b8386bbdda94406f91b84ad0adcf3acd09921424bb8eaf8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c988c2e9d2c17925b178e4201f99530e75328cda648b3e3b50664e1d751ff5ad086139293a22dab5a54ae18e86bdd7d6e14064f4a4833eae18d3d948f134f20
|
7
|
+
data.tar.gz: 3b56ad91bf7784d0c61e4d321964eeaaae8ca97ec6c6c86c1934e8e95ad9d720b00933a7b0f7e91ec45e7ffd2a07665800c6f616250b7251318dc889a5ba94ca
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.3.0] - 2023-04-11
|
4
|
+
|
5
|
+
- Automatically reset the `WaitingThreads` counter when enabling it (#7).
|
6
|
+
- Disallow resetting the `WaitingThreads` counter when it is active (#7).
|
7
|
+
|
3
8
|
## [0.2.0] - 2023-03-28
|
4
9
|
|
5
10
|
- Use C11 atomics instead of MRI's `rb_atomic_t`.
|
data/Gemfile.lock
CHANGED
@@ -93,12 +93,15 @@ static VALUE local_timer_reset(VALUE module) {
|
|
93
93
|
|
94
94
|
// Thread counts
|
95
95
|
static _Atomic counter_t waiting_threads_total = 0;
|
96
|
+
static _Atomic counter_t waiting_threads_current_generation = 1;
|
97
|
+
static THREAD_LOCAL_SPECIFIER counter_t waiting_threads_ready_generation = 0;
|
96
98
|
|
97
99
|
static VALUE waiting_threads_count(VALUE module) {
|
98
100
|
return ULL2NUM(waiting_threads_total);
|
99
101
|
}
|
100
102
|
|
101
103
|
static VALUE waiting_threads_reset(VALUE module) {
|
104
|
+
waiting_threads_current_generation++;
|
102
105
|
waiting_threads_total = 0;
|
103
106
|
return Qtrue;
|
104
107
|
}
|
@@ -122,6 +125,7 @@ static void gt_thread_callback(rb_event_flag_t event, const rb_internal_thread_e
|
|
122
125
|
if (!was_ready) was_ready = true;
|
123
126
|
|
124
127
|
if (ENABLED(WAITING_THREADS)) {
|
128
|
+
waiting_threads_ready_generation = waiting_threads_current_generation;
|
125
129
|
waiting_threads_total++;
|
126
130
|
}
|
127
131
|
|
@@ -134,7 +138,9 @@ static void gt_thread_callback(rb_event_flag_t event, const rb_internal_thread_e
|
|
134
138
|
if (!was_ready) break; // In case we registered the hook while some threads were already waiting on the GVL
|
135
139
|
|
136
140
|
if (ENABLED(WAITING_THREADS)) {
|
137
|
-
|
141
|
+
if (waiting_threads_ready_generation == waiting_threads_current_generation) {
|
142
|
+
waiting_threads_total--;
|
143
|
+
}
|
138
144
|
}
|
139
145
|
|
140
146
|
if (ENABLED(TIMER_GLOBAL | TIMER_LOCAL)) {
|
@@ -172,6 +178,6 @@ void Init_instrumentation(void) {
|
|
172
178
|
rb_define_singleton_method(rb_mLocalTimer, "monotonic_time", local_timer_monotonic_time, 0);
|
173
179
|
|
174
180
|
VALUE rb_mWaitingThreads = rb_const_get(rb_mGVLTools, rb_intern("WaitingThreads"));
|
175
|
-
rb_define_singleton_method(rb_mWaitingThreads, "
|
181
|
+
rb_define_singleton_method(rb_mWaitingThreads, "_reset", waiting_threads_reset, 0);
|
176
182
|
rb_define_singleton_method(rb_mWaitingThreads, "count", waiting_threads_count, 0);
|
177
183
|
}
|
data/lib/gvltools/version.rb
CHANGED
data/lib/gvltools.rb
CHANGED
@@ -96,8 +96,27 @@ module GVLTools
|
|
96
96
|
end
|
97
97
|
alias_method :count, :count
|
98
98
|
|
99
|
+
def enable
|
100
|
+
unless enabled?
|
101
|
+
reset
|
102
|
+
end
|
103
|
+
super
|
104
|
+
end
|
105
|
+
|
106
|
+
def reset
|
107
|
+
if enabled?
|
108
|
+
raise Error, "can't reset WaitingThreads counter while it is active"
|
109
|
+
else
|
110
|
+
_reset
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
99
114
|
private
|
100
115
|
|
116
|
+
def _reset
|
117
|
+
end
|
118
|
+
alias_method :_reset, :_reset # to be redefined from C.
|
119
|
+
|
101
120
|
def metric
|
102
121
|
WAITING_THREADS
|
103
122
|
end
|
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.3.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-04-11 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.10
|
71
71
|
signing_key:
|
72
72
|
specification_version: 4
|
73
73
|
summary: Set of GVL instrumentation tools
|