mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
[Feature #18339] GVL Instrumentation API
Ref: https://bugs.ruby-lang.org/issues/18339 Design: - This tries to minimize the overhead when no hook is registered. It should only incur an extra unsynchronized boolean check. - The hook list is protected with a read-write lock as to cause contention when some hooks are registered. - The hooks MUST be thread safe, and MUST NOT call into Ruby as they are executed outside the GVL. - It's simply a noop on Windows. API: ``` rb_internal_thread_event_hook_t * rb_internal_thread_add_event_hook(rb_internal_thread_event_callback callback, rb_event_flag_t internal_event, void *user_data); bool rb_internal_thread_remove_event_hook(rb_internal_thread_event_hook_t * hook); ``` You can subscribe to 3 events: - READY: called right before attempting to acquire the GVL - RESUMED: called right after successfully acquiring the GVL - SUSPENDED: called right after releasing the GVL. The hooks MUST be threadsafe, as they are executed outside of the GVL, they also MUST NOT call any Ruby API.
This commit is contained in:
parent
d142eff658
commit
9125374726
Notes:
git
2022-06-03 22:13:53 +09:00
7 changed files with 468 additions and 1 deletions
|
@ -29,6 +29,18 @@ static volatile DWORD ruby_native_thread_key = TLS_OUT_OF_INDEXES;
|
|||
|
||||
static int w32_wait_events(HANDLE *events, int count, DWORD timeout, rb_thread_t *th);
|
||||
|
||||
rb_internal_thread_event_hook_t *
|
||||
rb_internal_thread_add_event_hook(rb_internal_thread_event_callback callback, rb_event_flag_t internal_event, void *user_data)
|
||||
{
|
||||
// not implemented
|
||||
}
|
||||
|
||||
bool
|
||||
rb_internal_thread_remove_event_hook(rb_internal_thread_event_hook_t * hook)
|
||||
{
|
||||
// not implemented
|
||||
}
|
||||
|
||||
RBIMPL_ATTR_NORETURN()
|
||||
static void
|
||||
w32_error(const char *func)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue