From 7ce2cd97eaf1767cb23d277c33fead4833bc197f Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Sun, 28 Mar 2021 14:03:30 +0100 Subject: [PATCH] Correct mutex lock ordering --- internal/mutex.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/internal/mutex.go b/internal/mutex.go index ad709ef7b..3d36cdac9 100644 --- a/internal/mutex.go +++ b/internal/mutex.go @@ -16,21 +16,23 @@ func NewMutexByRoom() *MutexByRoom { func (m *MutexByRoom) Lock(roomID string) { m.mu.Lock() - defer m.mu.Unlock() roomMu := m.roomToMu[roomID] if roomMu == nil { roomMu = &sync.Mutex{} } - roomMu.Lock() m.roomToMu[roomID] = roomMu + m.mu.Unlock() + // don't lock inside m.mu else we can deadlock + roomMu.Lock() } func (m *MutexByRoom) Unlock(roomID string) { m.mu.Lock() - defer m.mu.Unlock() roomMu := m.roomToMu[roomID] if roomMu == nil { panic("MutexByRoom: Unlock before Lock") } + m.mu.Unlock() + roomMu.Unlock() }