[tor-commits] [pluggable-transports/snowflake] 04/04: Refactor timeout loop to use a context and reuse timers

gitolite role git at cupani.torproject.org
Tue Nov 29 14:20:36 UTC 2022


This is an automated email from the git hooks/post-receive script.

cohosh pushed a commit to branch main
in repository pluggable-transports/snowflake.

commit b547d449cb3f7710ecb70f55a3cbe3a2fe8382d3
Author: Cecylia Bocovich <cohosh at torproject.org>
AuthorDate: Mon Nov 28 17:30:05 2022 -0500

    Refactor timeout loop to use a context and reuse timers
---
 proxy/lib/webrtcconn.go | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/proxy/lib/webrtcconn.go b/proxy/lib/webrtcconn.go
index 40b26c9..c876fbe 100644
--- a/proxy/lib/webrtcconn.go
+++ b/proxy/lib/webrtcconn.go
@@ -1,6 +1,7 @@
 package snowflake_proxy
 
 import (
+	"context"
 	"fmt"
 	"io"
 	"log"
@@ -35,29 +36,35 @@ type webRTCConn struct {
 
 	inactivityTimeout time.Duration
 	activity          chan struct{}
-	closed            chan struct{}
+	cancelTimeoutLoop context.CancelFunc
 }
 
 func newWebRTCConn(pc *webrtc.PeerConnection, dc *webrtc.DataChannel, pr *io.PipeReader, eventLogger event.SnowflakeEventReceiver) *webRTCConn {
 	conn := &webRTCConn{pc: pc, dc: dc, pr: pr, eventLogger: eventLogger}
 	conn.bytesLogger = newBytesSyncLogger()
 	conn.activity = make(chan struct{}, 100)
-	conn.closed = make(chan struct{})
 	conn.inactivityTimeout = 30 * time.Second
-	go conn.timeoutLoop()
+	ctx, cancel := context.WithCancel(context.Background())
+	conn.cancelTimeoutLoop = cancel
+	go conn.timeoutLoop(ctx)
 	return conn
 }
 
-func (c *webRTCConn) timeoutLoop() {
+func (c *webRTCConn) timeoutLoop(ctx context.Context) {
+	timer := time.NewTimer(c.inactivityTimeout)
 	for {
 		select {
-		case <-time.After(c.inactivityTimeout):
+		case <-timer.C:
 			c.Close()
 			log.Println("Closed connection due to inactivity")
 			return
 		case <-c.activity:
+			if !timer.Stop() {
+				<-timer.C
+			}
+			timer.Reset(c.inactivityTimeout)
 			continue
-		case <-c.closed:
+		case <-ctx.Done():
 			return
 		}
 	}
@@ -80,7 +87,7 @@ func (c *webRTCConn) Write(b []byte) (int, error) {
 
 func (c *webRTCConn) Close() (err error) {
 	c.once.Do(func() {
-		close(c.closed)
+		c.cancelTimeoutLoop()
 		err = c.pc.Close()
 	})
 	return

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the tor-commits mailing list