In Files

  • irb/ext/multi-irb.rb

IRB::JobManager

job management class

Attributes

current_job[RW]

Public Class Methods

new() click to toggle source
 
               # File irb/ext/multi-irb.rb, line 20
def initialize
  # @jobs = [[thread, irb],...]
  @jobs = []
  @current_job = nil
end
            

Public Instance Methods

delete(key) click to toggle source
 
               # File irb/ext/multi-irb.rb, line 87
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
 
               # File irb/ext/multi-irb.rb, line 50
def insert(irb)
  @jobs.push [Thread.current, irb]
end
            
inspect() click to toggle source
 
               # File irb/ext/multi-irb.rb, line 110
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
 
               # File irb/ext/multi-irb.rb, line 37
def irb(key)
  th, irb = search(key)
  irb
end
            
kill(*keys) click to toggle source
 
               # File irb/ext/multi-irb.rb, line 64
def kill(*keys)
  for key in keys
    th, irb = search(key)
    IRB.fail IrbAlreadyDead unless th.alive?
    th.exit
  end
end
            
main_irb() click to toggle source
 
               # File irb/ext/multi-irb.rb, line 46
def main_irb
  @jobs[0][1]
end
            
main_thread() click to toggle source
 
               # File irb/ext/multi-irb.rb, line 42
def main_thread
  @jobs[0][0]
end
            
n_jobs() click to toggle source
 
               # File irb/ext/multi-irb.rb, line 28
def n_jobs
  @jobs.size
end
            
search(key) click to toggle source
 
               # File irb/ext/multi-irb.rb, line 72
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
            
switch(key) click to toggle source
 
               # File irb/ext/multi-irb.rb, line 54
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
 
               # File irb/ext/multi-irb.rb, line 32
def thread(key)
  th, irb = search(key)
  th
end