This class represents queues of specified size capacity. The push operation may be blocked if the capacity is full.
See Queue for an example of how a SizedQueue works.
Returns the maximum size of the queue.
# File thread.rb, line 276
def max
@max
end
Sets the maximum size of the queue.
# File thread.rb, line 283
def max=(max)
raise ArgumentError, "queue size must be positive" unless max > 0
@mutex.synchronize do
if max <= @max
@max = max
else
diff = max - @max
@max = max
diff.times do
@enque_cond.signal
end
end
end
max
end
Returns the number of threads waiting on the queue.
# File thread.rb, line 360
def num_waiting
@num_waiting + @num_enqueue_waiting
end
Retrieves data from the queue and runs a waiting thread, if any.
# File thread.rb, line 337
def pop(*args)
retval = super
@mutex.synchronize do
if @que.length < @max
@enque_cond.signal
end
end
retval
end
Pushes obj to the queue. If there is no space left in the
queue, waits until space becomes available.
# File thread.rb, line 304
def push(obj)
Thread.handle_interrupt(RuntimeError => :on_blocking) do
@mutex.synchronize do
while true
break if @que.length < @max
@num_enqueue_waiting += 1
begin
@enque_cond.wait @mutex
ensure
@num_enqueue_waiting -= 1
end
end
@que.push obj
@cond.signal
end
self
end
end