state.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package daemon
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. "github.com/dotcloud/docker/pkg/units"
  7. )
  8. type State struct {
  9. sync.RWMutex
  10. Running bool
  11. Pid int
  12. ExitCode int
  13. StartedAt time.Time
  14. FinishedAt time.Time
  15. }
  16. // String returns a human-readable description of the state
  17. func (s *State) String() string {
  18. s.RLock()
  19. defer s.RUnlock()
  20. if s.Running {
  21. return fmt.Sprintf("Up %s", units.HumanDuration(time.Now().UTC().Sub(s.StartedAt)))
  22. }
  23. if s.FinishedAt.IsZero() {
  24. return ""
  25. }
  26. return fmt.Sprintf("Exited (%d) %s ago", s.ExitCode, units.HumanDuration(time.Now().UTC().Sub(s.FinishedAt)))
  27. }
  28. func (s *State) IsRunning() bool {
  29. s.RLock()
  30. defer s.RUnlock()
  31. return s.Running
  32. }
  33. func (s *State) GetExitCode() int {
  34. s.RLock()
  35. defer s.RUnlock()
  36. return s.ExitCode
  37. }
  38. func (s *State) SetRunning(pid int) {
  39. s.Lock()
  40. defer s.Unlock()
  41. s.Running = true
  42. s.ExitCode = 0
  43. s.Pid = pid
  44. s.StartedAt = time.Now().UTC()
  45. }
  46. func (s *State) SetStopped(exitCode int) {
  47. s.Lock()
  48. defer s.Unlock()
  49. s.Running = false
  50. s.Pid = 0
  51. s.FinishedAt = time.Now().UTC()
  52. s.ExitCode = exitCode
  53. }