lib/celluloid/internals/stack/states.rb
module Celluloid
module Internals
class Stack
module DisplayBacktrace
def display_backtrace(backtrace, output, indent = nil)
backtrace ||= ["EMPTY BACKTRACE"]
backtrace.each do |line|
output << indent if indent
output << "\t" << line << "\n"
end
output << "\n\n"
end
end
class TaskState < Struct.new(:task_class, :type, :meta, :status, :backtrace); end
class CellState < Struct.new(:subject_id, :subject_class)
def dump
"Celluloid::Cell 0x#{subject_id.to_s(16)}: #{subject_class}"
end
end
class ThreadState < Struct.new(:thread_id, :backtrace, :role)
include DisplayBacktrace
def dump
string = ""
string << "Thread 0x#{thread_id.to_s(16)} (#{role}):\n"
display_backtrace backtrace, string if backtrace
string
end
end
class ActorState
include DisplayBacktrace
attr_accessor :name, :id, :cell
attr_accessor :status, :tasks
attr_accessor :backtrace
def dump
string = ""
string << "Celluloid::Actor 0x#{id.to_s(16)}"
string << " [#{name}]" if name
string << "\n"
if cell
string << cell.dump
string << "\n"
end
if status == :idle
string << "State: Idle (waiting for messages)\n"
display_backtrace backtrace, string if backtrace
else
string << "State: Running (executing tasks)\n"
display_backtrace backtrace, string if backtrace
string << "\tTasks:\n"
tasks.each_with_index do |task, i|
string << "\t #{i + 1}) #{task.task_class}[#{task.type}]: #{task.status}\n"
if task.backtrace
string << "\t #{task.meta.inspect}\n"
display_backtrace task.backtrace, string, "\t"
end
end
end
string << "\n" unless backtrace
string
end
end
end
end
end