In Files
- irb/ext/multi-irb.rb
Parent
Class/Module Index
- IRB::Abort
- IRB::Context
- IRB::ContextExtender
- IRB::ExtendCommandBundle
- IRB::FileInputMethod
- IRB::Frame
- IRB::InputMethod
- IRB::Inspector
- IRB::Irb
- IRB::IrbLoader
- IRB::JobManager
- IRB::LoadAbort
- IRB::MethodExtender
- IRB::Notifier
- IRB::Notifier::AbstractNotifier
- IRB::Notifier::CompositeNotifier
- IRB::Notifier::LeveledNotifier
- IRB::Notifier::NoMsgNotifier
- IRB::OutputMethod
- IRB::ReadlineInputMethod
- IRB::StdioInputMethod
- IRB::StdioOutputMethod
- IRB::WorkSpace
- Object
- XMP
- XMP::StringInputMethod
IRB::JobManager
Public Class Methods
Creates a new JobManager object
# File irb/ext/multi-irb.rb, line 19 def initialize @jobs = [] @current_job = nil end
Public Instance Methods
Deletes the job at the given key
.
# File irb/ext/multi-irb.rb, line 123 def delete(key) case key when Integer IRB.fail NoSuchJob, key unless @jobs[key] @jobs[key] = nil else catch(:EXISTS) do @jobs.each_index do |i| if @jobs[i] and (@jobs[i][0] == key || @jobs[i][1] == key || @jobs[i][1].context.main.equal?(key)) @jobs[i] = nil throw :EXISTS end end IRB.fail NoSuchJob, key end end until assoc = @jobs.pop; end unless @jobs.empty? @jobs.push assoc end
Add the given irb
session to the jobs Array.
# File irb/ext/multi-irb.rb, line 58 def insert(irb) @jobs.push [Thread.current, irb] end
Outputs a list of jobs, see the irb command irb_jobs
, or
jobs
.
# File irb/ext/multi-irb.rb, line 147 def inspect ary = [] @jobs.each_index do |i| th, irb = @jobs[i] next if th.nil? if th.alive? if th.stop? t_status = "stop" else t_status = "running" end else t_status = "exited" end ary.push format("#%d->%s on %s (%s: %s)", i, irb.context.irb_name, irb.context.main, th, t_status) end ary.join("\n") end
Returns the irb session for the given key
object, see search for more information.
# File irb/ext/multi-irb.rb, line 42 def irb(key) _, irb = search(key) irb end
Terminates the irb sessions specified by the given keys
.
Raises an IrbAlreadyDead exception if one of the given keys
is
already terminated.
See Thread#exit for more information.
# File irb/ext/multi-irb.rb, line 85 def kill(*keys) for key in keys th, _ = search(key) IRB.fail IrbAlreadyDead unless th.alive? th.exit end end
Returns the top level irb session.
# File irb/ext/multi-irb.rb, line 53 def main_irb @jobs[0][1] end
Returns the top level thread.
# File irb/ext/multi-irb.rb, line 48 def main_thread @jobs[0][0] end
The total number of irb sessions, used to set irb_name
of the
current Context.
# File irb/ext/multi-irb.rb, line 29 def n_jobs @jobs.size end
Returns the associated job for the given key
.
If given an Integer, it will return the key
index for the jobs
Array.
When an instance of Irb is given, it will return the
irb session associated with key
.
If given an instance of Thread, it will return the associated thread
key
using Object#=== on the jobs Array.
Otherwise returns the irb session with the same top-level binding as the
given key
.
Raises a NoSuchJob exception if no job can be found with the given
key
.
# File irb/ext/multi-irb.rb, line 107 def search(key) job = case key when Integer @jobs[key] when Irb @jobs.find{|k, v| v.equal?(key)} when Thread @jobs.assoc(key) else @jobs.find{|k, v| v.context.main.equal?(key)} end IRB.fail NoSuchJob, key if job.nil? job end
Changes the current active irb session to the given key
in the
jobs Array.
Raises an IrbAlreadyDead exception if the given key
is no
longer alive.
If the given irb session is already active, an IrbSwitchedToCurrentThread exception is raised.
# File irb/ext/multi-irb.rb, line 69 def switch(key) th, irb = search(key) IRB.fail IrbAlreadyDead unless th.alive? IRB.fail IrbSwitchedToCurrentThread if th == Thread.current @current_job = irb th.run Thread.stop @current_job = irb(Thread.current) end
Returns the thread for the given key
object, see search for more information.
# File irb/ext/multi-irb.rb, line 35 def thread(key) th, = search(key) th end