mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-12-28 01:03:10 -06:00
Correct mutex lock ordering
This commit is contained in:
parent
c2d3efd530
commit
7ce2cd97ea
|
|
@ -16,21 +16,23 @@ func NewMutexByRoom() *MutexByRoom {
|
||||||
|
|
||||||
func (m *MutexByRoom) Lock(roomID string) {
|
func (m *MutexByRoom) Lock(roomID string) {
|
||||||
m.mu.Lock()
|
m.mu.Lock()
|
||||||
defer m.mu.Unlock()
|
|
||||||
roomMu := m.roomToMu[roomID]
|
roomMu := m.roomToMu[roomID]
|
||||||
if roomMu == nil {
|
if roomMu == nil {
|
||||||
roomMu = &sync.Mutex{}
|
roomMu = &sync.Mutex{}
|
||||||
}
|
}
|
||||||
roomMu.Lock()
|
|
||||||
m.roomToMu[roomID] = roomMu
|
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) {
|
func (m *MutexByRoom) Unlock(roomID string) {
|
||||||
m.mu.Lock()
|
m.mu.Lock()
|
||||||
defer m.mu.Unlock()
|
|
||||||
roomMu := m.roomToMu[roomID]
|
roomMu := m.roomToMu[roomID]
|
||||||
if roomMu == nil {
|
if roomMu == nil {
|
||||||
panic("MutexByRoom: Unlock before Lock")
|
panic("MutexByRoom: Unlock before Lock")
|
||||||
}
|
}
|
||||||
|
m.mu.Unlock()
|
||||||
|
|
||||||
roomMu.Unlock()
|
roomMu.Unlock()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue