discovery fix

This commit is contained in:
EugeneTes
2026-01-28 14:40:32 +01:00
parent 8be53cec4e
commit 83998f6fd1
4 changed files with 72 additions and 18 deletions

View File

@@ -6,7 +6,9 @@ public class PrintServer
private readonly IPrintService _printService;
private readonly ILogger _logger;
private readonly ConcurrentDictionary<string, PrinterQueue> _printerQueues;
private readonly ReaderWriterLockSlim _printDiscoveryLock = new();
private readonly SemaphoreSlim _printDiscoveryLock = new(1, 1);
private int _readerCount = 0;
private readonly object _readerCountLock = new();
public PrintServer(IPrintService printService, ILogger logger)
{
@@ -19,23 +21,58 @@ public class PrintServer
/// <summary>
/// Acquires a read lock for print operations. Multiple print operations can run concurrently.
/// </summary>
public void EnterPrintLock() => _printDiscoveryLock.EnterReadLock();
public void EnterPrintLock()
{
_logger.LogDebug("Entering print lock");
lock (_readerCountLock)
{
_readerCount++;
if (_readerCount == 1)
{
_printDiscoveryLock.Wait();
}
}
_logger.LogDebug("Entered print lock");
}
/// <summary>
/// Releases the read lock after a print operation completes.
/// </summary>
public void ExitPrintLock() => _printDiscoveryLock.ExitReadLock();
public void ExitPrintLock()
{
_logger.LogDebug("Exiting print lock");
lock (_readerCountLock)
{
_readerCount--;
if (_readerCount == 0)
{
_printDiscoveryLock.Release();
}
}
_logger.LogDebug("Exited print lock");
}
/// <summary>
/// Acquires a write lock for discovery operations. This blocks until all print operations complete
/// and prevents new print operations from starting.
/// </summary>
public void EnterDiscoveryLock() => _printDiscoveryLock.EnterWriteLock();
public async Task EnterDiscoveryLockAsync()
{
_logger.LogDebug("Entering discovery lock");
await _printDiscoveryLock.WaitAsync();
_logger.LogDebug("Entered discovery lock");
}
/// <summary>
/// Releases the write lock after discovery completes.
/// </summary>
public void ExitDiscoveryLock() => _printDiscoveryLock.ExitWriteLock();
public void ExitDiscoveryLock()
{
_logger.LogDebug("Exiting discovery lock");
_printDiscoveryLock.Release();
_logger.LogDebug("Exited discovery lock");
}
public void RegisterPrinter(string printerIp)
{