Project

General

Profile

Feature #21788

Updated by byroot (Jean Boussier) 1 day ago

`Monitor` is about as useful as `Mutex` and yet one is a core class and the other is a "stdlib" extension. 

 I propose to promote `Thread::Monitor` as a core class convenience. 

 ### The rest of `monitor.rb` 

 The `monitor` stdlib also contains `MonitorMixin`, but I think this part can remain in `lib/monitor.rb` (or even be moved to `lib/monitor_mixin.rb`. 

 One more questionable part is `Monitor#new_cond`, as it returns a `::MonitorMixin::ConditionVariable` so it would also need to remain in the stdlib. 

 ### Performance benefit 

 By being a core class, Monitor can also be implemented more efficiently, as it is no longer constrained to the public C API. 
 On my branch, monitor is approximately 15% faster (but there might be some more optimizations to be found). 

 `master`: 

 ``` 
 ruby 4.0.0dev (2025-12-17T07:16:32Z master 54d3945ee5) (2025-12-17T07:21:34Z core-monitor 32815a1bc4) +YJIT +PRISM [arm64-darwin25] 
 Warming up -------------------------------------- 
                Mutex       1.952M 1.975M i/100ms 
              Monitor       1.775M 1.936M i/100ms 
 Calculating ------------------------------------- 
                Mutex       25.102M 25.213M (± 0.4%) i/s     (39.84 (39.66 ns/i) -      126.884M 126.407M in     5.054731s 5.013728s 
              Monitor       21.189M 24.099M (± 0.1%) i/s     (47.19 (41.50 ns/i) -      106.485M 121.992M in     5.025493s 5.062092s 
 ``` 

 core monitor: 

 ``` 
 ruby 4.0.0dev (2025-12-17T07:21:34Z core-monitor 32815a1bc4) (2025-12-17T07:16:32Z master 54d3945ee5) +YJIT +PRISM [arm64-darwin25] 
 Warming up -------------------------------------- 
                Mutex       1.975M 1.952M i/100ms 
              Monitor       1.936M 1.775M i/100ms 
 Calculating ------------------------------------- 
                Mutex       25.213M 25.102M (± 0.4%) i/s     (39.66 (39.84 ns/i) -      126.407M 126.884M in     5.013728s 5.054731s 
              Monitor       24.099M 21.189M (± 0.1%) i/s     (41.50 (47.19 ns/i) -      121.992M 106.485M in     5.062092s 5.025493s 
 ``` 
 

 Proposed implementation: https://github.com/ruby/ruby/pull/15538

Back