mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Add MonitorMinx#mon_locked? and #mon_owned? to check states of objects
Patched by Satoshi "Moris" Tagomori <tagomoris@gmail.com>. [Fix GH-1699] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59971 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
79e0a19353
commit
da1b14bcec
2 changed files with 43 additions and 0 deletions
|
@ -203,6 +203,20 @@ module MonitorMixin
|
|||
end
|
||||
end
|
||||
|
||||
#
|
||||
# Returns true if this monitor is locked by any thread
|
||||
#
|
||||
def mon_locked?
|
||||
@mon_mutex.locked?
|
||||
end
|
||||
|
||||
#
|
||||
# Returns true if this monitor is locked by current thread.
|
||||
#
|
||||
def mon_owned?
|
||||
@mon_mutex.locked? && @mon_owner == Thread.current
|
||||
end
|
||||
|
||||
#
|
||||
# Enters exclusive section and executes the block. Leaves the exclusive
|
||||
# section automatically when the block exits. See example under
|
||||
|
|
|
@ -146,6 +146,35 @@ class TestMonitor < Test::Unit::TestCase
|
|||
assert_join_threads([th, th2])
|
||||
end
|
||||
|
||||
def test_mon_locked_and_owned
|
||||
queue1 = Queue.new
|
||||
queue2 = Queue.new
|
||||
th = Thread.start {
|
||||
@monitor.enter
|
||||
queue1.enq(nil)
|
||||
queue2.deq
|
||||
@monitor.exit
|
||||
queue1.enq(nil)
|
||||
}
|
||||
queue1.deq
|
||||
assert(@monitor.mon_locked?)
|
||||
assert(!@monitor.mon_owned?)
|
||||
|
||||
queue2.enq(nil)
|
||||
queue1.deq
|
||||
assert(!@monitor.mon_locked?)
|
||||
|
||||
@monitor.enter
|
||||
assert @monitor.mon_locked?
|
||||
assert @monitor.mon_owned?
|
||||
@monitor.exit
|
||||
|
||||
@monitor.synchronize do
|
||||
assert @monitor.mon_locked?
|
||||
assert @monitor.mon_owned?
|
||||
end
|
||||
end
|
||||
|
||||
def test_cond
|
||||
cond = @monitor.new_cond
|
||||
|
||||
|
|
Loading…
Reference in a new issue