open4 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/{open4-0.7.0.rb → open4-0.8.0.rb} +94 -46
- data/lib/open4.rb +94 -46
- data/open4-0.8.0.gem +0 -0
- metadata +4 -3
@@ -4,7 +4,7 @@ require 'thread'
|
|
4
4
|
|
5
5
|
module Open4
|
6
6
|
#--{{{
|
7
|
-
VERSION = '0.
|
7
|
+
VERSION = '0.8.0'
|
8
8
|
def self.version() VERSION end
|
9
9
|
|
10
10
|
class Error < ::StandardError; end
|
@@ -76,8 +76,6 @@ module Open4
|
|
76
76
|
module_function :popen4
|
77
77
|
module_function :open4
|
78
78
|
|
79
|
-
|
80
|
-
|
81
79
|
class SpawnError < Error
|
82
80
|
#--{{{
|
83
81
|
attr 'cmd'
|
@@ -103,16 +101,26 @@ module Open4
|
|
103
101
|
#--{{{
|
104
102
|
attr 'threads'
|
105
103
|
|
106
|
-
def initialize
|
107
|
-
@threads, @argv, @done, @running = [], [], Queue.new, false
|
104
|
+
def initialize cid
|
105
|
+
@cid, @threads, @argv, @done, @running = @cid, [], [], Queue.new, false
|
106
|
+
@killed = false
|
108
107
|
end
|
109
108
|
|
110
109
|
def add_thread *a, &b
|
111
110
|
@running ? raise : (@argv << [a, b])
|
112
111
|
end
|
113
112
|
|
113
|
+
#
|
114
|
+
# take down process more nicely
|
115
|
+
#
|
114
116
|
def killall
|
115
|
-
|
117
|
+
c = Thread.critical
|
118
|
+
return nil if @killed
|
119
|
+
Thread.critical = true
|
120
|
+
(@threads - [Thread.current]).each{|t| t.kill rescue nil}
|
121
|
+
@killed = true
|
122
|
+
ensure
|
123
|
+
Thread.critical = c
|
116
124
|
end
|
117
125
|
|
118
126
|
def run
|
@@ -185,41 +193,43 @@ module Open4
|
|
185
193
|
|
186
194
|
def relay src, dst = nil, t = nil
|
187
195
|
#--{{{
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
196
|
+
unless src.nil?
|
197
|
+
if src.respond_to? :gets
|
198
|
+
while buf = to(t){ src.gets }
|
199
|
+
dst << buf if dst
|
200
|
+
end
|
192
201
|
|
193
|
-
|
194
|
-
|
195
|
-
|
202
|
+
elsif src.respond_to? :each
|
203
|
+
q = Queue.new
|
204
|
+
th = nil
|
196
205
|
|
197
|
-
|
198
|
-
|
199
|
-
|
206
|
+
timer_set = lambda do |t|
|
207
|
+
th = new_thread{ to(t){ q.pop } }
|
208
|
+
end
|
200
209
|
|
201
|
-
|
202
|
-
|
203
|
-
|
210
|
+
timer_cancel = lambda do |t|
|
211
|
+
th.kill if th rescue nil
|
212
|
+
end
|
204
213
|
|
205
|
-
|
206
|
-
|
207
|
-
|
214
|
+
timer_set[t]
|
215
|
+
begin
|
216
|
+
src.each do |buf|
|
217
|
+
timer_cancel[t]
|
218
|
+
dst << buf if dst
|
219
|
+
timer_set[t]
|
220
|
+
end
|
221
|
+
ensure
|
208
222
|
timer_cancel[t]
|
209
|
-
dst << buf if dst
|
210
|
-
timer_set[t]
|
211
223
|
end
|
212
|
-
ensure
|
213
|
-
timer_cancel[t]
|
214
|
-
end
|
215
224
|
|
216
|
-
|
217
|
-
|
218
|
-
|
225
|
+
elsif src.respond_to? :read
|
226
|
+
buf = to(t){ src.read }
|
227
|
+
dst << buf if dst
|
219
228
|
|
220
|
-
|
221
|
-
|
222
|
-
|
229
|
+
else
|
230
|
+
buf = to(t){ src.to_s }
|
231
|
+
dst << buf if dst
|
232
|
+
end
|
223
233
|
end
|
224
234
|
#--}}}
|
225
235
|
end
|
@@ -263,26 +273,26 @@ module Open4
|
|
263
273
|
popen4(cmd) do |c, i, o, e|
|
264
274
|
started = true
|
265
275
|
|
266
|
-
%w( pid= << push update ).each do |msg|
|
276
|
+
%w( replace pid= << push update ).each do |msg|
|
267
277
|
break(pid.send(msg, c)) if pid.respond_to? msg
|
268
278
|
end
|
269
279
|
|
270
|
-
|
280
|
+
te = ThreadEnsemble.new c
|
271
281
|
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
282
|
+
te.add_thread(i, stdin) do |i, stdin|
|
283
|
+
relay stdin, i, stdin_timeout
|
284
|
+
i.close rescue nil
|
285
|
+
end
|
276
286
|
|
277
|
-
|
278
|
-
|
279
|
-
|
287
|
+
te.add_thread(o, stdout) do |o, stdout|
|
288
|
+
relay o, stdout, stdout_timeout
|
289
|
+
end
|
280
290
|
|
281
|
-
|
282
|
-
|
283
|
-
|
291
|
+
te.add_thread(e, stderr) do |o, stderr|
|
292
|
+
relay e, stderr, stderr_timeout
|
293
|
+
end
|
284
294
|
|
285
|
-
|
295
|
+
te.run
|
286
296
|
end
|
287
297
|
end
|
288
298
|
rescue
|
@@ -316,6 +326,44 @@ module Open4
|
|
316
326
|
alias bg background
|
317
327
|
module_function :background
|
318
328
|
module_function :bg
|
329
|
+
|
330
|
+
def maim pid, opts = {}
|
331
|
+
#--{{{
|
332
|
+
getopt = getopts opts
|
333
|
+
sigs = getopt[ 'signals', %w(SIGTERM SIGQUIT SIGKILL) ]
|
334
|
+
suspend = getopt[ 'suspend', 4 ]
|
335
|
+
pid = Integer pid
|
336
|
+
existed = false
|
337
|
+
sigs.each do |sig|
|
338
|
+
begin
|
339
|
+
Process.kill sig, pid
|
340
|
+
existed = true
|
341
|
+
rescue Errno::ESRCH
|
342
|
+
return(existed ? nil : true)
|
343
|
+
end
|
344
|
+
return true unless alive? pid
|
345
|
+
sleep suspend
|
346
|
+
return true unless alive? pid
|
347
|
+
end
|
348
|
+
return(not alive?(pid))
|
349
|
+
#--}}}
|
350
|
+
end
|
351
|
+
module_function :maim
|
352
|
+
|
353
|
+
def alive pid
|
354
|
+
#--{{{
|
355
|
+
pid = Integer pid
|
356
|
+
begin
|
357
|
+
Process.kill 0, pid
|
358
|
+
true
|
359
|
+
rescue Errno::ESRCH
|
360
|
+
false
|
361
|
+
end
|
362
|
+
#--}}}
|
363
|
+
end
|
364
|
+
alias alive? alive
|
365
|
+
module_function :alive
|
366
|
+
module_function :'alive?'
|
319
367
|
#--}}}
|
320
368
|
end
|
321
369
|
|
data/lib/open4.rb
CHANGED
@@ -4,7 +4,7 @@ require 'thread'
|
|
4
4
|
|
5
5
|
module Open4
|
6
6
|
#--{{{
|
7
|
-
VERSION = '0.
|
7
|
+
VERSION = '0.8.0'
|
8
8
|
def self.version() VERSION end
|
9
9
|
|
10
10
|
class Error < ::StandardError; end
|
@@ -76,8 +76,6 @@ module Open4
|
|
76
76
|
module_function :popen4
|
77
77
|
module_function :open4
|
78
78
|
|
79
|
-
|
80
|
-
|
81
79
|
class SpawnError < Error
|
82
80
|
#--{{{
|
83
81
|
attr 'cmd'
|
@@ -103,16 +101,26 @@ module Open4
|
|
103
101
|
#--{{{
|
104
102
|
attr 'threads'
|
105
103
|
|
106
|
-
def initialize
|
107
|
-
@threads, @argv, @done, @running = [], [], Queue.new, false
|
104
|
+
def initialize cid
|
105
|
+
@cid, @threads, @argv, @done, @running = @cid, [], [], Queue.new, false
|
106
|
+
@killed = false
|
108
107
|
end
|
109
108
|
|
110
109
|
def add_thread *a, &b
|
111
110
|
@running ? raise : (@argv << [a, b])
|
112
111
|
end
|
113
112
|
|
113
|
+
#
|
114
|
+
# take down process more nicely
|
115
|
+
#
|
114
116
|
def killall
|
115
|
-
|
117
|
+
c = Thread.critical
|
118
|
+
return nil if @killed
|
119
|
+
Thread.critical = true
|
120
|
+
(@threads - [Thread.current]).each{|t| t.kill rescue nil}
|
121
|
+
@killed = true
|
122
|
+
ensure
|
123
|
+
Thread.critical = c
|
116
124
|
end
|
117
125
|
|
118
126
|
def run
|
@@ -185,41 +193,43 @@ module Open4
|
|
185
193
|
|
186
194
|
def relay src, dst = nil, t = nil
|
187
195
|
#--{{{
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
196
|
+
unless src.nil?
|
197
|
+
if src.respond_to? :gets
|
198
|
+
while buf = to(t){ src.gets }
|
199
|
+
dst << buf if dst
|
200
|
+
end
|
192
201
|
|
193
|
-
|
194
|
-
|
195
|
-
|
202
|
+
elsif src.respond_to? :each
|
203
|
+
q = Queue.new
|
204
|
+
th = nil
|
196
205
|
|
197
|
-
|
198
|
-
|
199
|
-
|
206
|
+
timer_set = lambda do |t|
|
207
|
+
th = new_thread{ to(t){ q.pop } }
|
208
|
+
end
|
200
209
|
|
201
|
-
|
202
|
-
|
203
|
-
|
210
|
+
timer_cancel = lambda do |t|
|
211
|
+
th.kill if th rescue nil
|
212
|
+
end
|
204
213
|
|
205
|
-
|
206
|
-
|
207
|
-
|
214
|
+
timer_set[t]
|
215
|
+
begin
|
216
|
+
src.each do |buf|
|
217
|
+
timer_cancel[t]
|
218
|
+
dst << buf if dst
|
219
|
+
timer_set[t]
|
220
|
+
end
|
221
|
+
ensure
|
208
222
|
timer_cancel[t]
|
209
|
-
dst << buf if dst
|
210
|
-
timer_set[t]
|
211
223
|
end
|
212
|
-
ensure
|
213
|
-
timer_cancel[t]
|
214
|
-
end
|
215
224
|
|
216
|
-
|
217
|
-
|
218
|
-
|
225
|
+
elsif src.respond_to? :read
|
226
|
+
buf = to(t){ src.read }
|
227
|
+
dst << buf if dst
|
219
228
|
|
220
|
-
|
221
|
-
|
222
|
-
|
229
|
+
else
|
230
|
+
buf = to(t){ src.to_s }
|
231
|
+
dst << buf if dst
|
232
|
+
end
|
223
233
|
end
|
224
234
|
#--}}}
|
225
235
|
end
|
@@ -263,26 +273,26 @@ module Open4
|
|
263
273
|
popen4(cmd) do |c, i, o, e|
|
264
274
|
started = true
|
265
275
|
|
266
|
-
%w( pid= << push update ).each do |msg|
|
276
|
+
%w( replace pid= << push update ).each do |msg|
|
267
277
|
break(pid.send(msg, c)) if pid.respond_to? msg
|
268
278
|
end
|
269
279
|
|
270
|
-
|
280
|
+
te = ThreadEnsemble.new c
|
271
281
|
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
282
|
+
te.add_thread(i, stdin) do |i, stdin|
|
283
|
+
relay stdin, i, stdin_timeout
|
284
|
+
i.close rescue nil
|
285
|
+
end
|
276
286
|
|
277
|
-
|
278
|
-
|
279
|
-
|
287
|
+
te.add_thread(o, stdout) do |o, stdout|
|
288
|
+
relay o, stdout, stdout_timeout
|
289
|
+
end
|
280
290
|
|
281
|
-
|
282
|
-
|
283
|
-
|
291
|
+
te.add_thread(e, stderr) do |o, stderr|
|
292
|
+
relay e, stderr, stderr_timeout
|
293
|
+
end
|
284
294
|
|
285
|
-
|
295
|
+
te.run
|
286
296
|
end
|
287
297
|
end
|
288
298
|
rescue
|
@@ -316,6 +326,44 @@ module Open4
|
|
316
326
|
alias bg background
|
317
327
|
module_function :background
|
318
328
|
module_function :bg
|
329
|
+
|
330
|
+
def maim pid, opts = {}
|
331
|
+
#--{{{
|
332
|
+
getopt = getopts opts
|
333
|
+
sigs = getopt[ 'signals', %w(SIGTERM SIGQUIT SIGKILL) ]
|
334
|
+
suspend = getopt[ 'suspend', 4 ]
|
335
|
+
pid = Integer pid
|
336
|
+
existed = false
|
337
|
+
sigs.each do |sig|
|
338
|
+
begin
|
339
|
+
Process.kill sig, pid
|
340
|
+
existed = true
|
341
|
+
rescue Errno::ESRCH
|
342
|
+
return(existed ? nil : true)
|
343
|
+
end
|
344
|
+
return true unless alive? pid
|
345
|
+
sleep suspend
|
346
|
+
return true unless alive? pid
|
347
|
+
end
|
348
|
+
return(not alive?(pid))
|
349
|
+
#--}}}
|
350
|
+
end
|
351
|
+
module_function :maim
|
352
|
+
|
353
|
+
def alive pid
|
354
|
+
#--{{{
|
355
|
+
pid = Integer pid
|
356
|
+
begin
|
357
|
+
Process.kill 0, pid
|
358
|
+
true
|
359
|
+
rescue Errno::ESRCH
|
360
|
+
false
|
361
|
+
end
|
362
|
+
#--}}}
|
363
|
+
end
|
364
|
+
alias alive? alive
|
365
|
+
module_function :alive
|
366
|
+
module_function :'alive?'
|
319
367
|
#--}}}
|
320
368
|
end
|
321
369
|
|
data/open4-0.8.0.gem
ADDED
File without changes
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: open4
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2006-09-
|
6
|
+
version: 0.8.0
|
7
|
+
date: 2006-09-25 00:00:00.000000 -06:00
|
8
8
|
summary: open4
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -34,6 +34,7 @@ files:
|
|
34
34
|
- lib
|
35
35
|
- README
|
36
36
|
- gemspec.rb
|
37
|
+
- open4-0.8.0.gem
|
37
38
|
- sample/block.rb
|
38
39
|
- sample/simple.rb
|
39
40
|
- sample/exception.rb
|
@@ -42,7 +43,7 @@ files:
|
|
42
43
|
- sample/timeout.rb
|
43
44
|
- sample/stdin_timeout.rb
|
44
45
|
- lib/open4.rb
|
45
|
-
- lib/open4-0.
|
46
|
+
- lib/open4-0.8.0.rb
|
46
47
|
test_files: []
|
47
48
|
rdoc_options: []
|
48
49
|
extra_rdoc_files: []
|