From cf41c0175af9021b9b6940f8f2bd5014fb64d81f Mon Sep 17 00:00:00 2001 From: Robert Paciorek Date: Wed, 6 Mar 2024 12:18:44 +0000 Subject: [PATCH] fix race condition issues - WorldEvent and others --- src/Core/GauntletRoom.cs | 17 ++++++++++------- src/Core/Room.cs | 9 ++++++--- src/Core/WorldEvent.cs | 10 ++++++---- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/Core/GauntletRoom.cs b/src/Core/GauntletRoom.cs index 800e989..19c6dfd 100644 --- a/src/Core/GauntletRoom.cs +++ b/src/Core/GauntletRoom.cs @@ -3,16 +3,19 @@ using sodoffmmo.Data; namespace sodoffmmo.Core; public class GauntletRoom : Room { + static object NextRoomLock = new object(); static GauntletRoom? NextRoom = null; public static GauntletRoom Get() { - if (NextRoom != null && NextRoom.ClientsCount == 1) { - var ret = NextRoom!; - NextRoom = null; - return ret; - } else { - NextRoom = new GauntletRoom(); - return NextRoom!; + lock(NextRoomLock) { + if (NextRoom != null && NextRoom.ClientsCount == 1) { + var ret = NextRoom!; + NextRoom = null; + return ret; + } else { + NextRoom = new GauntletRoom(); + return NextRoom!; + } } } diff --git a/src/Core/Room.cs b/src/Core/Room.cs index c44dd89..6bc5956 100644 --- a/src/Core/Room.cs +++ b/src/Core/Room.cs @@ -4,6 +4,7 @@ using sodoffmmo.Data; namespace sodoffmmo.Core; public class Room { public static int MaxId { get; private set; } = 2; + static object RoomsListLock = new object(); protected static Dictionary rooms = new(); List clients = new(); @@ -70,9 +71,11 @@ public class Room { public static Room Get(string name) => rooms[name]; public static Room GetOrAdd(string name) { - if (!Room.Exists(name)) - return new Room(name); - return rooms[name]; + lock(RoomsListLock) { + if (!Room.Exists(name)) + return new Room(name); + return rooms[name]; + } } public static Room[] AllRooms() { diff --git a/src/Core/WorldEvent.cs b/src/Core/WorldEvent.cs index 264f1bb..81c6da2 100644 --- a/src/Core/WorldEvent.cs +++ b/src/Core/WorldEvent.cs @@ -10,15 +10,17 @@ class WorldEvent { NotActive } private static WorldEvent? _instance = null; - private object EventLock = new object(); + private static object EventLock = new object(); private Random random = new Random(); private System.Timers.Timer? timer = null; public static WorldEvent Get() { - if (_instance == null) { - _instance = new WorldEvent(); + lock(EventLock) { + if (_instance == null) { + _instance = new WorldEvent(); + } + return _instance; } - return _instance; } private WorldEvent() {