1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
class GVLFuture
PENDING = Object.new
def initialize
@lock = Mutex.new
@condition = ConditionVariable.new
@value = PENDING
end
def complete?(value = @value)
value != PENDING
end
def value
value = @value
return value if complete? value
@lock.synchronize do
# recheck complete?
@condition.wait @lock unless complete? @value
end
@value
end
def fulfill(value)
# why not check complete? before synchronizing?
@lock.synchronize do
raise 'already fulfilled' if complete?
@value = value
@condition.broadcast
self
end
end
end
|