From fdf025942b526ad34ce1a8cd25bd55f0acb6980c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 8 Dec 2020 01:24:38 +0900 Subject: [PATCH] Ensure room is locked when mutating users --- .../RealtimeMultiplayer/MultiplayerRoom.cs | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/osu.Game/Online/RealtimeMultiplayer/MultiplayerRoom.cs b/osu.Game/Online/RealtimeMultiplayer/MultiplayerRoom.cs index f42f8d7f5f..1a02dab5e0 100644 --- a/osu.Game/Online/RealtimeMultiplayer/MultiplayerRoom.cs +++ b/osu.Game/Online/RealtimeMultiplayer/MultiplayerRoom.cs @@ -9,16 +9,33 @@ namespace osu.Game.Online.RealtimeMultiplayer [Serializable] public class MultiplayerRoom { + private object writeLock = new object(); + public long RoomID { get; set; } public MultiplayerRoomState State { get; set; } - public IReadOnlyList Users => users; - private List users = new List(); - public void Join(int user) => users.Add(new MultiplayerRoomUser(user)); + public IReadOnlyList Users + { + get + { + lock (writeLock) + return users.ToArray(); + } + } - public void Leave(int user) => users.RemoveAll(u => u.UserID == user); + public void Join(int user) + { + lock (writeLock) + users.Add(new MultiplayerRoomUser(user)); + } + + public void Leave(int user) + { + lock (writeLock) + users.RemoveAll(u => u.UserID == user); + } } }