Skip to content

Commit 7309adb

Browse files
committed
Ensure thread-safe ref count update
1 parent 133e0b0 commit 7309adb

File tree

2 files changed

+10
-7
lines changed

2 files changed

+10
-7
lines changed

Bonsai.Arduino/ArduinoDisposable.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ public void Dispose()
2626
var disposable = Interlocked.Exchange(ref resource, null);
2727
if (disposable != null)
2828
{
29-
disposable.Dispose();
29+
lock (ArduinoManager.SyncRoot)
30+
{
31+
disposable.Dispose();
32+
}
3033
}
3134
}
3235
}

Bonsai.Arduino/ArduinoManager.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ namespace Bonsai.Arduino
1212
internal static class ArduinoManager
1313
{
1414
public const string DefaultConfigurationFile = "Arduino.config";
15-
static readonly Dictionary<string, Tuple<Arduino, RefCountDisposable>> openConnections = new Dictionary<string, Tuple<Arduino, RefCountDisposable>>();
16-
static readonly object openConnectionsLock = new object();
15+
static readonly Dictionary<string, Tuple<Arduino, RefCountDisposable>> openConnections = new();
16+
internal static readonly object SyncRoot = new();
1717

1818
public static ArduinoDisposable ReserveConnection(string portName)
1919
{
@@ -27,8 +27,8 @@ public static async Task<ArduinoDisposable> ReserveConnectionAsync(string portNa
2727

2828
internal static ArduinoDisposable ReserveConnection(string portName, ArduinoConfiguration arduinoConfiguration)
2929
{
30-
var connection = default(Tuple<Arduino, RefCountDisposable>);
31-
lock (openConnectionsLock)
30+
Tuple<Arduino, RefCountDisposable> connection = default;
31+
lock (SyncRoot)
3232
{
3333
if (string.IsNullOrEmpty(portName))
3434
{
@@ -64,9 +64,9 @@ internal static ArduinoDisposable ReserveConnection(string portName, ArduinoConf
6464
openConnections.Add(portName, connection);
6565
return new ArduinoDisposable(arduino, refCount);
6666
}
67-
}
6867

69-
return new ArduinoDisposable(connection.Item1, connection.Item2.GetDisposable());
68+
return new ArduinoDisposable(connection.Item1, connection.Item2.GetDisposable());
69+
}
7070
}
7171

7272
[Obsolete]

0 commit comments

Comments
 (0)