| package daemon |
| |
| import ( |
| "fmt" |
| "sync" |
| "time" |
| |
| "github.com/dotcloud/docker/pkg/units" |
| ) |
| |
| type State struct { |
| sync.RWMutex |
| Running bool |
| Paused bool |
| Pid int |
| ExitCode int |
| StartedAt time.Time |
| FinishedAt time.Time |
| } |
| |
| // String returns a human-readable description of the state |
| func (s *State) String() string { |
| s.RLock() |
| defer s.RUnlock() |
| |
| if s.Running { |
| if s.Paused { |
| return fmt.Sprintf("Up %s (Paused)", units.HumanDuration(time.Now().UTC().Sub(s.StartedAt))) |
| } |
| return fmt.Sprintf("Up %s", units.HumanDuration(time.Now().UTC().Sub(s.StartedAt))) |
| } |
| if s.FinishedAt.IsZero() { |
| return "" |
| } |
| return fmt.Sprintf("Exited (%d) %s ago", s.ExitCode, units.HumanDuration(time.Now().UTC().Sub(s.FinishedAt))) |
| } |
| |
| func (s *State) IsRunning() bool { |
| s.RLock() |
| defer s.RUnlock() |
| |
| return s.Running |
| } |
| |
| func (s *State) GetExitCode() int { |
| s.RLock() |
| defer s.RUnlock() |
| |
| return s.ExitCode |
| } |
| |
| func (s *State) SetRunning(pid int) { |
| s.Lock() |
| defer s.Unlock() |
| |
| s.Running = true |
| s.Paused = false |
| s.ExitCode = 0 |
| s.Pid = pid |
| s.StartedAt = time.Now().UTC() |
| } |
| |
| func (s *State) SetStopped(exitCode int) { |
| s.Lock() |
| defer s.Unlock() |
| |
| s.Running = false |
| s.Pid = 0 |
| s.FinishedAt = time.Now().UTC() |
| s.ExitCode = exitCode |
| } |
| |
| func (s *State) SetPaused() { |
| s.Lock() |
| defer s.Unlock() |
| s.Paused = true |
| } |
| |
| func (s *State) SetUnpaused() { |
| s.Lock() |
| defer s.Unlock() |
| s.Paused = false |
| } |
| |
| func (s *State) IsPaused() bool { |
| s.RLock() |
| defer s.RUnlock() |
| |
| return s.Paused |
| } |