Docker-DCO-1.1-Signed-off-by: Victor Vieux <vieux@docker.com> (github: vieux)
Signed-off-by: Victor Vieux <vieux@docker.com>
| ... | ... |
@@ -1111,6 +1111,7 @@ func (container *Container) startLoggingToDisk() error {
|
| 1111 | 1111 |
} |
| 1112 | 1112 |
|
| 1113 | 1113 |
func (container *Container) waitForStart() error {
|
| 1114 |
+ waitStart := make(chan struct{})
|
|
| 1114 | 1115 |
callback := func(command *execdriver.Command) {
|
| 1115 | 1116 |
if command.Tty {
|
| 1116 | 1117 |
// The callback is called after the process Start() |
| ... | ... |
@@ -1121,22 +1122,16 @@ func (container *Container) waitForStart() error {
|
| 1121 | 1121 |
} |
| 1122 | 1122 |
} |
| 1123 | 1123 |
container.State.SetRunning(command.Pid()) |
| 1124 |
- if err := container.ToDisk(); err != nil {
|
|
| 1124 |
+ if err := container.toDisk(); err != nil {
|
|
| 1125 | 1125 |
utils.Debugf("%s", err)
|
| 1126 | 1126 |
} |
| 1127 |
+ close(waitStart) |
|
| 1127 | 1128 |
} |
| 1128 | 1129 |
|
| 1129 | 1130 |
// We use a callback here instead of a goroutine and an chan for |
| 1130 | 1131 |
// syncronization purposes |
| 1131 | 1132 |
cErr := utils.Go(func() error { return container.monitor(callback) })
|
| 1132 | 1133 |
|
| 1133 |
- waitStart := make(chan struct{})
|
|
| 1134 |
- |
|
| 1135 |
- go func() {
|
|
| 1136 |
- container.State.WaitRunning(-1 * time.Second) |
|
| 1137 |
- close(waitStart) |
|
| 1138 |
- }() |
|
| 1139 |
- |
|
| 1140 | 1134 |
// Start should not return until the process is actually running |
| 1141 | 1135 |
select {
|
| 1142 | 1136 |
case <-waitStart: |
| ... | ... |
@@ -114,28 +114,24 @@ func (s *State) GetExitCode() int {
|
| 114 | 114 |
|
| 115 | 115 |
func (s *State) SetRunning(pid int) {
|
| 116 | 116 |
s.Lock() |
| 117 |
- if !s.Running {
|
|
| 118 |
- s.Running = true |
|
| 119 |
- s.Paused = false |
|
| 120 |
- s.ExitCode = 0 |
|
| 121 |
- s.Pid = pid |
|
| 122 |
- s.StartedAt = time.Now().UTC() |
|
| 123 |
- close(s.waitChan) // fire waiters for start |
|
| 124 |
- s.waitChan = make(chan struct{})
|
|
| 125 |
- } |
|
| 117 |
+ s.Running = true |
|
| 118 |
+ s.Paused = false |
|
| 119 |
+ s.ExitCode = 0 |
|
| 120 |
+ s.Pid = pid |
|
| 121 |
+ s.StartedAt = time.Now().UTC() |
|
| 122 |
+ close(s.waitChan) // fire waiters for start |
|
| 123 |
+ s.waitChan = make(chan struct{})
|
|
| 126 | 124 |
s.Unlock() |
| 127 | 125 |
} |
| 128 | 126 |
|
| 129 | 127 |
func (s *State) SetStopped(exitCode int) {
|
| 130 | 128 |
s.Lock() |
| 131 |
- if s.Running {
|
|
| 132 |
- s.Running = false |
|
| 133 |
- s.Pid = 0 |
|
| 134 |
- s.FinishedAt = time.Now().UTC() |
|
| 135 |
- s.ExitCode = exitCode |
|
| 136 |
- close(s.waitChan) // fire waiters for stop |
|
| 137 |
- s.waitChan = make(chan struct{})
|
|
| 138 |
- } |
|
| 129 |
+ s.Running = false |
|
| 130 |
+ s.Pid = 0 |
|
| 131 |
+ s.FinishedAt = time.Now().UTC() |
|
| 132 |
+ s.ExitCode = exitCode |
|
| 133 |
+ close(s.waitChan) // fire waiters for stop |
|
| 134 |
+ s.waitChan = make(chan struct{})
|
|
| 139 | 135 |
s.Unlock() |
| 140 | 136 |
} |
| 141 | 137 |
|