Improve locking and allow concurrent reading.

This commit is contained in:
Joachim Bauch 2022-05-13 16:24:18 +02:00
parent 9a24694f37
commit 6b1dd1ed4c
No known key found for this signature in database
GPG key ID: 77C1D22D53E15F02

View file

@ -28,7 +28,7 @@ import (
type BuiltinRoomSessions struct { type BuiltinRoomSessions struct {
sessionIdToRoomSession map[string]string sessionIdToRoomSession map[string]string
roomSessionToSessionid map[string]string roomSessionToSessionid map[string]string
mu sync.Mutex mu sync.RWMutex
} }
func NewBuiltinRoomSessions() (RoomSessions, error) { func NewBuiltinRoomSessions() (RoomSessions, error) {
@ -44,9 +44,10 @@ func (r *BuiltinRoomSessions) SetRoomSession(session Session, roomSessionId stri
return nil return nil
} }
r.mu.Lock()
defer r.mu.Unlock()
if sid := session.PublicId(); sid != "" { if sid := session.PublicId(); sid != "" {
r.mu.Lock()
defer r.mu.Unlock()
r.sessionIdToRoomSession[sid] = roomSessionId r.sessionIdToRoomSession[sid] = roomSessionId
r.roomSessionToSessionid[roomSessionId] = sid r.roomSessionToSessionid[roomSessionId] = sid
} }
@ -54,9 +55,10 @@ func (r *BuiltinRoomSessions) SetRoomSession(session Session, roomSessionId stri
} }
func (r *BuiltinRoomSessions) DeleteRoomSession(session Session) { func (r *BuiltinRoomSessions) DeleteRoomSession(session Session) {
r.mu.Lock()
defer r.mu.Unlock()
if sid := session.PublicId(); sid != "" { if sid := session.PublicId(); sid != "" {
r.mu.Lock()
defer r.mu.Unlock()
if roomSessionId, found := r.sessionIdToRoomSession[sid]; found { if roomSessionId, found := r.sessionIdToRoomSession[sid]; found {
delete(r.sessionIdToRoomSession, sid) delete(r.sessionIdToRoomSession, sid)
if r.roomSessionToSessionid[roomSessionId] == sid { if r.roomSessionToSessionid[roomSessionId] == sid {
@ -67,8 +69,8 @@ func (r *BuiltinRoomSessions) DeleteRoomSession(session Session) {
} }
func (r *BuiltinRoomSessions) GetSessionId(roomSessionId string) (string, error) { func (r *BuiltinRoomSessions) GetSessionId(roomSessionId string) (string, error) {
r.mu.Lock() r.mu.RLock()
defer r.mu.Unlock() defer r.mu.RUnlock()
sid, found := r.roomSessionToSessionid[roomSessionId] sid, found := r.roomSessionToSessionid[roomSessionId]
if !found { if !found {
return "", ErrNoSuchRoomSession return "", ErrNoSuchRoomSession