Correct mutex lock ordering

This commit is contained in:
Kegan Dougal 2021-03-28 14:03:30 +01:00
parent c2d3efd530
commit 7ce2cd97ea

View file

@ -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()
}