[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