module Concurrent::ThreadSafe::Util::CheapLockable

def cheap_wait

def cheap_wait
  wchan = Rubinius::Channel.new
  begin
    waiters = @waiters ||= []
    waiters.push wchan
    Rubinius.unlock(self)
    signaled = wchan.receive_timeout nil
  ensure
    Rubinius.lock(self)
    unless signaled or waiters.delete(wchan)
      # we timed out, but got signaled afterwards (e.g. while waiting to
      # acquire @lock), so pass that signal on to the next waiter
      waiters.shift << true unless waiters.empty?
    end
  end
  self
end