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 385
def max
@max
end
Sets the maximum size of the queue.
# File thread.rb, line 392
def max=(max)
Thread.critical = true
if max <= @max
@max = max
Thread.critical = false
else
diff = max - @max
@max = max
Thread.critical = false
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 thread.rb, line 473
def num_waiting
@waiting.size + @queue_wait.size
end
Retrieves data from the queue and runs a waiting thread, if any.
# File thread.rb, line 440
def pop(*args)
retval = super
Thread.critical = true
if @que.length < @max
begin
t = @queue_wait.shift
t.wakeup if t
rescue ThreadError
retry
ensure
Thread.critical = false
end
begin
t.run if t
rescue ThreadError
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 417
def push(obj)
Thread.critical = true
while @que.length >= @max
@queue_wait.push Thread.current
Thread.stop
Thread.critical = true
end
super
end