gvl-tracing 1.5.1 → 1.5.2
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 +22 -9
- data/lib/gvl_tracing/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: 4f2845379f02ef9e8cd317a293b0c24c92dbd9aebad15ccb9b378ea1c41cf894
|
4
|
+
data.tar.gz: ce639fb1bffb10262e1dee5f5bf7a80f4425d9db7b690a494b6cefedae507265
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '01659c02734923610f4c771afcd1a863de369781a7c21cf42c46e5d956f897c65643f0ae6a5a1eebb7fcb81895556271f57f7e164b3ac3581177509d31381db7'
|
7
|
+
data.tar.gz: f0e0894e7d3dcc5c7f00485b8e741be31f832142ef0436524f26e5996da9f901dc17b46080b26f2ecf5bcfc0ca37b6bdaae48b014eaeb00518dfa56b6c892167
|
@@ -31,7 +31,7 @@
|
|
31
31
|
#include <inttypes.h>
|
32
32
|
#include <stdbool.h>
|
33
33
|
#include <sys/types.h>
|
34
|
-
#include <
|
34
|
+
#include <pthread.h>
|
35
35
|
|
36
36
|
#include "extconf.h"
|
37
37
|
|
@@ -77,7 +77,7 @@ static VALUE gc_tracepoint = Qnil;
|
|
77
77
|
#pragma GCC diagnostic ignored "-Wunused-variable"
|
78
78
|
static int thread_storage_key = 0;
|
79
79
|
static VALUE all_seen_threads = Qnil;
|
80
|
-
static
|
80
|
+
static pthread_mutex_t all_seen_threads_mutex = PTHREAD_MUTEX_INITIALIZER;
|
81
81
|
|
82
82
|
static VALUE tracing_init_local_storage(VALUE, VALUE);
|
83
83
|
static VALUE tracing_start(VALUE _self, VALUE output_path);
|
@@ -128,8 +128,6 @@ void Init_gvl_tracing_native_extension(void) {
|
|
128
128
|
|
129
129
|
all_seen_threads = rb_ary_new();
|
130
130
|
|
131
|
-
if (mtx_init(&all_seen_threads_mutex, mtx_plain) != thrd_success) rb_raise(rb_eRuntimeError, "Failed to initialize GvlTracing mutex");
|
132
|
-
|
133
131
|
VALUE gvl_tracing_module = rb_define_module("GvlTracing");
|
134
132
|
|
135
133
|
rb_define_singleton_method(gvl_tracing_module, "_init_local_storage", tracing_init_local_storage, 1);
|
@@ -148,7 +146,12 @@ static inline void initialize_thread_local_state(thread_local_state *state) {
|
|
148
146
|
uint32_t native_thread_id = 0;
|
149
147
|
|
150
148
|
#ifdef HAVE_PTHREAD_THREADID_NP
|
151
|
-
|
149
|
+
uint64_t full_native_thread_id;
|
150
|
+
pthread_threadid_np(pthread_self(), &full_native_thread_id);
|
151
|
+
// Note: `pthread_threadid_np` is declared as taking in a `uint64_t` but I don't think macOS uses such really
|
152
|
+
// high thread ids, and anyway perfetto doesn't like full 64-bit ids for threads so let's go with a simplification
|
153
|
+
// for now.
|
154
|
+
native_thread_id = (uint32_t) full_native_thread_id;
|
152
155
|
#elif HAVE_GETTID
|
153
156
|
native_thread_id = gettid();
|
154
157
|
#else
|
@@ -324,6 +327,16 @@ static void thread_local_state_mark(void *data) {
|
|
324
327
|
rb_gc_mark(state->thread); // Marking thread to make sure it stays pinned
|
325
328
|
}
|
326
329
|
|
330
|
+
static inline void all_seen_threads_mutex_lock(void) {
|
331
|
+
int error = pthread_mutex_lock(&all_seen_threads_mutex);
|
332
|
+
if (error) rb_syserr_fail(error, "Failed to lock GvlTracing mutex");
|
333
|
+
}
|
334
|
+
|
335
|
+
static inline void all_seen_threads_mutex_unlock(void) {
|
336
|
+
int error = pthread_mutex_unlock(&all_seen_threads_mutex);
|
337
|
+
if (error) rb_syserr_fail(error, "Failed to unlock GvlTracing mutex");
|
338
|
+
}
|
339
|
+
|
327
340
|
#ifdef RUBY_3_3_PLUS
|
328
341
|
static inline thread_local_state *GT_LOCAL_STATE(VALUE thread, bool allocate) {
|
329
342
|
thread_local_state *state = rb_internal_thread_specific_get(thread, thread_storage_key);
|
@@ -338,9 +351,9 @@ static void thread_local_state_mark(void *data) {
|
|
338
351
|
// Keep thread around, to be able to extract names at the end
|
339
352
|
// We grab a lock here since thread creation can happen in multiple Ractors, and we want to make sure only one
|
340
353
|
// of them is mutating the array at a time. @ivoanjo: I think this is enough to make this safe....?
|
341
|
-
|
354
|
+
all_seen_threads_mutex_lock();
|
342
355
|
rb_ary_push(all_seen_threads, thread);
|
343
|
-
|
356
|
+
all_seen_threads_mutex_unlock();
|
344
357
|
}
|
345
358
|
return state;
|
346
359
|
}
|
@@ -385,7 +398,7 @@ static VALUE ruby_thread_id_for(UNUSED_ARG VALUE _self, VALUE thread) {
|
|
385
398
|
|
386
399
|
// Can only be called while GvlTracing is not active + while holding the GVL
|
387
400
|
static VALUE trim_all_seen_threads(UNUSED_ARG VALUE _self) {
|
388
|
-
|
401
|
+
all_seen_threads_mutex_lock();
|
389
402
|
|
390
403
|
VALUE alive_threads = rb_ary_new();
|
391
404
|
|
@@ -398,6 +411,6 @@ static VALUE trim_all_seen_threads(UNUSED_ARG VALUE _self) {
|
|
398
411
|
|
399
412
|
rb_ary_replace(all_seen_threads, alive_threads);
|
400
413
|
|
401
|
-
|
414
|
+
all_seen_threads_mutex_unlock();
|
402
415
|
return Qtrue;
|
403
416
|
}
|
data/lib/gvl_tracing/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gvl-tracing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivo Anjo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -53,7 +53,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
requirements: []
|
56
|
-
rubygems_version: 3.
|
56
|
+
rubygems_version: 3.5.3
|
57
57
|
signing_key:
|
58
58
|
specification_version: 4
|
59
59
|
summary: Get a timeline view of Global VM Lock usage in your Ruby app
|