-
Notifications
You must be signed in to change notification settings - Fork 226
/
BlockingSpinWaitWaitStrategy.cs
42 lines (36 loc) · 1.24 KB
/
BlockingSpinWaitWaitStrategy.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System.Threading;
namespace Disruptor;
/// <summary>
/// Blocking wait strategy that uses <c>Monitor.Wait</c> and <c>Monitor.PulseAll</c>.
/// </summary>
/// <remarks>
/// This strategy can be used when throughput and low-latency are not as important as CPU resources.
/// This strategy uses a <see cref="SpinWait"/> when waiting for the dependent sequence to prevent excessive CPU usage.
/// </remarks>
public sealed class BlockingSpinWaitWaitStrategy : IWaitStrategy
{
private readonly object _gate = new();
public bool IsBlockingStrategy => true;
public SequenceWaitResult WaitFor(long sequence, DependentSequenceGroup dependentSequences, CancellationToken cancellationToken)
{
if (dependentSequences.CursorValue < sequence)
{
lock (_gate)
{
while (dependentSequences.CursorValue < sequence)
{
cancellationToken.ThrowIfCancellationRequested();
Monitor.Wait(_gate);
}
}
}
return dependentSequences.SpinWaitFor(sequence, cancellationToken);
}
public void SignalAllWhenBlocking()
{
lock (_gate)
{
Monitor.PulseAll(_gate);
}
}
}