Class: Rubysh::Subprocess::PipeWrapper

Inherits:
Object
  • Object
show all
Defined in:
lib/rubysh/subprocess/pipe_wrapper.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(reader_cloexec = true, writer_cloexec = true) ⇒ PipeWrapper

Returns a new instance of PipeWrapper.



17
18
19
20
21
# File 'lib/rubysh/subprocess/pipe_wrapper.rb', line 17

def initialize(reader_cloexec=true, writer_cloexec=true)
  @reader, @writer = IO.pipe
  set_reader_cloexec if reader_cloexec
  set_writer_cloexec if writer_cloexec
end

Instance Attribute Details

#readerObject

Returns the value of attribute reader.



15
16
17
# File 'lib/rubysh/subprocess/pipe_wrapper.rb', line 15

def reader
  @reader
end

#writerObject

Returns the value of attribute writer.



15
16
17
# File 'lib/rubysh/subprocess/pipe_wrapper.rb', line 15

def writer
  @writer
end

Instance Method Details

#closeObject



31
32
33
34
# File 'lib/rubysh/subprocess/pipe_wrapper.rb', line 31

def close
  @writer.close
  @reader.close
end

#dump_json_and_close(msg) ⇒ Object



51
52
53
54
55
56
57
# File 'lib/rubysh/subprocess/pipe_wrapper.rb', line 51

def dump_json_and_close(msg)
  dumped = SERIALIZER.dump(msg)
  @writer.write(dumped)
ensure
  @writer.close
  Rubysh.assert(@reader.closed?, "Reader should already be closed")
end

#load_json_and_closeObject



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/rubysh/subprocess/pipe_wrapper.rb', line 59

def load_json_and_close
  contents = @reader.read
  return false if contents.length == 0

  begin
    SERIALIZER.load(contents)
  rescue ArgumentError => e
    # e.g. ArgumentError: syntax error on line 0, col 2: `' (could
    # happen if the subprocess was killed while writing a message)
    raise Rubysh::Error::BaseError.new("Invalid message read from pipe: #{e}")
  end
ensure
  @reader.close
  Rubysh.assert(@writer.closed?, "Writer should already be closed")
end

#nonblockObject



44
45
46
47
48
49
# File 'lib/rubysh/subprocess/pipe_wrapper.rb', line 44

def nonblock
  [@reader, @writer].each do |fd|
    fl = fd.fcntl(Fcntl::F_GETFL)
    fd.fcntl(Fcntl::F_SETFL, fl | Fcntl::O_NONBLOCK)
  end
end

#read_onlyObject



23
24
25
# File 'lib/rubysh/subprocess/pipe_wrapper.rb', line 23

def read_only
  @writer.close
end

#set_reader_cloexecObject



36
37
38
# File 'lib/rubysh/subprocess/pipe_wrapper.rb', line 36

def set_reader_cloexec
  @reader.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
end

#set_writer_cloexecObject



40
41
42
# File 'lib/rubysh/subprocess/pipe_wrapper.rb', line 40

def set_writer_cloexec
  @writer.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
end

#write_onlyObject



27
28
29
# File 'lib/rubysh/subprocess/pipe_wrapper.rb', line 27

def write_only
  @reader.close
end