blob: 2dbc37da09d200fece48b47af390e7189055acf1 [file] [log] [blame]
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
require 'thread'
require 'monitor'
# Monkeypatch
class MonitorMixin::ConditionVariable
# Wait until BLOCK returns TRUE or TIMEOUT seconds have passed
# Return TRUE if BLOCK returned TRUE within the TIMEOUT, FALSE
# otherswise
def wait_for(timeout=nil, &block)
start = Time.now
passed = 0
until yield
if timeout.nil?
wait
elsif passed < timeout
wait(timeout)
else
return false
end
passed = Time.now - start
end
return true
end
end
module Qpid::Util
# Similar to Python's threading.Event
class Event
def initialize
@monitor = Monitor.new
@cond = @monitor.new_cond
@set = false
end
def set
@monitor.synchronize do
@set = true
@cond.signal
end
end
def clear
@monitor.synchronize { @set = false }
end
def wait(timeout = nil)
@monitor.synchronize do
unless @set
@cond.wait_for(timeout) { @set }
end
end
end
end
end