GR = goroutine [GR#1] http server gets closed [GR#2] client.NotifyClose() will be executed [GR#2] client.once.Do will be executed (lock's client.once.m) [GR#1] stream.Close will be executed (lock's stream.lock) [GR#1] client.Close will be executed (waits for client.once.m) [GR#2] stream.remove will be executed (waits for stream.lock) GR#1 holds lock stream.lock and waits for client.once.m GR#2 holds lock client.once.m and waits for stream.lock We prevent the deadlock with releasing the client.once.m lock earlier. |
||
|---|---|---|
| .. | ||
| stream | ||
| internalutil.go | ||
| message.go | ||
| message_test.go | ||
| token.go | ||
| token_test.go | ||
| user.go | ||
| user_test.go | ||