Class: FrugalTimeout::RequestQueue

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/frugal_timeout.rb

Overview

{{{1 RequestQueue

Instance Method Summary collapse

Constructor Details

#initializeRequestQueue

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

#purgeExpiredObject

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