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