From 6fede215c2d79694ded7dd5dc8bb840064358836 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 23 Nov 2025 03:37:57 +0000 Subject: [PATCH 1/2] Initial plan From b5dab955f1092c53eefbbf17f54150c007936e77 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 23 Nov 2025 03:42:04 +0000 Subject: [PATCH 2/2] Fix race condition in Initialize method with thread-safe locking Co-authored-by: nalathethird <36301692+nalathethird@users.noreply.github.com> --- bHapticsManager/BHapticsConnection.cs | 61 +++++++++++++++------------ 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/bHapticsManager/BHapticsConnection.cs b/bHapticsManager/BHapticsConnection.cs index cfe246c..4b7c207 100644 --- a/bHapticsManager/BHapticsConnection.cs +++ b/bHapticsManager/BHapticsConnection.cs @@ -17,6 +17,7 @@ public class BHapticsConnection { private static ModernBHapticsWorkerThread _workerThread = null!; private static bool _isInitialized = false; + private static readonly object _initializeLock = new(); private static readonly object _shutdownLock = new(); private static bool _isShuttingDown = false; @@ -37,36 +38,38 @@ internal void RaiseDeviceDisconnected(LegacyBHaptics.PositionType position) { /// Called once during mod initialization. public static bool Initialize() { - if (_isInitialized) { - ResoniteMod.Warn("Already initialized - skipping duplicate connection"); - return true; - } - - // Connect to bHaptics Player - bool connected = ModernBHaptics.bHapticsManager.Connect("Resonite", "Resonite", true, 10); - - if (!connected) { - ResoniteMod.Error("Failed to connect to bHaptics Player!"); - ResoniteMod.Error("Make sure bHaptics Player is running and try restarting Resonite."); - return false; - } + lock (_initializeLock) { + if (_isInitialized) { + ResoniteMod.Warn("Already initialized - skipping duplicate connection"); + return true; + } + + // Connect to bHaptics Player + bool connected = ModernBHaptics.bHapticsManager.Connect("Resonite", "Resonite", true, 10); + + if (!connected) { + ResoniteMod.Error("Failed to connect to bHaptics Player!"); + ResoniteMod.Error("Make sure bHaptics Player is running and try restarting Resonite."); + return false; + } - _isInitialized = true; - ResoniteMod.Msg("bHapticsManager connected successfully!"); - - // Log connected devices - int deviceCount = ModernBHaptics.bHapticsManager.GetConnectedDeviceCount(); - ResoniteMod.Msg($"Connected devices: {deviceCount}"); - - foreach (ModernBHaptics.PositionID pos in Enum.GetValues(typeof(ModernBHaptics.PositionID))) { - if (ModernBHaptics.bHapticsManager.IsDeviceConnected(pos)) { - ResoniteMod.Debug($"Device {pos} ready"); - // Add to cache - DeviceCache[pos] = (true, DateTime.Now); + _isInitialized = true; + ResoniteMod.Msg("bHapticsManager connected successfully!"); + + // Log connected devices + int deviceCount = ModernBHaptics.bHapticsManager.GetConnectedDeviceCount(); + ResoniteMod.Msg($"Connected devices: {deviceCount}"); + + foreach (ModernBHaptics.PositionID pos in Enum.GetValues(typeof(ModernBHaptics.PositionID))) { + if (ModernBHaptics.bHapticsManager.IsDeviceConnected(pos)) { + ResoniteMod.Debug($"Device {pos} ready"); + // Add to cache + DeviceCache[pos] = (true, DateTime.Now); + } } - } - return true; + return true; + } } public List GetConnectedDevices() { @@ -185,7 +188,9 @@ public static void Shutdown() { ResoniteMod.Error($"Error clearing device cache: {ex}"); } - _isInitialized = false; + lock (_initializeLock) { + _isInitialized = false; + } ResoniteMod.Msg("bHaptics connection shutdown complete"); } catch (Exception ex) {