From da9f1a80139977cca88e01c5a2fd665ea3df48d2 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 11 Oct 2016 12:30:53 +0200 Subject: [PATCH] predicate.Not --- common/predicate/predicate.go | 6 ++++++ transport/internet/kcp/connection.go | 16 ++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/common/predicate/predicate.go b/common/predicate/predicate.go index d107071f..d5a9016d 100644 --- a/common/predicate/predicate.go +++ b/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() + } +} diff --git a/transport/internet/kcp/connection.go b/transport/internet/kcp/connection.go index 7b3ad43b..eba9feb9 100644 --- a/transport/internet/kcp/connection.go +++ b/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()