Module: Expedite::Protocol

Defined in:
lib/expedite/protocol.rb

Instance Method Summary collapse

Instance Method Details

#recv_object(env) ⇒ Object



33
34
35
36
37
38
39
40
# File 'lib/expedite/protocol.rb', line 33

def recv_object(env)
  len = self.gets.to_i
  data = self.read(len)
  e = self.read(1)
  env.log "recv_object len=#{len} data=... e=#{e}"
  raise "Unexpected end #{e}" if e != "$"
  Marshal.load(data)
end

#recv_setup(env) ⇒ Object

Receive setup sockets. Returns the child_socket



59
60
61
62
63
64
# File 'lib/expedite/protocol.rb', line 59

def recv_setup(env)
  streams = 5.times.map { self.recv_io }
  [STDOUT, STDERR, STDIN].zip(streams[0..2]).each { |a, b| a.reopen(b) }
  env.log_file = streams[3]
  return streams
end

#send_exception(e, env) ⇒ Object

Result is an exception



17
18
19
20
21
22
23
24
# File 'lib/expedite/protocol.rb', line 17

def send_exception(e, env)
  if !e.is_a?(Expedite::Error)
    ie = Expedite::InvokeError.new("#{e.class}: #{e.message}")
    ie.set_backtrace(e.backtrace)
    e = ie
  end
  self.send_object({"exception" => e}, env)
end

#send_object(object, env) ⇒ Object



5
6
7
8
9
10
11
12
# File 'lib/expedite/protocol.rb', line 5

def send_object(object, env)
  env.log "send_object #{object.inspect}"
  data = Marshal.dump(object)

  self.puts  data.bytesize.to_i
  self.write data
  self.write "$"
end

#send_return(obj, env) ⇒ Object

Result is a normal return value



29
30
31
# File 'lib/expedite/protocol.rb', line 29

def send_return(obj, env)
  self.send_object({"return" => obj}, env)
end

#send_setup(child_socket, env) ⇒ Object

Send sockets for setup. Linux seems to require all fds to be sent first



47
48
49
50
51
52
53
# File 'lib/expedite/protocol.rb', line 47

def send_setup(child_socket, env)
  self.send_io STDOUT
  self.send_io STDERR
  self.send_io STDIN
  self.send_io env.log_file
  self.send_io child_socket
end