|
|
|
@ -33,7 +33,7 @@ namespace MediaBrowser.Controller.Net
|
|
|
|
|
SingleWriter = false
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
private readonly SemaphoreSlim _lock = new(1, 1);
|
|
|
|
|
private readonly object _activeConnectionsLock = new();
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The _active connections.
|
|
|
|
@ -126,15 +126,10 @@ namespace MediaBrowser.Controller.Net
|
|
|
|
|
InitialDelayMs = dueTimeMs
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
_lock.Wait();
|
|
|
|
|
try
|
|
|
|
|
lock (_activeConnectionsLock)
|
|
|
|
|
{
|
|
|
|
|
_activeConnections.Add((message.Connection, cancellationTokenSource, state));
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
_lock.Release();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected void SendData(bool force)
|
|
|
|
@ -153,8 +148,7 @@ namespace MediaBrowser.Controller.Net
|
|
|
|
|
(IWebSocketConnection Connection, CancellationTokenSource CancellationTokenSource, TStateType State)[] tuples;
|
|
|
|
|
|
|
|
|
|
var now = DateTime.UtcNow;
|
|
|
|
|
await _lock.WaitAsync().ConfigureAwait(false);
|
|
|
|
|
try
|
|
|
|
|
lock (_activeConnectionsLock)
|
|
|
|
|
{
|
|
|
|
|
if (_activeConnections.Count == 0)
|
|
|
|
|
{
|
|
|
|
@ -174,10 +168,6 @@ namespace MediaBrowser.Controller.Net
|
|
|
|
|
})
|
|
|
|
|
.ToArray();
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
_lock.Release();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (tuples.Length == 0)
|
|
|
|
|
{
|
|
|
|
@ -240,8 +230,7 @@ namespace MediaBrowser.Controller.Net
|
|
|
|
|
/// <param name="message">The message.</param>
|
|
|
|
|
private void Stop(WebSocketMessageInfo message)
|
|
|
|
|
{
|
|
|
|
|
_lock.Wait();
|
|
|
|
|
try
|
|
|
|
|
lock (_activeConnectionsLock)
|
|
|
|
|
{
|
|
|
|
|
var connection = _activeConnections.FirstOrDefault(c => c.Connection == message.Connection);
|
|
|
|
|
|
|
|
|
@ -250,10 +239,6 @@ namespace MediaBrowser.Controller.Net
|
|
|
|
|
DisposeConnection(connection);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
_lock.Release();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -283,15 +268,10 @@ namespace MediaBrowser.Controller.Net
|
|
|
|
|
Logger.LogError(ex, "Error disposing websocket");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_lock.Wait();
|
|
|
|
|
try
|
|
|
|
|
lock (_activeConnectionsLock)
|
|
|
|
|
{
|
|
|
|
|
_activeConnections.Remove(connection);
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
_lock.Release();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual async ValueTask DisposeAsyncCore()
|
|
|
|
@ -306,18 +286,13 @@ namespace MediaBrowser.Controller.Net
|
|
|
|
|
Logger.LogError(ex, "Disposing the message consumer failed");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await _lock.WaitAsync().ConfigureAwait(false);
|
|
|
|
|
try
|
|
|
|
|
lock (_activeConnectionsLock)
|
|
|
|
|
{
|
|
|
|
|
foreach (var connection in _activeConnections.ToArray())
|
|
|
|
|
{
|
|
|
|
|
DisposeConnection(connection);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
_lock.Release();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|