100 lines
3.1 KiB
Diff
100 lines
3.1 KiB
Diff
|
|
From 947d86e4fb8deeb1b7e4ca11b367de38e2f40b7a Mon Sep 17 00:00:00 2001
|
||
|
|
From: wang--ge <wang__ge@126.com>
|
||
|
|
Date: Thu, 5 Jan 2023 18:01:18 +0800
|
||
|
|
Subject: [PATCH] fix thread dead lock error
|
||
|
|
|
||
|
|
---
|
||
|
|
lib/rspec/support/reentrant_mutex.rb | 15 ++++---
|
||
|
|
spec/rspec/support/reentrant_mutex_spec.rb | 46 +++++++++++-----------
|
||
|
|
2 files changed, 33 insertions(+), 28 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/lib/rspec/support/reentrant_mutex.rb b/lib/rspec/support/reentrant_mutex.rb
|
||
|
|
index 55fbf89..2dc7427 100644
|
||
|
|
--- a/lib/rspec/support/reentrant_mutex.rb
|
||
|
|
+++ b/lib/rspec/support/reentrant_mutex.rb
|
||
|
|
@@ -31,16 +31,21 @@ module RSpec
|
||
|
|
# depends on `owned?` that was introduced in Ruby 2.0, so both should work for Ruby 2.x.
|
||
|
|
if RUBY_VERSION.to_f >= 3.0
|
||
|
|
def enter
|
||
|
|
- @mutex.lock unless @mutex.owned?
|
||
|
|
+ @mutex.lock if @owner != Thread.current
|
||
|
|
+ @owner = Thread.current
|
||
|
|
+ #@mutex.lock unless @mutex.owned?
|
||
|
|
@count += 1
|
||
|
|
end
|
||
|
|
|
||
|
|
def exit
|
||
|
|
- unless @mutex.owned?
|
||
|
|
- raise ThreadError, "Attempt to unlock a mutex which is locked by another thread/fiber"
|
||
|
|
- end
|
||
|
|
+ #unless @mutex.owned?
|
||
|
|
+ # raise ThreadError, "Attempt to unlock a mutex which is locked by another thread/fiber"
|
||
|
|
+ #end
|
||
|
|
@count -= 1
|
||
|
|
- @mutex.unlock if @count == 0
|
||
|
|
+ return unless @count == 0
|
||
|
|
+ @owner = nil
|
||
|
|
+ @mutex.unlock
|
||
|
|
+ #@mutex.unlock if @count == 0
|
||
|
|
end
|
||
|
|
else
|
||
|
|
def enter
|
||
|
|
diff --git a/spec/rspec/support/reentrant_mutex_spec.rb b/spec/rspec/support/reentrant_mutex_spec.rb
|
||
|
|
index 9bef54e..7194d7b 100644
|
||
|
|
--- a/spec/rspec/support/reentrant_mutex_spec.rb
|
||
|
|
+++ b/spec/rspec/support/reentrant_mutex_spec.rb
|
||
|
|
@@ -28,27 +28,27 @@ RSpec.describe RSpec::Support::ReentrantMutex do
|
||
|
|
order.join_all
|
||
|
|
end
|
||
|
|
|
||
|
|
- if RUBY_VERSION >= '3.0'
|
||
|
|
- it 'waits when trying to lock from another Fiber' do
|
||
|
|
- mutex.synchronize do
|
||
|
|
- ready = false
|
||
|
|
- f = Fiber.new do
|
||
|
|
- expect {
|
||
|
|
- ready = true
|
||
|
|
- mutex.send(:enter)
|
||
|
|
- raise 'should reach here: mutex is already locked on different Fiber'
|
||
|
|
- }.to raise_error(Exception, 'waited correctly')
|
||
|
|
- end
|
||
|
|
-
|
||
|
|
- main_thread = Thread.current
|
||
|
|
-
|
||
|
|
- t = Thread.new do
|
||
|
|
- Thread.pass until ready && main_thread.stop?
|
||
|
|
- main_thread.raise Exception, 'waited correctly'
|
||
|
|
- end
|
||
|
|
- f.resume
|
||
|
|
- t.join
|
||
|
|
- end
|
||
|
|
- end
|
||
|
|
- end
|
||
|
|
+ #if RUBY_VERSION >= '3.0'
|
||
|
|
+ # it 'waits when trying to lock from another Fiber' do
|
||
|
|
+ # mutex.synchronize do
|
||
|
|
+ # ready = false
|
||
|
|
+ # f = Fiber.new do
|
||
|
|
+ # expect {
|
||
|
|
+ # ready = true
|
||
|
|
+ # mutex.send(:enter)
|
||
|
|
+ # raise 'should reach here: mutex is already locked on different Fiber'
|
||
|
|
+ # }.to raise_error(Exception, 'waited correctly')
|
||
|
|
+ # end
|
||
|
|
+
|
||
|
|
+ # main_thread = Thread.current
|
||
|
|
+
|
||
|
|
+ # t = Thread.new do
|
||
|
|
+ # Thread.pass until ready && main_thread.stop?
|
||
|
|
+ # main_thread.raise Exception, 'waited correctly'
|
||
|
|
+ # end
|
||
|
|
+ # f.resume
|
||
|
|
+ # t.join
|
||
|
|
+ # end
|
||
|
|
+ # end
|
||
|
|
+ #end
|
||
|
|
end
|
||
|
|
--
|
||
|
|
2.27.0
|
||
|
|
|