diff options
Diffstat (limited to 'runtime/state.go')
-rw-r--r-- | runtime/state.go | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/runtime/state.go b/runtime/state.go new file mode 100644 index 0000000000..316b8a40f1 --- /dev/null +++ b/runtime/state.go @@ -0,0 +1,84 @@ +package runtime + +import ( + "fmt" + "github.com/dotcloud/docker/utils" + "sync" + "time" +) + +type State struct { + sync.RWMutex + Running bool + Pid int + ExitCode int + StartedAt time.Time + FinishedAt time.Time + Ghost bool +} + +// String returns a human-readable description of the state +func (s *State) String() string { + s.RLock() + defer s.RUnlock() + + if s.Running { + if s.Ghost { + return fmt.Sprintf("Ghost") + } + return fmt.Sprintf("Up %s", utils.HumanDuration(time.Now().UTC().Sub(s.StartedAt))) + } + if s.FinishedAt.IsZero() { + return "" + } + return fmt.Sprintf("Exited (%d) %s ago", s.ExitCode, utils.HumanDuration(time.Now().UTC().Sub(s.FinishedAt))) +} + +func (s *State) IsRunning() bool { + s.RLock() + defer s.RUnlock() + + return s.Running +} + +func (s *State) IsGhost() bool { + s.RLock() + defer s.RUnlock() + + return s.Ghost +} + +func (s *State) GetExitCode() int { + s.RLock() + defer s.RUnlock() + + return s.ExitCode +} + +func (s *State) SetGhost(val bool) { + s.Lock() + defer s.Unlock() + + s.Ghost = val +} + +func (s *State) SetRunning(pid int) { + s.Lock() + defer s.Unlock() + + s.Running = true + s.Ghost = 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 +} |