class Riffer::Rig::Runtime::JobInbox
Public Class Methods
(?clock: ^() → Float) → void
Source
# File lib/riffer/rig/runtime/job_inbox.rb, line 13 def initialize(clock: -> { Process.clock_gettime(Process::CLOCK_MONOTONIC) }) @mutex = Mutex.new @arrived = ConditionVariable.new @clock = clock @pending = [] @subscribers = [] @closed = false end
@rbs clock: ^() -> Float @rbs return: void
Public Instance Methods
(Numeric? timeout) → bool
Source
# File lib/riffer/rig/runtime/job_inbox.rb, line 54 def await(timeout) deadline = timeout && (@clock.call + timeout) @mutex.synchronize do until @pending.any? || @closed remaining = deadline && (deadline - @clock.call) break if remaining && !remaining.positive? @arrived.wait(@mutex, remaining) end @pending.any? end end
@rbs timeout: Numeric? @rbs return: bool
() → void
Source
# File lib/riffer/rig/runtime/job_inbox.rb, line 68 def close @mutex.synchronize do @closed = true @arrived.broadcast end end
@rbs return: void
() → Array[Riffer::Rig::Runtime::JobCompletion]
Source
# File lib/riffer/rig/runtime/job_inbox.rb, line 48 def drain @mutex.synchronize { @pending.shift(@pending.size) } end
@rbs return: Array
(Riffer::Rig::Runtime::JobCompletion completion) → void
Source
# File lib/riffer/rig/runtime/job_inbox.rb, line 30 def push(completion) # Subscribers run under the lock so that once close returns, none is # running and none will start. @mutex.synchronize do return if @closed @pending << completion @arrived.broadcast @subscribers.each { |subscriber| subscriber.call(completion) } end end
@rbs completion: Riffer::Rig::Runtime::JobCompletion @rbs return: void
() → Integer
Source
# File lib/riffer/rig/runtime/job_inbox.rb, line 43 def size @mutex.synchronize { @pending.size } end
@rbs return: Integer
() { (Riffer::Rig::Runtime::JobCompletion) → void } → void
Source
# File lib/riffer/rig/runtime/job_inbox.rb, line 24 def subscribe(&block) @mutex.synchronize { @subscribers << block } end
@rbs &block: (Riffer::Rig::Runtime::JobCompletion) -> void @rbs return: void