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.
Creates a fixed-length queue with a maximum size of max
.
# File rake/lib/thread.rb, line 251 def initialize(max) raise ArgumentError, "queue size must be positive" unless max > 0 @max = max @queue_wait = [] @queue_wait.taint # enable tainted comunication super() end
Returns the maximum size of the queue.
# File rake/lib/thread.rb, line 262 def max @max end
Sets the maximum size of the queue.
# File rake/lib/thread.rb, line 269 def max=(max) diff = nil @mutex.synchronize { if max <= @max @max = max else diff = max - @max @max = max end } if diff diff.times do begin t = @queue_wait.shift t.run if t rescue ThreadError retry end end end max end
Returns the number of threads waiting on the queue.
# File rake/lib/thread.rb, line 355 def num_waiting @waiting.size + @queue_wait.size end
Retrieves data from the queue and runs a waiting thread, if any.
# File rake/lib/thread.rb, line 327 def pop(*args) retval = super @mutex.synchronize { if @que.length < @max begin t = @queue_wait.shift t.wakeup if t rescue ThreadError retry end end } retval end
Pushes obj
to the queue. If there is no space left in the
queue, waits until space becomes available.
# File rake/lib/thread.rb, line 296 def push(obj) @mutex.synchronize{ while true break if @que.length < @max @queue_wait.push Thread.current @mutex.sleep end @que.push obj begin t = @waiting.shift t.wakeup if t rescue ThreadError retry end } end