Class: FrugalTimeout::RequestQueue
- Inherits:
-
Object
- Object
- FrugalTimeout::RequestQueue
- Extended by:
- Forwardable
- Defined in:
- lib/frugal_timeout.rb
Overview
{{{1 RequestQueue
Instance Method Summary collapse
-
#initialize ⇒ RequestQueue
constructor
A new instance of RequestQueue.
- #onNewNearestRequest(&b) ⇒ Object
-
#purgeExpired ⇒ Object
Purge and enforce expired timeouts.
- #queue(sec, klass) ⇒ Object
Constructor Details
#initialize ⇒ RequestQueue
Returns a new instance of RequestQueue.
91 92 93 |
# File 'lib/frugal_timeout.rb', line 91 def initialize @onNewNearestRequest, @requests = proc {}, SortedQueue.new end |
Instance Method Details
#onNewNearestRequest(&b) ⇒ Object
100 101 102 |
# File 'lib/frugal_timeout.rb', line 100 def onNewNearestRequest &b @onNewNearestRequest = b end |
#purgeExpired ⇒ Object
Purge and enforce expired timeouts. Only enforce once for each thread, even if multiple timeouts for that thread expire at once.
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/frugal_timeout.rb', line 106 def purgeExpired expiredRequests, filter, now = nil, {}, MonotonicTime.now @requests.synchronize { @requests.reject_and_get! { |r| r.at <= now }.each { |r| next if filter[r.thread] r.enforceTimeout defuse_thread! r.thread filter[r.thread] = true } # It's necessary to call onNewNearestRequest inside synchronize as other # threads may #queue requests. @onNewNearestRequest.call @requests.first unless @requests.empty? } end |
#queue(sec, klass) ⇒ Object
123 124 125 126 127 128 129 130 |
# File 'lib/frugal_timeout.rb', line 123 def queue sec, klass @requests.synchronize { @requests << (request = Request.new(Thread.current, MonotonicTime.now + sec, klass)) @onNewNearestRequest.call(request) if @requests.first == request request } end |