# 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 17
    def initialize
      @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 121
    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) click to toggle source

Add the given `irb` session to the jobs `Array`.

    # File lib/irb/ext/multi-irb.rb, line 56
    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 145
    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 40
    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 83
    def kill(*keys)
      for key in keys
        th, _ = search(key)
        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 51
    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 46
    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 27
    def n_jobs
      @jobs.size
    end

search(key) click to toggle source

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 lib/irb/ext/multi-irb.rb, line 105
    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) 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 67
    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) 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 33
    def thread(key)
      th, = search(key)
      th
    end