69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
# File 'lib/etna/filesystem.rb', line 69
def mkio(file, opts, size_hint: nil, &block)
rd, wd = IO.pipe
cmd = mkcommand(rd, wd, file, opts, size_hint: size_hint)
puts "in mkio: #{cmd}"
pid = spawn(*cmd)
q = Queue.new
closer = Thread.new do
_, status = Process.wait2 pid
q << status
end
begin
if opts.include?('w')
rd.close
yield wd
wd.close
else
wd.close
yield rd
rd.close
end
closer.join
rescue => e
wd.close
rd.close
Process.kill("HUP", pid)
raise e
end
status = q.pop
raise IOError.new("Failed to run external process, got status code #{status}") unless status.success?
end
|