good morning!!!!

Skip to content
Snippets Groups Projects
Unverified Commit 03cca81f authored by Anmol Sethi's avatar Anmol Sethi
Browse files

Fix deadlock introduced in v1.8.5

Closes #231
parent bdac8884
Branches
Tags
No related merge requests found
...@@ -6,7 +6,7 @@ main() { ...@@ -6,7 +6,7 @@ main() {
./ci/fmt.sh ./ci/fmt.sh
./ci/lint.sh ./ci/lint.sh
./ci/test.sh ./ci/test.sh "$@"
} }
main "$@" main "$@"
...@@ -246,13 +246,24 @@ func (c *Conn) writeFrame(ctx context.Context, fin bool, flate bool, opcode opco ...@@ -246,13 +246,24 @@ func (c *Conn) writeFrame(ctx context.Context, fin bool, flate bool, opcode opco
if err != nil { if err != nil {
return 0, err return 0, err
} }
defer func() { defer c.writeFrameMu.unlock()
// We leave it locked when writing the close frame to avoid
// any other goroutine writing any other frame. // If the state says a close has already been written, we wait until
if opcode != opClose { // the connection is closed and return that error.
c.writeFrameMu.unlock() //
// However, if the frame being written is a close, that means its the close from
// the state being set so we let it go through.
c.closeMu.Lock()
wroteClose := c.wroteClose
c.closeMu.Unlock()
if wroteClose && opcode != opClose {
select {
case <-ctx.Done():
return 0, ctx.Err()
case <-c.closed:
return 0, c.closeErr
}
} }
}()
select { select {
case <-c.closed: case <-c.closed:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment