diff --git a/close.go b/close.go index d15125971585c9c7477bbe3ec2f603037340dea5..625ed1217791842ee65db23a6aa03a30f83bbdd7 100644 --- a/close.go +++ b/close.go @@ -239,11 +239,11 @@ func (c *Conn) waitGoroutines() error { } c.closeReadMu.Lock() - ctx := c.closeReadCtx + closeRead := c.closeReadCtx != nil c.closeReadMu.Unlock() - if ctx != nil { + if closeRead { select { - case <-ctx.Done(): + case <-c.closeReadDone: case <-t.C: return errors.New("failed to wait for close read goroutine to exit") } diff --git a/conn.go b/conn.go index f5da573a6cfae8908b0951918efd96d1944bd74d..8690fb3b46804bcab5c82f868aec9c5d3dccf421 100644 --- a/conn.go +++ b/conn.go @@ -57,10 +57,10 @@ type Conn struct { timeoutLoopDone chan struct{} // Read state. - readMu *mu - readHeaderBuf [8]byte - readControlBuf [maxControlPayload]byte - msgReader *msgReader + readMu *mu + readHeaderBuf [8]byte + readControlBuf [maxControlPayload]byte + msgReader *msgReader // Write state. msgWriter *msgWriter @@ -69,8 +69,9 @@ type Conn struct { writeHeaderBuf [8]byte writeHeader header - closeReadMu sync.Mutex - closeReadCtx context.Context + closeReadMu sync.Mutex + closeReadCtx context.Context + closeReadDone chan struct{} closed chan struct{} closeMu sync.Mutex diff --git a/mask_asm.go b/mask_asm.go index 60c0290fb5dbf8efab88dddbc5ce30502f559828..f9484b5bc0973acea00e2192661624eca267e9ea 100644 --- a/mask_asm.go +++ b/mask_asm.go @@ -3,7 +3,7 @@ package websocket func mask(b []byte, key uint32) uint32 { - // TODO: Will enable in v1.9.0. + // TODO: Will enable in v1.9.0. return maskGo(b, key) /* if len(b) > 0 { diff --git a/read.go b/read.go index 5df031caaf51df7f40830de8ab7fa29cc77d7013..a59e71d9b9fde0d341b9dde9d2307030f8a1684e 100644 --- a/read.go +++ b/read.go @@ -71,9 +71,11 @@ func (c *Conn) CloseRead(ctx context.Context) context.Context { } ctx, cancel := context.WithCancel(ctx) c.closeReadCtx = ctx + c.closeReadDone = make(chan struct{}) c.closeReadMu.Unlock() go func() { + defer close(c.closeReadDone) defer cancel() defer c.close() _, _, err := c.Reader(ctx)