/usr/lib/ruby/vendor_ruby/celluloid/tasks/task_thread.rb is in ruby-celluloid 0.16.0-4.
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 | module Celluloid
# Tasks with a Thread backend
class TaskThread < Task
# Run the given block within a task
def initialize(type, meta)
@resume_queue = Queue.new
@exception_queue = Queue.new
@yield_mutex = Mutex.new
@yield_cond = ConditionVariable.new
super
end
def create
# TODO: move this to ActorSystem#get_thread (ThreadHandle inside InternalPool)
@thread = ThreadHandle.new(Thread.current[:celluloid_actor_system], :task) do
begin
ex = @resume_queue.pop
raise ex if ex.is_a?(Task::TerminatedError)
yield
rescue Exception => ex
@exception_queue << ex
ensure
@yield_cond.signal
end
end
end
def signal
@yield_cond.signal
@resume_queue.pop
end
def deliver(value)
raise DeadTaskError, "cannot resume a dead task" unless @thread.alive?
@yield_mutex.synchronize do
@resume_queue.push(value)
@yield_cond.wait(@yield_mutex)
while @exception_queue.size > 0
raise @exception_queue.pop
end
end
rescue ThreadError
raise DeadTaskError, "cannot resume a dead task"
end
def backtrace
@thread.backtrace
end
end
end
|