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  }