/usr/lib/ruby/vendor_ruby/em/queue.rb is in ruby-eventmachine 0.12.10-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | module EventMachine
# A cross thread, reactor scheduled, linear queue.
#
# This class provides a simple "Queue" like abstraction on top of the reactor
# scheduler. It services two primary purposes:
# * API sugar for stateful protocols
# * Pushing processing onto the same thread as the reactor
#
# See examples/ex_queue.rb for a detailed example.
#
# q = EM::Queue.new
# q.push('one', 'two', 'three')
# 3.times do
# q.pop{ |msg| puts(msg) }
# end
#
class Queue
# Create a new queue
def initialize
@items = []
@popq = []
end
# Pop items off the queue, running the block on the reactor thread. The pop
# will not happen immediately, but at some point in the future, either in
# the next tick, if the queue has data, or when the queue is populated.
def pop(*a, &b)
cb = EM::Callback(*a, &b)
EM.schedule do
if @items.empty?
@popq << cb
else
cb.call @items.shift
end
end
nil # Always returns nil
end
# Push items onto the queue in the reactor thread. The items will not appear
# in the queue immediately, but will be scheduled for addition during the
# next reactor tick.
def push(*items)
EM.schedule do
@items.push(*items)
@popq.shift.call @items.shift until @items.empty? || @popq.empty?
end
end
alias :<< :push
# N.B. This is a peek, it's not thread safe, and may only tend toward
# accuracy.
def empty?
@items.empty?
end
# N.B. This is a peek, it's not thread safe, and may only tend toward
# accuracy.
def size
@items.size
end
end
end
|