Hiroshi SHIBATA and Claude Opus 5.5
e6c4cb0a75
Use rb_len_t for Thread::Queue lengths
...
The ring buffer of Queue and the limit of SizedQueue are element counts that are filled from and compared with Array lengths, so they would truncate on mswin once rb_len_t widens.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-09 14:00:15 +09:00
Hartley McGuire
53443163ec
[DOC] Fix Thread::Mutex#unlock doc
...
It was [previously][1] moved from C to Ruby, but the doc on the Ruby
method was copied from `#lock` while the correct doc was left in C.
[1]: 07b2356a6a
2026-07-06 09:40:46 -07:00
Alex Kitchens
d6fa8e3e0f
[DOC] Fix indentation in thread_sync.rb documentation examples
2026-05-26 23:41:30 +09:00
Jean Boussier
d8b8a95af9
Make Monitor a core class
...
[Feature #21788 ]
It allows monitor to access internal routines and remove some overhead.
Before:
```
ruby 4.0.0dev (2025-12-13T04:52:13Z master 71dd272506 ) +YJIT +PRISM [arm64-darwin25]
Warming up --------------------------------------
Mutex 2.111M i/100ms
Monitor 1.736M i/100ms
Calculating -------------------------------------
Mutex 25.050M (± 0.4%) i/s (39.92 ns/i) - 126.631M in 5.055208s
Monitor 19.809M (± 0.1%) i/s (50.48 ns/i) - 100.672M in 5.082015s
```
After:
```
ruby 4.0.0dev (2025-12-13T06:49:18Z core-monitor 6fabf389fd) +YJIT +PRISM [arm64-darwin25]
Warming up --------------------------------------
Mutex 2.144M i/100ms
Monitor 1.859M i/100ms
Calculating -------------------------------------
Mutex 24.771M (± 0.4%) i/s (40.37 ns/i) - 124.342M in 5.019716s
Monitor 23.722M (± 0.4%) i/s (42.15 ns/i) - 118.998M in 5.016361s
```
Bench:
```ruby
require 'bundler/inline'
gemfile do
gem "benchmark-ips"
end
mutex = Mutex.new
require "monitor"
monitor = Monitor.new
Benchmark.ips do |x|
x.report("Mutex") { mutex.synchronize { } }
x.report("Monitor") { monitor.synchronize { } }
end
```
2026-02-12 20:35:18 +01:00
Jean Boussier
16feb46fa2
Convert Queue and SizedQueue to rb builtin
...
A large part of `thread_sync.c` was migrated already, might as well
go all the way. It also allow to remove a bunch of Rdoc commands.
2026-01-03 00:07:44 +01:00
Jean Boussier
7e7a1db579
Define Thread::ConditionVariable in thread_sync.rb
...
It's more consistent with Mutex, but also the `#wait` method
benefits from receiving the execution context instead of having
to call `GET_EC`.
2025-12-12 10:07:39 +01:00
Jean Boussier
07b2356a6a
Mutex: avoid repeated calls to GET_EC
...
That call is surprisingly expensive, so trying doing it once
in `#synchronize` and then passing the EC to lock and unlock
saves quite a few cycles.
Before:
```
ruby 4.0.0dev (2025-12-10T09:30:18Z master c5608ab4d7 ) +YJIT +PRISM [arm64-darwin25]
Warming up --------------------------------------
Mutex 1.888M i/100ms
Monitor 1.633M i/100ms
Calculating -------------------------------------
Mutex 22.610M (± 0.2%) i/s (44.23 ns/i) - 113.258M in 5.009097s
Monitor 19.148M (± 0.3%) i/s (52.22 ns/i) - 96.366M in 5.032755s
```
After:
```
ruby 4.0.0dev (2025-12-10T10:40:07Z speedup-mutex 1c901cd4f8) +YJIT +PRISM [arm64-darwin25]
Warming up --------------------------------------
Mutex 2.095M i/100ms
Monitor 1.578M i/100ms
Calculating -------------------------------------
Mutex 24.456M (± 0.4%) i/s (40.89 ns/i) - 123.584M in 5.053418s
Monitor 19.176M (± 0.1%) i/s (52.15 ns/i) - 96.243M in 5.018977s
```
Bench:
```
require 'bundler/inline'
gemfile do
gem "benchmark-ips"
end
mutex = Mutex.new
require "monitor"
monitor = Monitor.new
Benchmark.ips do |x|
x.report("Mutex") { mutex.synchronize { } }
x.report("Monitor") { monitor.synchronize { } }
end
```
2025-12-11 23:25:57 +01:00
Jean Boussier
60defe0a68
thread_sync.c: Clarify and document the behavior of timeout == 0
...
[Feature #18982 ]
Instead of introducing an `exception: false` argument to have `non_block`
return nil rather than raise, we can clearly document that a timeout of 0
immediately returns.
The code is refactored a bit to avoid doing a time calculation in
such case.
2022-10-17 16:56:00 +02:00
Jean Boussier
fe61cad749
Implement SizedQueue#push(timeout: sec)
...
[Feature #18944 ]
If both `non_block=true` and `timeout:` are supplied, ArgumentError
is raised.
2022-08-18 10:07:37 +02:00
Jean Boussier
e3aabe93aa
Implement Queue#pop(timeout: sec)
...
[Feature #18774 ]
As well as `SizedQueue#pop(timeout: sec)`
If both `non_block=true` and `timeout:` are supplied, ArgumentError
is raised.
2022-08-02 11:04:28 +02:00