github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/worker/gclient/connection/process.go (about) 1 package connection 2 3 import ( 4 "sync" 5 6 "code.cloudfoundry.org/garden" 7 ) 8 9 type process struct { 10 id string 11 12 processInputStream *processStream 13 done bool 14 exitStatus int 15 exitErr error 16 doneL *sync.Cond 17 } 18 19 func newProcess(id string, processInputStream *processStream) *process { 20 return &process{ 21 id: id, 22 processInputStream: processInputStream, 23 doneL: sync.NewCond(&sync.Mutex{}), 24 } 25 } 26 27 func (p *process) ID() string { 28 return p.id 29 } 30 31 func (p *process) Wait() (int, error) { 32 p.doneL.L.Lock() 33 34 for !p.done { 35 p.doneL.Wait() 36 } 37 38 defer p.doneL.L.Unlock() 39 40 return p.exitStatus, p.exitErr 41 } 42 43 func (p *process) SetTTY(tty garden.TTYSpec) error { 44 return p.processInputStream.SetTTY(tty) 45 } 46 47 func (p *process) Signal(signal garden.Signal) error { 48 return p.processInputStream.Signal(signal) 49 } 50 51 func (p *process) exited(exitStatus int, err error) { 52 p.doneL.L.Lock() 53 p.exitStatus = exitStatus 54 p.exitErr = err 55 p.done = true 56 p.doneL.L.Unlock() 57 58 p.doneL.Broadcast() 59 }