Skip to content

Commit a8db442

Browse files
authored
Merge branch 'master' into Linux
2 parents 486d094 + da400d7 commit a8db442

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
@@ -12,6 +12,7 @@
1212
using System.Collections.Generic ;
1313
using System.Diagnostics ;
1414
using System.Runtime.InteropServices ;
15+
using System.Threading ;
1516
using System.Threading.Tasks ;
1617

1718
#endregion
@@ -31,6 +32,7 @@ public class ServiceBrowser : IServiceBrowser, IDisposable
3132

3233
private readonly Native.DNSServiceBrowseReply browseReplyHandler ;
3334
private readonly Dictionary <string, IResolvableService> serviceTable = new() ;
35+
private readonly SemaphoreSlim serviceTableSemaphore = new(1, 1) ;
3436

3537
private AddressProtocol address_protocol ;
3638
private string domain ;
@@ -55,11 +57,16 @@ public void Browse (uint interfaceIndex, AddressProtocol addressProtocol, string
5557

5658
public IEnumerator <IResolvableService> GetEnumerator ()
5759
{
58-
lock (this)
60+
serviceTableSemaphore.Wait();
61+
try
5962
{
6063
foreach (var service in this.serviceTable.Values)
6164
yield return service ;
6265
}
66+
finally
67+
{
68+
serviceTableSemaphore.Release();
69+
}
6370
}
6471

6572
IEnumerator IEnumerable.GetEnumerator () => this.GetEnumerator () ;
@@ -153,23 +160,29 @@ private void OnBrowseReply (ServiceRef sdRef,
153160

154161
if ((flags & ServiceFlags.Add) != 0)
155162
{
156-
lock (this.serviceTable)
163+
serviceTableSemaphore.Wait();
164+
try
165+
{
166+
this.serviceTable[name] = service;
167+
}
168+
finally
157169
{
158-
if (this.serviceTable.ContainsKey (name))
159-
this.serviceTable[name] = service ;
160-
else
161-
this.serviceTable.Add (name, service) ;
170+
serviceTableSemaphore.Release();
162171
}
163172

164173
var handler = this.ServiceAdded ;
165174
handler?.Invoke (this, args) ;
166175
}
167176
else
168177
{
169-
lock (this.serviceTable)
178+
serviceTableSemaphore.Wait();
179+
try
180+
{
181+
this.serviceTable.Remove (name) ;
182+
}
183+
finally
170184
{
171-
if (this.serviceTable.ContainsKey (name))
172-
this.serviceTable.Remove (name) ;
185+
serviceTableSemaphore.Release();
173186
}
174187

175188
var handler = this.ServiceRemoved ;

0 commit comments

Comments
 (0)