'status waits for port-managing threads
svn: r2526
This commit is contained in:
parent
d6bb606ab5
commit
c5492262fc
|
@ -98,33 +98,43 @@
|
|||
(sync subp si)
|
||||
(semaphore-wait it-ready)
|
||||
(break-thread si))))
|
||||
(list (aport so)
|
||||
(aport si)
|
||||
(subprocess-pid subp)
|
||||
(aport se)
|
||||
(letrec ((control
|
||||
(lambda (m)
|
||||
(case m
|
||||
((status) (let ((s (subprocess-status subp)))
|
||||
(cond ((not (integer? s)) s)
|
||||
((zero? s) 'done-ok)
|
||||
(else 'done-error))))
|
||||
((exit-code) (let ((s (subprocess-status subp)))
|
||||
(and (integer? s) s)))
|
||||
((wait)
|
||||
(subprocess-wait subp)
|
||||
(let ([twait (lambda (t)
|
||||
(when (thread? t)
|
||||
(thread-wait t)))])
|
||||
(twait so)
|
||||
(twait si)
|
||||
(twait se)))
|
||||
((interrupt) (subprocess-kill subp #f))
|
||||
((kill) (subprocess-kill subp #t))
|
||||
(else
|
||||
(raise-type-error 'control-process
|
||||
"'status, 'exit-code, 'wait, 'interrupt, or 'kill" m))))))
|
||||
control)))))
|
||||
(let ([threads-still-going?
|
||||
(lambda ()
|
||||
(ormap (lambda (s)
|
||||
(and (thread? s)
|
||||
(thread-running? s)))
|
||||
(list so si se)))])
|
||||
(list (aport so)
|
||||
(aport si)
|
||||
(subprocess-pid subp)
|
||||
(aport se)
|
||||
(letrec ((control
|
||||
(lambda (m)
|
||||
(case m
|
||||
((status) (let ((s (subprocess-status subp)))
|
||||
(cond ((or (not (integer? s))
|
||||
(threads-still-going?))
|
||||
'running)
|
||||
((zero? s) 'done-ok)
|
||||
(else 'done-error))))
|
||||
((exit-code) (if (threads-still-going?)
|
||||
#f
|
||||
(let ((s (subprocess-status subp)))
|
||||
(and (integer? s) s))))
|
||||
((wait)
|
||||
(subprocess-wait subp)
|
||||
(let ([twait (lambda (t)
|
||||
(when (thread? t)
|
||||
(thread-wait t)))])
|
||||
(twait so)
|
||||
(twait si)
|
||||
(twait se)))
|
||||
((interrupt) (subprocess-kill subp #f))
|
||||
((kill) (subprocess-kill subp #t))
|
||||
(else
|
||||
(raise-type-error 'control-process
|
||||
"'status, 'exit-code, 'wait, 'interrupt, or 'kill" m))))))
|
||||
control))))))
|
||||
|
||||
(define (process/ports out in err str)
|
||||
(apply process*/ports out in err (shell-path/args "process/ports" str)))
|
||||
|
|
Loading…
Reference in New Issue
Block a user