Parcourir la source

predicate.Not

Darien Raymond il y a 9 ans
Parent
commit
da9f1a8013
2 fichiers modifiés avec 16 ajouts et 6 suppressions
  1. 6 0
      common/predicate/predicate.go
  2. 10 6
      transport/internet/kcp/connection.go

+ 6 - 0
common/predicate/predicate.go

@@ -23,3 +23,9 @@ func Any(predicates ...Predicate) Predicate {
 		return false
 	}
 }
+
+func Not(predicate Predicate) Predicate {
+	return func() bool {
+		return !predicate()
+	}
+}

+ 10 - 6
transport/internet/kcp/connection.go

@@ -225,17 +225,21 @@ func NewConnection(conv uint16, writerCloser io.WriteCloser, local *net.UDPAddr,
 	conn.congestionControl = config.Congestion
 	conn.sendingWorker = NewSendingWorker(conn)
 
+	isTerminating := func() bool {
+		return conn.State().Is(StateTerminating, StateTerminated)
+	}
+	isTerminated := func() bool {
+		return conn.State() == StateTerminated
+	}
 	conn.dataUpdater = NewUpdater(
 		conn.interval,
-		predicate.Any(conn.sendingWorker.UpdateNecessary, conn.receivingWorker.UpdateNecessary),
-		func() bool {
-			return conn.State() == StateTerminated
-		},
+		predicate.All(predicate.Not(isTerminating), predicate.Any(conn.sendingWorker.UpdateNecessary, conn.receivingWorker.UpdateNecessary)),
+		isTerminating,
 		conn.updateTask)
 	conn.pingUpdater = NewUpdater(
 		5000, // 5 seconds
-		func() bool { return conn.State() != StateTerminated },
-		func() bool { return conn.State() == StateTerminated },
+		predicate.Not(isTerminated),
+		isTerminated,
 		conn.updateTask)
 	conn.pingUpdater.WakeUp()