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)