class VirtualModule::FileIpcInterface

Constants

INPUT
MAIN_LOOP
OUTPUT

Public Class Methods

new(provider) click to toggle source
Calls superclass method VirtualModule::BaseIpcInterface::new
# File lib/virtual_module.rb, line 536
def initialize(provider)
  super
  File.mkfifo("#{@work_dir}/#{INPUT}")
  File.mkfifo("#{@work_dir}/#{OUTPUT}")
  at_exit do
    Process.kill(:KILL, @pid) if !@pid.nil?
    FileUtils.remove_entry @work_dir if File.directory?(@work_dir)
  end
end

Public Instance Methods

call(receiver, name, *args, **kwargs) click to toggle source
# File lib/virtual_module.rb, line 546
def call(receiver, name, *args, **kwargs)
  #require 'byebug'
  #byebug
  if Helper.is_installed?(@provider.lang)
    enqueue @provider.generate_message("#{@work_dir}/#{INPUT}", receiver, name, *args, **kwargs)
  elsif Helper.is_installed?(:docker)
    enqueue @provider.generate_message("/opt/#{INPUT}", receiver, name, *args, **kwargs)
  else
    raise Exception.new("Either #{@provider.lang} or docker command is required to run virtual_module")
  end
  response = dequeue
  case response[0..5]
  when "\xC1VMERR" then raise RuntimeException, "An error occurred while executing the command in #{@provider.lang} process: " + response[6..-1]
  when "\xC1VMOBJ" then raise StandardError.new(response)
  else
    begin
      MessagePack.unpack(response)
    rescue
      raise StandardError.new(response)
    end
  end
end
reset(source) click to toggle source
Calls superclass method VirtualModule::BaseIpcInterface#reset
# File lib/virtual_module.rb, line 574
def reset(source)
  super
  restart_server_process
end
serialize(object_lookup_id) click to toggle source
# File lib/virtual_module.rb, line 569
def serialize(object_lookup_id)
  enqueue "\n#{object_lookup_id}"
  dequeue
end

Private Instance Methods

dequeue() click to toggle source
# File lib/virtual_module.rb, line 615
def dequeue
  File.open("#{@work_dir}/#{OUTPUT}", 'r'){|f| f.read}
end
enqueue(message) click to toggle source
# File lib/virtual_module.rb, line 611
def enqueue(message)
  File.write("#{@work_dir}/#{INPUT}", message)
end
restart_server_process() click to toggle source
# File lib/virtual_module.rb, line 580
def restart_server_process
  if !@pid.nil?
    begin
      Process.getpgid(@pid)
      Process.kill(:KILL, @pid)
    rescue Errno::ESRCH
    end
    @pid=nil
  end
  File.write("#{@work_dir}/#{LIB_SCRIPT}.#{@provider.class::EXT}", @provider.lib_script)
  File.write("#{@work_dir}/#{MAIN_LOOP}.#{@provider.class::EXT}", @provider.main_loop("#{@work_dir}/#{INPUT}", "#{@work_dir}/#{OUTPUT}", LIB_SCRIPT))
  case @provider.lang
  when :julia
    if Helper.is_installed?(:julia)
      command = "julia --depwarn=no -L #{@work_dir}/#{LIB_SCRIPT}.#{@provider.class::EXT} #{@work_dir}/#{MAIN_LOOP}.#{@provider.class::EXT}"
    elsif Helper.is_installed?(:docker)
      command = "docker run -v #{@work_dir}/:/opt/ remore/virtual_module julia --depwarn=no -L /opt/#{LIB_SCRIPT}.#{@provider.class::EXT} /opt/#{MAIN_LOOP}.#{@provider.class::EXT}"
    else
      raise Exception.new("Either julia or docker command is required to run virtual_module")
    end
  when :python
    # -B : Prevent us from creating *.pyc cache - this will be problematic when we call #virtual_module_eval repeatedly.
    command = "python -B #{@work_dir}/#{MAIN_LOOP}.#{@provider.class::EXT}"
  else
    raise Exception.new("Unsupported language was specified")
  end
  @pid = Process.spawn(command, :err => :out,:out => "/dev/null") # , :pgroup => Process.pid)
  #@pid = Process.spawn(command) # , :pgroup => Process.pid)
  Process.detach @pid
end