Skip to content

Commit f485074

Browse files
authored
[dotnet] [bidi] Rent buffer for receiving bytes in WebSocket (#16650)
1 parent 43d32dd commit f485074

File tree

3 files changed

+34
-5
lines changed

3 files changed

+34
-5
lines changed

dotnet/src/webdriver/BUILD.bazel

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ csharp_library(
6161
],
6262
deps = [
6363
nuget_package("Microsoft.Bcl.AsyncInterfaces"),
64+
nuget_package("System.Buffers"),
6465
nuget_package("System.Threading.Tasks.Extensions"),
6566
nuget_package("System.Memory"),
6667
nuget_package("System.Runtime.CompilerServices.Unsafe"),
@@ -94,6 +95,7 @@ csharp_library(
9495
deps = [
9596
nuget_package("NETStandard.Library"),
9697
nuget_package("Microsoft.Bcl.AsyncInterfaces"),
98+
nuget_package("System.Buffers"),
9799
nuget_package("System.Threading.Tasks.Extensions"),
98100
nuget_package("System.Memory"),
99101
nuget_package("System.Runtime.CompilerServices.Unsafe"),
@@ -150,6 +152,7 @@ csharp_library(
150152
],
151153
deps = [
152154
nuget_package("Microsoft.Bcl.AsyncInterfaces"),
155+
nuget_package("System.Buffers"),
153156
nuget_package("System.Threading.Tasks.Extensions"),
154157
nuget_package("System.Memory"),
155158
nuget_package("System.Runtime.CompilerServices.Unsafe"),
@@ -181,6 +184,7 @@ csharp_library(
181184
deps = [
182185
nuget_package("NETStandard.Library"),
183186
nuget_package("Microsoft.Bcl.AsyncInterfaces"),
187+
nuget_package("System.Buffers"),
184188
nuget_package("System.Threading.Tasks.Extensions"),
185189
nuget_package("System.Memory"),
186190
nuget_package("System.Runtime.CompilerServices.Unsafe"),

dotnet/src/webdriver/BiDi/Module.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ namespace OpenQA.Selenium.BiDi;
2323

2424
public abstract class Module
2525
{
26-
protected BiDi BiDi { get; private set; }
26+
protected BiDi BiDi { get; private set; } = null!;
2727

28-
protected Broker Broker { get; private set; }
28+
protected Broker Broker { get; private set; } = null!;
2929

3030
protected abstract void Initialize(JsonSerializerOptions options);
3131

dotnet/src/webdriver/BiDi/WebSocketTransport.cs

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
using OpenQA.Selenium.Internal.Logging;
2121
using System;
22+
using System.Buffers;
2223
using System.IO;
2324
using System.Net.WebSockets;
2425
using System.Text;
@@ -32,7 +33,7 @@ class WebSocketTransport(Uri _uri) : ITransport, IDisposable
3233
private readonly static ILogger _logger = Internal.Logging.Log.GetLogger<WebSocketTransport>();
3334

3435
private readonly ClientWebSocket _webSocket = new();
35-
private readonly ArraySegment<byte> _receiveBuffer = new(new byte[1024 * 8]);
36+
private readonly byte[] _receiveBuffer = ArrayPool<byte>.Shared.Rent(1024 * 8);
3637

3738
private readonly SemaphoreSlim _socketSendSemaphoreSlim = new(1, 1);
3839
private readonly MemoryStream _sharedMemoryStream = new();
@@ -46,13 +47,15 @@ public async Task<byte[]> ReceiveAsync(CancellationToken cancellationToken)
4647
{
4748
_sharedMemoryStream.SetLength(0);
4849

50+
ArraySegment<byte> segment = new(_receiveBuffer);
51+
4952
WebSocketReceiveResult result;
5053

5154
do
5255
{
53-
result = await _webSocket.ReceiveAsync(_receiveBuffer, cancellationToken).ConfigureAwait(false);
56+
result = await _webSocket.ReceiveAsync(segment, cancellationToken).ConfigureAwait(false);
5457

55-
_sharedMemoryStream.Write(_receiveBuffer.Array!, _receiveBuffer.Offset, result.Count);
58+
_sharedMemoryStream.Write(segment.Array!, segment.Offset, result.Count);
5659
}
5760
while (!result.EndOfMessage);
5861

@@ -85,10 +88,32 @@ public async Task SendAsync(byte[] data, CancellationToken cancellationToken)
8588
}
8689
}
8790

91+
private bool _disposed;
92+
8893
public void Dispose()
8994
{
95+
if (_disposed)
96+
{
97+
return;
98+
}
99+
90100
_webSocket.Dispose();
91101
_sharedMemoryStream.Dispose();
92102
_socketSendSemaphoreSlim.Dispose();
103+
ReleaseBuffer();
104+
_disposed = true;
105+
}
106+
107+
~WebSocketTransport()
108+
{
109+
ReleaseBuffer();
110+
}
111+
112+
private void ReleaseBuffer()
113+
{
114+
if (_receiveBuffer is not null)
115+
{
116+
ArrayPool<byte>.Shared.Return(_receiveBuffer);
117+
}
93118
}
94119
}

0 commit comments

Comments
 (0)