state.go
a27b4b8c
 package docker
 
 import (
45a8bba1
 	"fmt"
333abbf8
 	"sync"
 	"time"
a27b4b8c
 )
 
 type State struct {
73d72654
 	Running   bool
 	Pid       int
 	ExitCode  int
64fc86fb
 	StartedAt time.Time
a27b4b8c
 
 	stateChangeLock *sync.Mutex
 	stateChangeCond *sync.Cond
 }
 
904b0ab5
 // String returns a human-readable description of the state
 func (s *State) String() string {
 	if s.Running {
299d0b27
 		return fmt.Sprintf("Up %s", HumanDuration(time.Now().Sub(s.StartedAt)))
904b0ab5
 	}
bcfe2aa2
 	return fmt.Sprintf("Exit %d", s.ExitCode)
904b0ab5
 }
 
a27b4b8c
 func (s *State) setRunning(pid int) {
 	s.Running = true
 	s.ExitCode = 0
 	s.Pid = pid
64fc86fb
 	s.StartedAt = time.Now()
a27b4b8c
 	s.broadcast()
 }
 
 func (s *State) setStopped(exitCode int) {
 	s.Running = false
 	s.Pid = 0
 	s.ExitCode = exitCode
 	s.broadcast()
 }
 
d1767bbf
 func (s *State) initLock() {
 	if s.stateChangeLock == nil {
 		s.stateChangeLock = &sync.Mutex{}
 		s.stateChangeCond = sync.NewCond(s.stateChangeLock)
 	}
791ca6fd
 }
 
a27b4b8c
 func (s *State) broadcast() {
 	s.stateChangeLock.Lock()
 	s.stateChangeCond.Broadcast()
 	s.stateChangeLock.Unlock()
 }
 
 func (s *State) wait() {
 	s.stateChangeLock.Lock()
 	s.stateChangeCond.Wait()
 	s.stateChangeLock.Unlock()
 }