Bug #5355 » patch.diff
| lib/sync.rb | ||
|---|---|---|
|
while true
|
||
|
@sync_mutex.synchronize do
|
||
|
if sync_try_lock_sub(m)
|
||
|
return self
|
||
|
else
|
||
|
if sync_sh_locker[Thread.current]
|
||
|
sync_upgrade_waiting.push [Thread.current, sync_sh_locker[Thread.current]]
|
||
|
sync_sh_locker.delete(Thread.current)
|
||
|
begin
|
||
|
if sync_try_lock_sub(m)
|
||
|
return self
|
||
|
else
|
||
|
sync_waiting.push Thread.current
|
||
|
if sync_sh_locker[Thread.current]
|
||
|
sync_upgrade_waiting.push [Thread.current, sync_sh_locker[Thread.current]]
|
||
|
sync_sh_locker.delete(Thread.current)
|
||
|
else
|
||
|
unless sync_waiting.include?(Thread.current) || sync_upgrade_waiting.reverse_each.any?{|w| w.first == Thread.current }
|
||
|
sync_waiting.push Thread.current
|
||
|
end
|
||
|
end
|
||
|
@sync_mutex.sleep
|
||
|
end
|
||
|
@sync_mutex.sleep
|
||
|
ensure
|
||
|
sync_waiting.delete(Thread.current)
|
||
|
end
|
||
|
end
|
||
|
end
|
||