11package daemon
22
33import (
4- "encoding/json"
54 "fmt"
65 "sync"
76 "time"
@@ -10,7 +9,7 @@ import (
109)
1110
1211type State struct {
13- sync.RWMutex
12+ sync.Mutex
1413 Running bool
1514 Paused bool
1615 Restarting bool
@@ -29,9 +28,6 @@ func NewState() *State {
2928
3029// String returns a human-readable description of the state
3130func (s * State ) String () string {
32- s .RLock ()
33- defer s .RUnlock ()
34-
3531 if s .Running {
3632 if s .Paused {
3733 return fmt .Sprintf ("Up %s (Paused)" , units .HumanDuration (time .Now ().UTC ().Sub (s .StartedAt )))
@@ -50,16 +46,6 @@ func (s *State) String() string {
5046 return fmt .Sprintf ("Exited (%d) %s ago" , s .ExitCode , units .HumanDuration (time .Now ().UTC ().Sub (s .FinishedAt )))
5147}
5248
53- type jState State
54-
55- // MarshalJSON for state is needed to avoid race conditions on inspect
56- func (s * State ) MarshalJSON () ([]byte , error ) {
57- s .RLock ()
58- b , err := json .Marshal (jState (* s ))
59- s .RUnlock ()
60- return b , err
61- }
62-
6349func wait (waitChan <- chan struct {}, timeout time.Duration ) error {
6450 if timeout < 0 {
6551 <- waitChan
@@ -77,14 +63,14 @@ func wait(waitChan <-chan struct{}, timeout time.Duration) error {
7763// immediatly. If you want wait forever you must supply negative timeout.
7864// Returns pid, that was passed to SetRunning
7965func (s * State ) WaitRunning (timeout time.Duration ) (int , error ) {
80- s .RLock ()
81- if s .IsRunning () {
66+ s .Lock ()
67+ if s .Running {
8268 pid := s .Pid
83- s .RUnlock ()
69+ s .Unlock ()
8470 return pid , nil
8571 }
8672 waitChan := s .waitChan
87- s .RUnlock ()
73+ s .Unlock ()
8874 if err := wait (waitChan , timeout ); err != nil {
8975 return - 1 , err
9076 }
@@ -95,43 +81,48 @@ func (s *State) WaitRunning(timeout time.Duration) (int, error) {
9581// immediatly. If you want wait forever you must supply negative timeout.
9682// Returns exit code, that was passed to SetStopped
9783func (s * State ) WaitStop (timeout time.Duration ) (int , error ) {
98- s .RLock ()
84+ s .Lock ()
9985 if ! s .Running {
10086 exitCode := s .ExitCode
101- s .RUnlock ()
87+ s .Unlock ()
10288 return exitCode , nil
10389 }
10490 waitChan := s .waitChan
105- s .RUnlock ()
91+ s .Unlock ()
10692 if err := wait (waitChan , timeout ); err != nil {
10793 return - 1 , err
10894 }
10995 return s .GetExitCode (), nil
11096}
11197
11298func (s * State ) IsRunning () bool {
113- s .RLock ()
99+ s .Lock ()
114100 res := s .Running
115- s .RUnlock ()
101+ s .Unlock ()
116102 return res
117103}
118104
119105func (s * State ) GetPid () int {
120- s .RLock ()
106+ s .Lock ()
121107 res := s .Pid
122- s .RUnlock ()
108+ s .Unlock ()
123109 return res
124110}
125111
126112func (s * State ) GetExitCode () int {
127- s .RLock ()
113+ s .Lock ()
128114 res := s .ExitCode
129- s .RUnlock ()
115+ s .Unlock ()
130116 return res
131117}
132118
133119func (s * State ) SetRunning (pid int ) {
134120 s .Lock ()
121+ s .setRunning (pid )
122+ s .Unlock ()
123+ }
124+
125+ func (s * State ) setRunning (pid int ) {
135126 s .Running = true
136127 s .Paused = false
137128 s .Restarting = false
@@ -140,19 +131,22 @@ func (s *State) SetRunning(pid int) {
140131 s .StartedAt = time .Now ().UTC ()
141132 close (s .waitChan ) // fire waiters for start
142133 s .waitChan = make (chan struct {})
143- s .Unlock ()
144134}
145135
146136func (s * State ) SetStopped (exitCode int ) {
147137 s .Lock ()
138+ s .setStopped (exitCode )
139+ s .Unlock ()
140+ }
141+
142+ func (s * State ) setStopped (exitCode int ) {
148143 s .Running = false
149144 s .Restarting = false
150145 s .Pid = 0
151146 s .FinishedAt = time .Now ().UTC ()
152147 s .ExitCode = exitCode
153148 close (s .waitChan ) // fire waiters for stop
154149 s .waitChan = make (chan struct {})
155- s .Unlock ()
156150}
157151
158152// SetRestarting is when docker hanldes the auto restart of containers when they are
@@ -172,9 +166,9 @@ func (s *State) SetRestarting(exitCode int) {
172166}
173167
174168func (s * State ) IsRestarting () bool {
175- s .RLock ()
169+ s .Lock ()
176170 res := s .Restarting
177- s .RUnlock ()
171+ s .Unlock ()
178172 return res
179173}
180174
@@ -191,8 +185,8 @@ func (s *State) SetUnpaused() {
191185}
192186
193187func (s * State ) IsPaused () bool {
194- s .RLock ()
188+ s .Lock ()
195189 res := s .Paused
196- s .RUnlock ()
190+ s .Unlock ()
197191 return res
198192}
0 commit comments