123456789_123456789_123456789_123456789_123456789_

Class: IRB::JobManager

Do not use. This class is for internal use only.
Relationships & Source Files
Inherits: Object
Defined in: lib/irb/ext/multi-irb.rb

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.newJobManager

Creates a new JobManager object

[ GitHub ]

  
# File 'lib/irb/ext/multi-irb.rb', line 11

def initialize
  @jobs = []
  @current_job = nil
end

Instance Attribute Details

#current_job (rw)

The active irb session

[ GitHub ]

  
# File 'lib/irb/ext/multi-irb.rb', line 17

attr_accessor :current_job

Instance Method Details

#delete(key)

Deletes the job at the given key.

[ GitHub ]

  
# File 'lib/irb/ext/multi-irb.rb', line 115

def delete(key)
  case key
  when Integer
    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
      fail NoSuchJob, key
    end
  end
  until assoc = @jobs.pop; end unless @jobs.empty?
  @jobs.push assoc
end

#insert(irb)

Add the given #irb session to the jobs Array.

[ GitHub ]

  
# File 'lib/irb/ext/multi-irb.rb', line 50

def insert(irb)
  @jobs.push [Thread.current, irb]
end

#inspect

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

[ GitHub ]

  
# File 'lib/irb/ext/multi-irb.rb', line 139

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)

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

[ GitHub ]

  
# File 'lib/irb/ext/multi-irb.rb', line 34

def irb(key)
  _, irb = search(key)
  irb
end

#kill(*keys)

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.

[ GitHub ]

  
# File 'lib/irb/ext/multi-irb.rb', line 77

def kill(*keys)
  for key in keys
    th, _ = search(key)
    fail IrbAlreadyDead unless th.alive?
    th.exit
  end
end

#main_irb

Returns the top level irb session.

[ GitHub ]

  
# File 'lib/irb/ext/multi-irb.rb', line 45

def main_irb
  @jobs[0][1]
end

#main_thread

Returns the top level thread.

[ GitHub ]

  
# File 'lib/irb/ext/multi-irb.rb', line 40

def main_thread
  @jobs[0][0]
end

#n_jobs

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

[ GitHub ]

  
# File 'lib/irb/ext/multi-irb.rb', line 21

def n_jobs
  @jobs.size
end

#search(key)

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.

[ GitHub ]

  
# File 'lib/irb/ext/multi-irb.rb', line 99

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
  fail NoSuchJob, key if job.nil?
  job
end

#switch(key)

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.

[ GitHub ]

  
# File 'lib/irb/ext/multi-irb.rb', line 61

def switch(key)
  th, irb = search(key)
  fail IrbAlreadyDead unless th.alive?
  fail IrbSwitchedToCurrentThread if th == Thread.current
  @current_job = irb
  th.run
  Thread.stop
  @current_job = irb(Thread.current)
end

#thread(key)

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

[ GitHub ]

  
# File 'lib/irb/ext/multi-irb.rb', line 27

def thread(key)
  th, = search(key)
  th
end