gvl-tracing 1.6.0 → 1.6.1
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/ext/gvl_tracing_native_extension/gvl_tracing.c +21 -0
- data/gvl-tracing.gemspec +2 -1
- data/lib/gvl_tracing/version.rb +1 -1
- metadata +7 -12
- data/.editorconfig +0 -22
- data/.ruby-version +0 -1
- data/.standard.yml +0 -9
- data/Rakefile +0 -36
- data/gems.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2bf28c6665bf4afa02c13299947bb65d7c62c3af783858afdc3a5383e334fa47
|
4
|
+
data.tar.gz: b1999e7e17d56e76ba732962708c14979e2690cd78204946d2f05e7146b05725
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: feb5fb173e07343af18c929608b20b2463fc0b676565b926242585f3fed31991e34ab5f549d7cbfe0e26c883d4a1e6eebf1d8da9e1586f0fa63d0890cdd3b108
|
7
|
+
data.tar.gz: 615226e345e230b989d7738754f02a058935d67679b4ca16c610cbbb6fe34f82aff6de3299d9548af579a30d55bccaedf25cd52d4f631023cff93a683fe3c8bb
|
@@ -83,6 +83,7 @@ static VALUE gc_tracepoint = Qnil;
|
|
83
83
|
static int thread_storage_key = 0;
|
84
84
|
static VALUE all_seen_threads = Qnil;
|
85
85
|
static pthread_mutex_t all_seen_threads_mutex = PTHREAD_MUTEX_INITIALIZER;
|
86
|
+
static pthread_mutex_t output_mutex = PTHREAD_MUTEX_INITIALIZER;
|
86
87
|
static bool os_threads_view_enabled;
|
87
88
|
|
88
89
|
static VALUE tracing_init_local_storage(VALUE, VALUE);
|
@@ -95,6 +96,8 @@ static void on_gc_event(VALUE tpval, void *_unused1);
|
|
95
96
|
static VALUE mark_sleeping(VALUE _self);
|
96
97
|
static size_t thread_local_state_memsize(UNUSED_ARG const void *_unused);
|
97
98
|
static void thread_local_state_mark(void *data);
|
99
|
+
static inline void output_mutex_lock(void);
|
100
|
+
static inline void output_mutex_unlock(void);
|
98
101
|
static inline int32_t thread_id_for(thread_local_state *state);
|
99
102
|
static VALUE ruby_thread_id_for(UNUSED_ARG VALUE _self, VALUE thread);
|
100
103
|
static VALUE trim_all_seen_threads(UNUSED_ARG VALUE _self);
|
@@ -259,6 +262,7 @@ static double render_event(thread_local_state *state, const char *event_name) {
|
|
259
262
|
// Important note: We've observed some rendering issues in perfetto if the tid or pid are numbers that are "too big",
|
260
263
|
// see https://github.com/ivoanjo/gvl-tracing/pull/4#issuecomment-1196463364 for an example.
|
261
264
|
|
265
|
+
output_mutex_lock();
|
262
266
|
fprintf(output_file,
|
263
267
|
// Finish previous duration
|
264
268
|
" {\"ph\": \"E\", \"pid\": %"PRId64", \"tid\": %d, \"ts\": %f},\n" \
|
@@ -269,6 +273,7 @@ static double render_event(thread_local_state *state, const char *event_name) {
|
|
269
273
|
// Args for second line
|
270
274
|
process_id, thread_id_for(state), now_microseconds, event_name
|
271
275
|
);
|
276
|
+
output_mutex_unlock();
|
272
277
|
|
273
278
|
return now_microseconds;
|
274
279
|
}
|
@@ -355,6 +360,18 @@ static inline void all_seen_threads_mutex_unlock(void) {
|
|
355
360
|
if (error) rb_syserr_fail(error, "Failed to unlock GvlTracing mutex");
|
356
361
|
}
|
357
362
|
|
363
|
+
static inline void output_mutex_lock(void) {
|
364
|
+
int error = pthread_mutex_lock(&output_mutex);
|
365
|
+
// Can't raise exceptions on error since it gets used from outside the GVL
|
366
|
+
if (error) fprintf(stderr, "Failed to lock the GvlTracing output_mutex");
|
367
|
+
}
|
368
|
+
|
369
|
+
static inline void output_mutex_unlock(void) {
|
370
|
+
int error = pthread_mutex_unlock(&output_mutex);
|
371
|
+
// Can't raise exceptions on error since it gets used from outside the GVL
|
372
|
+
if (error) fprintf(stderr, "Failed to unlock the GvlTracing output_mutex");
|
373
|
+
}
|
374
|
+
|
358
375
|
#ifdef RUBY_3_3_PLUS
|
359
376
|
static inline thread_local_state *GT_LOCAL_STATE(VALUE thread, bool allocate) {
|
360
377
|
thread_local_state *state = rb_internal_thread_specific_get(thread, thread_storage_key);
|
@@ -444,17 +461,21 @@ static void render_os_thread_event(thread_local_state *state, double now_microse
|
|
444
461
|
// chars, so here we append a different letter to each thread to cause the color hashing to differ.
|
445
462
|
char color_suffix_hack = ('a' + (thread_id_for(state) % 26));
|
446
463
|
|
464
|
+
output_mutex_lock();
|
447
465
|
fprintf(output_file,
|
448
466
|
" {\"ph\": \"B\", \"pid\": %"PRId64", \"tid\": %u, \"ts\": %f, \"name\": \"Thread %d (%c)\"},\n",
|
449
467
|
OS_THREADS_VIEW_PID, current_native_thread_id(), now_microseconds, thread_id_for(state), color_suffix_hack
|
450
468
|
);
|
469
|
+
output_mutex_unlock();
|
451
470
|
}
|
452
471
|
|
453
472
|
static void finish_previous_os_thread_event(double now_microseconds) {
|
473
|
+
output_mutex_lock();
|
454
474
|
fprintf(output_file,
|
455
475
|
" {\"ph\": \"E\", \"pid\": %"PRId64", \"tid\": %u, \"ts\": %f},\n",
|
456
476
|
OS_THREADS_VIEW_PID, current_native_thread_id(), now_microseconds
|
457
477
|
);
|
478
|
+
output_mutex_unlock();
|
458
479
|
}
|
459
480
|
|
460
481
|
static inline uint32_t current_native_thread_id(void) {
|
data/gvl-tracing.gemspec
CHANGED
@@ -42,7 +42,8 @@ Gem::Specification.new do |spec|
|
|
42
42
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
43
43
|
spec.files = Dir.chdir(__dir__) do
|
44
44
|
`git ls-files -z`.split("\x0").reject do |f|
|
45
|
-
(f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features|examples)/|\.(?:git|travis|circleci)|appveyor)})
|
45
|
+
(f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features|examples)/|\.(?:git|travis|circleci)|appveyor)}) ||
|
46
|
+
[".editorconfig", ".ruby-version", ".standard.yml", "gems.rb", "Rakefile"].include?(f)
|
46
47
|
end
|
47
48
|
end
|
48
49
|
spec.require_paths = ["lib", "ext"]
|
data/lib/gvl_tracing/version.rb
CHANGED
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gvl-tracing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivo Anjo
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description:
|
13
|
+
description:
|
14
14
|
email:
|
15
15
|
- ivo@ivoanjo.me
|
16
16
|
executables: []
|
@@ -18,16 +18,11 @@ extensions:
|
|
18
18
|
- ext/gvl_tracing_native_extension/extconf.rb
|
19
19
|
extra_rdoc_files: []
|
20
20
|
files:
|
21
|
-
- ".editorconfig"
|
22
|
-
- ".ruby-version"
|
23
|
-
- ".standard.yml"
|
24
21
|
- CODE_OF_CONDUCT.adoc
|
25
22
|
- LICENSE
|
26
23
|
- README.adoc
|
27
|
-
- Rakefile
|
28
24
|
- ext/gvl_tracing_native_extension/extconf.rb
|
29
25
|
- ext/gvl_tracing_native_extension/gvl_tracing.c
|
30
|
-
- gems.rb
|
31
26
|
- gvl-tracing.gemspec
|
32
27
|
- lib/gvl-tracing.rb
|
33
28
|
- lib/gvl_tracing/sleep_tracking.rb
|
@@ -37,7 +32,7 @@ homepage: https://github.com/ivoanjo/gvl-tracing
|
|
37
32
|
licenses:
|
38
33
|
- MIT
|
39
34
|
metadata: {}
|
40
|
-
post_install_message:
|
35
|
+
post_install_message:
|
41
36
|
rdoc_options: []
|
42
37
|
require_paths:
|
43
38
|
- lib
|
@@ -53,8 +48,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
53
48
|
- !ruby/object:Gem::Version
|
54
49
|
version: '0'
|
55
50
|
requirements: []
|
56
|
-
rubygems_version: 3.
|
57
|
-
signing_key:
|
51
|
+
rubygems_version: 3.4.1
|
52
|
+
signing_key:
|
58
53
|
specification_version: 4
|
59
54
|
summary: Get a timeline view of Global VM Lock usage in your Ruby app
|
60
55
|
test_files: []
|
data/.editorconfig
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# EditorConfig is awesome: https://EditorConfig.org
|
2
|
-
|
3
|
-
# top-most EditorConfig file
|
4
|
-
root = true
|
5
|
-
|
6
|
-
# Unix-style newlines with a newline ending every file
|
7
|
-
[*]
|
8
|
-
end_of_line = lf
|
9
|
-
insert_final_newline = true
|
10
|
-
trim_trailing_whitespace = true
|
11
|
-
|
12
|
-
[*.h]
|
13
|
-
indent_style = space
|
14
|
-
indent_size = 2
|
15
|
-
|
16
|
-
[*.c]
|
17
|
-
indent_style = space
|
18
|
-
indent_size = 2
|
19
|
-
|
20
|
-
[*.yml]
|
21
|
-
indent_style = space
|
22
|
-
indent_size = 2
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
ruby-3.2.2
|
data/.standard.yml
DELETED
data/Rakefile
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
# gvl-tracing: Ruby gem for getting a timelinew view of GVL usage
|
2
|
-
# Copyright (c) 2022 Ivo Anjo <ivo@ivoanjo.me>
|
3
|
-
#
|
4
|
-
# This file is part of gvl-tracing.
|
5
|
-
#
|
6
|
-
# MIT License
|
7
|
-
#
|
8
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
9
|
-
# of this software and associated documentation files (the "Software"), to deal
|
10
|
-
# in the Software without restriction, including without limitation the rights
|
11
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12
|
-
# copies of the Software, and to permit persons to whom the Software is
|
13
|
-
# furnished to do so, subject to the following conditions:
|
14
|
-
#
|
15
|
-
# The above copyright notice and this permission notice shall be included in all
|
16
|
-
# copies or substantial portions of the Software.
|
17
|
-
#
|
18
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
24
|
-
# SOFTWARE.
|
25
|
-
|
26
|
-
# frozen_string_literal: true
|
27
|
-
|
28
|
-
require "bundler/gem_tasks"
|
29
|
-
require "standard/rake"
|
30
|
-
require "rake/extensiontask"
|
31
|
-
require "rspec/core/rake_task"
|
32
|
-
|
33
|
-
Rake::ExtensionTask.new("gvl_tracing_native_extension")
|
34
|
-
RSpec::Core::RakeTask.new(:spec)
|
35
|
-
|
36
|
-
task default: [:compile, :"standard:fix", :spec]
|
data/gems.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gemspec
|
6
|
-
|
7
|
-
gem "rake", "~> 13.0"
|
8
|
-
gem "rake-compiler", "~> 1.2"
|
9
|
-
gem "pry"
|
10
|
-
gem "pry-byebug"
|
11
|
-
gem "rspec"
|
12
|
-
gem "standard", "~> 1.41"
|
13
|
-
gem "concurrent-ruby"
|
14
|
-
gem "benchmark-ips", "~> 2.13"
|
15
|
-
gem "rubocop", ">= 1.66.0"
|