Просмотр исходного кода

Fix: additional missing timer.Stop

Refactor selects to reduce chance of not calling
timer.Stop when more cases are added.
Rod Hynes 8 лет назад
Родитель
Сommit
0b2b35a12d
2 измененных файлов с 28 добавлено и 13 удалено
  1. 23 11
      psiphon/controller.go
  2. 5 2
      psiphon/tunnel.go

+ 23 - 11
psiphon/controller.go

@@ -472,13 +472,16 @@ loop:
 			duration = PSIPHON_API_CONNECTED_REQUEST_RETRY_PERIOD
 		}
 		timer := time.NewTimer(duration)
+		doBreak := false
 		select {
 		case <-controller.signalReportConnected:
-			timer.Stop()
 		case <-timer.C:
 			// Make another connected request
 		case <-controller.shutdownBroadcast:
-			timer.Stop()
+			doBreak = true
+		}
+		timer.Stop()
+		if doBreak {
 			break loop
 		}
 	}
@@ -1341,14 +1344,17 @@ loop:
 				// and the grace period has elapsed.
 
 				timer := time.NewTimer(ESTABLISH_TUNNEL_SERVER_AFFINITY_GRACE_PERIOD)
+				doBreak := false
 				select {
 				case <-timer.C:
 				case <-controller.serverAffinityDoneBroadcast:
 				case <-controller.stopEstablishingBroadcast:
-					timer.Stop()
-					break loop
+					doBreak = true
 				case <-controller.shutdownBroadcast:
-					timer.Stop()
+					doBreak = true
+				}
+				timer.Stop()
+				if doBreak {
 					break loop
 				}
 			} else if controller.config.StaggerConnectionWorkersMilliseconds != 0 {
@@ -1357,13 +1363,16 @@ loop:
 
 				timer := time.NewTimer(time.Millisecond * time.Duration(
 					controller.config.StaggerConnectionWorkersMilliseconds))
+				doBreak := false
 				select {
 				case <-timer.C:
 				case <-controller.stopEstablishingBroadcast:
-					timer.Stop()
-					break loop
+					doBreak = true
 				case <-controller.shutdownBroadcast:
-					timer.Stop()
+					doBreak = true
+				}
+				timer.Stop()
+				if doBreak {
 					break loop
 				}
 			}
@@ -1407,14 +1416,17 @@ loop:
 		// be more rounds if required).
 		timer := time.NewTimer(
 			time.Duration(*controller.config.EstablishTunnelPausePeriodSeconds) * time.Second)
+		doBreak := false
 		select {
 		case <-timer.C:
 			// Retry iterating
 		case <-controller.stopEstablishingBroadcast:
-			timer.Stop()
-			break loop
+			doBreak = true
 		case <-controller.shutdownBroadcast:
-			timer.Stop()
+			doBreak = true
+		}
+		timer.Stop()
+		if doBreak {
 			break loop
 		}
 

+ 5 - 2
psiphon/tunnel.go

@@ -1222,12 +1222,15 @@ func (tunnel *Tunnel) operateTunnel(tunnelOwner TunnelOwner) {
 					return
 				}
 				timer := time.NewTimer(PSIPHON_API_CLIENT_VERIFICATION_REQUEST_RETRY_PERIOD)
+				doReturn := false
 				select {
 				case <-timer.C:
 				case clientVerificationPayload = <-tunnel.newClientVerificationPayload:
-					timer.Stop()
 				case <-signalStopClientVerificationRequests:
-					timer.Stop()
+					doReturn = true
+				}
+				timer.Stop()
+				if doReturn {
 					return
 				}
 			}