Bug #21342
openSegfault: invalid keeping_mutexes when using Mutex in Thread then Fiber after GC
Description
Ruby crashes with a [BUG] invalid keeping_mutexes error
when attempting to GC locked mutex that was used in a Thread within a Fiber context after garbage collection. The error indicates an attempt to unlock a mutex that is not locked, suggesting a state management issue with mutexes across Thread and Fiber boundaries.
Ruby Version¶
ruby 3.4.3 (2025-04-14 revision d0b7e5b6a0) +PRISM [x86_64-linux]
Reproduce Process¶
# segv.rb
5.times do
m = Mutex.new
Thread.new do
m.synchronize do
end
end.join
Fiber.new do
GC.start
m.lock
end.resume
end
- Save the above code to a file (e.g.,
segv.rb
) - Run with
ruby segv.rb
- The crash occurs intermittently - sometimes it crashes immediately, sometimes it hangs, once in a while it works
Actual Result¶
The program crashes with the following error:
segv.rb: [BUG] invalid keeping_mutexes: Attempt to unlock a mutex which is not locked
ruby 3.4.3 (2025-04-14 revision d0b7e5b6a0) +PRISM [x86_64-linux]
whole segfault in the attached txt file.
Full crash backtrace shows the error originates from:
-
rb_threadptr_unlock_all_locking_mutexes
in thread.c:450 -
rb_thread_terminate_all
in thread.c:467
The crash suggests an issue in mutex state management during thread termination.
Expected Result¶
The script should complete successfully without crashing. The mutex should be properly managed across Thread and Fiber contexts, and garbage collection should not interfere with mutex state.
Files