Browse code

fix goroutines leak and exit code

Docker-DCO-1.1-Signed-off-by: Victor Vieux <vieux@docker.com> (github: vieux)

Signed-off-by: Victor Vieux <vieux@docker.com>

Victor Vieux authored on 2014/07/29 16:14:10
Showing 3 changed files
... ...
@@ -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:
... ...
@@ -62,4 +62,5 @@ func initializer() {
62 62
 
63 63
 func writeError(err error) {
64 64
 	fmt.Sprint(os.Stderr, err)
65
+	os.Exit(1)
65 66
 }
... ...
@@ -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