12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- package docker
- import (
- "fmt"
- "github.com/dotcloud/docker/future"
- "sync"
- "time"
- )
- type State struct {
- Running bool
- Pid int
- ExitCode int
- StartedAt time.Time
- stateChangeLock *sync.Mutex
- stateChangeCond *sync.Cond
- }
- func newState() *State {
- lock := new(sync.Mutex)
- return &State{
- stateChangeLock: lock,
- stateChangeCond: sync.NewCond(lock),
- }
- }
- // String returns a human-readable description of the state
- func (s *State) String() string {
- if s.Running {
- return fmt.Sprintf("Up %s", future.HumanDuration(time.Now().Sub(s.StartedAt)))
- }
- return fmt.Sprintf("Exit %d", s.ExitCode)
- }
- func (s *State) setRunning(pid int) {
- s.Running = true
- s.ExitCode = 0
- s.Pid = pid
- s.StartedAt = time.Now()
- s.broadcast()
- }
- func (s *State) setStopped(exitCode int) {
- s.Running = false
- s.Pid = 0
- s.ExitCode = exitCode
- s.broadcast()
- }
- 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()
- }
|