Skip to content
  • Jean Boussier's avatar
    91253747
    [Feature #18339] GVL Instrumentation API · 91253747
    Jean Boussier authored
    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.
    91253747
    [Feature #18339] GVL Instrumentation API
    Jean Boussier authored
    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.
Loading