summaryrefslogtreecommitdiff
path: root/runtime/state.go
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/state.go')
-rw-r--r--runtime/state.go84
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
+}