Class: Rubysh::Subprocess::PipeWrapper
- Inherits:
-
Object
- Object
- Rubysh::Subprocess::PipeWrapper
- Defined in:
- lib/rubysh/subprocess/pipe_wrapper.rb
Instance Attribute Summary collapse
-
#reader ⇒ Object
Returns the value of attribute reader.
-
#writer ⇒ Object
Returns the value of attribute writer.
Instance Method Summary collapse
- #close ⇒ Object
- #dump_json_and_close(msg) ⇒ Object
-
#initialize(reader_cloexec = true, writer_cloexec = true) ⇒ PipeWrapper
constructor
A new instance of PipeWrapper.
- #load_json_and_close ⇒ Object
- #nonblock ⇒ Object
- #read_only ⇒ Object
- #set_reader_cloexec ⇒ Object
- #set_writer_cloexec ⇒ Object
- #write_only ⇒ Object
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
#reader ⇒ Object
Returns the value of attribute reader.
15 16 17 |
# File 'lib/rubysh/subprocess/pipe_wrapper.rb', line 15 def reader @reader end |
#writer ⇒ Object
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
#close ⇒ Object
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_close ⇒ Object
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 |
#nonblock ⇒ Object
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_only ⇒ Object
23 24 25 |
# File 'lib/rubysh/subprocess/pipe_wrapper.rb', line 23 def read_only @writer.close end |
#set_reader_cloexec ⇒ Object
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_cloexec ⇒ Object
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_only ⇒ Object
27 28 29 |
# File 'lib/rubysh/subprocess/pipe_wrapper.rb', line 27 def write_only @reader.close end |