Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 26 additions & 11 deletions dotnet/src/webdriver/BiDi/EventDispatcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ internal sealed class EventDispatcher : IAsyncDisposable

private readonly ConcurrentDictionary<string, EventRegistration> _eventRegistrations = new();

private readonly ConcurrentDictionary<Task, byte> _runningHandlers = new();

private readonly Channel<PendingEvent> _pendingEvents = Channel.CreateUnbounded<PendingEvent>(new()
{
SingleReader = true,
Expand Down Expand Up @@ -81,23 +83,34 @@ private async Task ProcessEventsAwaiterAsync()
{
while (reader.TryRead(out var result))
{
try
if (_eventRegistrations.TryGetValue(result.Method, out var registration))
{
if (_eventRegistrations.TryGetValue(result.Method, out var registration))
foreach (var handler in registration.GetHandlers()) // copy-on-write array, safe to iterate
{
foreach (var handler in registration.GetHandlers()) // copy-on-write array, safe to iterate
var runningHandlerTask = InvokeHandlerAsync(handler, result.EventArgs);
if (!runningHandlerTask.IsCompleted)
{
await handler.InvokeAsync(result.EventArgs).ConfigureAwait(false);
_runningHandlers.TryAdd(runningHandlerTask, 0);
_ = runningHandlerTask.ContinueWith(static (t, state) => ((ConcurrentDictionary<Task, byte>)state!).TryRemove(t, out _),
_runningHandlers, TaskContinuationOptions.ExecuteSynchronously);
}
Comment thread
nvborisenko marked this conversation as resolved.
Resolved
}
}
catch (Exception ex)
{
if (_logger.IsEnabled(LogEventLevel.Error))
{
_logger.Error($"Unhandled error processing BiDi event handler: {ex}");
}
}
}
}
}

private async Task InvokeHandlerAsync(EventHandler handler, EventArgs eventArgs)
{
try
{
await handler.InvokeAsync(eventArgs).ConfigureAwait(false);
}
catch (Exception ex)
{
if (_logger.IsEnabled(LogEventLevel.Error))
{
_logger.Error($"Unhandled error processing BiDi event handler: {ex}");
}
Comment thread
nvborisenko marked this conversation as resolved.
Resolved
}
}
Expand All @@ -108,6 +121,8 @@ public async ValueTask DisposeAsync()

await _eventEmitterTask.ConfigureAwait(false);

await Task.WhenAll(_runningHandlers.Keys).ConfigureAwait(false);

GC.SuppressFinalize(this);
}

Expand Down
Loading