Module: Philiprehberger::TimeoutKit
- Defined in:
- lib/philiprehberger/timeout_kit.rb,
lib/philiprehberger/timeout_kit/version.rb,
lib/philiprehberger/timeout_kit/deadline.rb
Defined Under Namespace
Classes: Deadline, DeadlineExceeded, Error
Constant Summary collapse
- VERSION =
'0.3.0'
Class Method Summary collapse
-
.cooperative(seconds) {|timeout| ... } ⇒ Object
Execute a block with a cooperative timeout.
-
.current_deadline ⇒ Deadline?
Return the current innermost deadline, or nil if none is active.
-
.deadline(seconds, name: nil, grace: nil, on_expire: nil) {|deadline| ... } ⇒ Object
Execute a block with a deadline.
Class Method Details
.cooperative(seconds) {|timeout| ... } ⇒ Object
Execute a block with a cooperative timeout. The block receives a timeout context that can be checked at safe cancellation points.
Unlike deadline, this is a simpler wrapper that does not support nesting.
53 54 55 56 |
# File 'lib/philiprehberger/timeout_kit.rb', line 53 def self.cooperative(seconds) dl = Deadline.new(seconds) yield dl end |
.current_deadline ⇒ Deadline?
Return the current innermost deadline, or nil if none is active.
61 62 63 64 |
# File 'lib/philiprehberger/timeout_kit.rb', line 61 def self.current_deadline stack = Thread.current[:philiprehberger_timeout_kit_deadlines] stack&.last end |
.deadline(seconds, name: nil, grace: nil, on_expire: nil) {|deadline| ... } ⇒ Object
Execute a block with a deadline. The block receives a Deadline object that can be used to check remaining time and whether the deadline has passed.
Deadlines can be nested. The innermost deadline is always the tightest constraint, but outer deadlines are also checked.
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/philiprehberger/timeout_kit.rb', line 24 def self.deadline(seconds, name: nil, grace: nil, on_expire: nil, &block) dl = Deadline.new(seconds, name: name, grace: grace, on_expire: on_expire) # Support nested deadlines: use the tightest constraint parent = current_deadline effective = if parent && parent.expires_at < dl.expires_at parent else dl end push_deadline(effective) begin block.call(effective) ensure pop_deadline end end |