mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-02-18 16:27:42 +01:00
* Fix construction of path in OpenApiParser (#1265) * Server-Sent Events (#1269) * Server Side Events * fixes * await HandleSseStringAsync(responseMessage, response, bodyData); * 1.7.5-preview-01 * IBlockingQueue * 1.7.5-preview-02 (03 April 2025) * IBlockingQueue * ... * Support OpenApi V31 (#1279) * Support OpenApi V31 * Update src/WireMock.Net.OpenApiParser/Extensions/OpenApiSchemaExtensions.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fx --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Add ProtoDefinitionHelper.FromDirectory (#1263) * Add ProtoDefinitionHelper.FromDirectory * . * unix-windows * move test * imports in the proto files indeed should use a forward slash * updates * . * private Func<IdOrTexts> ProtoDefinitionFunc() * OpenTelemetry * . * fix path utils --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
85 lines
2.3 KiB
C#
85 lines
2.3 KiB
C#
// Copyright © WireMock.Net
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Threading;
|
|
|
|
namespace WireMock.Models;
|
|
|
|
/// <inheritdoc />
|
|
internal class BlockingQueue<T>(TimeSpan? readTimeout = null) : IBlockingQueue<T>
|
|
{
|
|
private readonly TimeSpan _readTimeout = readTimeout ?? TimeSpan.FromHours(1);
|
|
private readonly Queue<T?> _queue = new();
|
|
private readonly object _lockObject = new();
|
|
|
|
private bool _isClosed;
|
|
|
|
/// <summary>
|
|
/// Writes an item to the queue and signals that an item is available.
|
|
/// </summary>
|
|
/// <param name="item">The item to be added to the queue.</param>
|
|
public void Write(T item)
|
|
{
|
|
lock (_lockObject)
|
|
{
|
|
if (_isClosed)
|
|
{
|
|
throw new InvalidOperationException("Cannot write to a closed queue.");
|
|
}
|
|
|
|
_queue.Enqueue(item);
|
|
|
|
// Signal that an item is available
|
|
Monitor.Pulse(_lockObject);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tries to read an item from the queue.
|
|
/// - waits until an item is available
|
|
/// - or the timeout occurs
|
|
/// - or queue is closed
|
|
/// </summary>
|
|
/// <param name="item">The item read from the queue, or default if the timeout occurs.</param>
|
|
/// <returns>True if an item was successfully read; otherwise, false.</returns>
|
|
public bool TryRead([NotNullWhen(true)] out T? item)
|
|
{
|
|
lock (_lockObject)
|
|
{
|
|
// Wait until an item is available or timeout occurs
|
|
while (_queue.Count == 0 && !_isClosed)
|
|
{
|
|
// Wait with timeout
|
|
if (!Monitor.Wait(_lockObject, _readTimeout))
|
|
{
|
|
item = default;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// After waiting, check if we have items
|
|
if (_queue.Count == 0)
|
|
{
|
|
item = default;
|
|
return false;
|
|
}
|
|
|
|
item = _queue.Dequeue();
|
|
return item != null;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Closes the queue and signals all waiting threads.
|
|
/// </summary>
|
|
public void Close()
|
|
{
|
|
lock (_lockObject)
|
|
{
|
|
_isClosed = true;
|
|
Monitor.PulseAll(_lockObject);
|
|
}
|
|
}
|
|
} |