class IRB::JobManager

Attributes

current_job[RW]

The active irb session

Public Class Methods

new() click to toggle source

Creates a new JobManager object

# File lib/irb/ext/multi-irb.rb, line 19
def initialize
  # @jobs = [[thread, irb],...]
  @jobs = []
  @current_job = nil
end

Public Instance Methods

delete(key) click to toggle source

Deletes the job at the given key.

# File lib/irb/ext/multi-irb.rb, line 124
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
insert(irb) click to toggle source

Add the given irb session to the jobs Array.

# File lib/irb/ext/multi-irb.rb, line 59
def insert(irb)
  @jobs.push [Thread.current, irb]
end
inspect() click to toggle source

Outputs a list of jobs, see the irb command irb_jobs, or jobs.

# File lib/irb/ext/multi-irb.rb, line 148
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
irb(key) click to toggle source

Returns the irb session for the given key object, see search for more information.

# File lib/irb/ext/multi-irb.rb, line 43
def irb(key)
  _, irb = search(key)
  irb
end
kill(*keys) click to toggle source

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 lib/irb/ext/multi-irb.rb, line 86
def kill(*keys)
  for key in keys
    th, _ = search(key)
    IRB.fail IrbAlreadyDead unless th.alive?
    th.exit
  end
end
main_irb() click to toggle source

Returns the top level irb session.

# File lib/irb/ext/multi-irb.rb, line 54
def main_irb
  @jobs[0][1]
end
main_thread() click to toggle source

Returns the top level thread.

# File lib/irb/ext/multi-irb.rb, line 49
def main_thread
  @jobs[0][0]
end
n_jobs() click to toggle source

The total number of irb sessions, used to set irb_name of the current Context.

# File lib/irb/ext/multi-irb.rb, line 30
def n_jobs
  @jobs.size
end
switch(key) click to toggle source

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 lib/irb/ext/multi-irb.rb, line 70
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
thread(key) click to toggle source

Returns the thread for the given key object, see search for more information.

# File lib/irb/ext/multi-irb.rb, line 36
def thread(key)
  th, = search(key)
  th
end