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:
shugo 2017-09-20 01:40:53 +00:00
Родитель 79e0a19353
Коммит da1b14bcec
2 изменённых файлов: 43 добавлений и 0 удалений

Просмотреть файл

@ -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