Skip to content

Commit da400d7

Browse files
authored
Merge pull request #9 from 0xced/Lock-SemaphoreSlim
Fix locking the serviceTable
2 parents 7d29bf9 + 87ae8da commit da400d7

File tree

1 file changed

+22
-9
lines changed

1 file changed

+22
-9
lines changed

Arkane.Zeroconf/Providers/Bonjour/ServiceBrowser.cs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using System.Collections ;
1212
using System.Collections.Generic ;
1313
using System.Diagnostics ;
14+
using System.Threading ;
1415
using System.Threading.Tasks ;
1516

1617
#endregion
@@ -30,6 +31,7 @@ public class ServiceBrowser : IServiceBrowser, IDisposable
3031

3132
private readonly Native.DNSServiceBrowseReply browseReplyHandler ;
3233
private readonly Dictionary <string, IResolvableService> serviceTable = new() ;
34+
private readonly SemaphoreSlim serviceTableSemaphore = new(1, 1) ;
3335

3436
private AddressProtocol address_protocol ;
3537
private string domain ;
@@ -54,11 +56,16 @@ public void Browse (uint interfaceIndex, AddressProtocol addressProtocol, string
5456

5557
public IEnumerator <IResolvableService> GetEnumerator ()
5658
{
57-
lock (this)
59+
serviceTableSemaphore.Wait();
60+
try
5861
{
5962
foreach (var service in this.serviceTable.Values)
6063
yield return service ;
6164
}
65+
finally
66+
{
67+
serviceTableSemaphore.Release();
68+
}
6269
}
6370

6471
IEnumerator IEnumerable.GetEnumerator () => this.GetEnumerator () ;
@@ -152,23 +159,29 @@ private void OnBrowseReply (ServiceRef sdRef,
152159

153160
if ((flags & ServiceFlags.Add) != 0)
154161
{
155-
lock (this.serviceTable)
162+
serviceTableSemaphore.Wait();
163+
try
164+
{
165+
this.serviceTable[name] = service;
166+
}
167+
finally
156168
{
157-
if (this.serviceTable.ContainsKey (name))
158-
this.serviceTable[name] = service ;
159-
else
160-
this.serviceTable.Add (name, service) ;
169+
serviceTableSemaphore.Release();
161170
}
162171

163172
var handler = this.ServiceAdded ;
164173
handler?.Invoke (this, args) ;
165174
}
166175
else
167176
{
168-
lock (this.serviceTable)
177+
serviceTableSemaphore.Wait();
178+
try
179+
{
180+
this.serviceTable.Remove (name) ;
181+
}
182+
finally
169183
{
170-
if (this.serviceTable.ContainsKey (name))
171-
this.serviceTable.Remove (name) ;
184+
serviceTableSemaphore.Release();
172185
}
173186

174187
var handler = this.ServiceRemoved ;

0 commit comments

Comments
 (0)