Ejemplo n.º 1
0
    public static ValueEventPoller <T> Create <T>(IValueDataProvider <T> dataProvider, ISequencer sequencer, Sequence sequence, Sequence cursorSequence, params ISequence[] gatingSequences)
        where T : struct
    {
        var dependentSequences = new DependentSequenceGroup(cursorSequence, gatingSequences);

        return(new ValueEventPoller <T>(dataProvider, sequencer, sequence, dependentSequences));
    }
Ejemplo n.º 2
0
 public ValueEventPoller(IValueDataProvider <T> dataProvider, ISequencer sequencer, ISequence sequence, DependentSequenceGroup dependentSequences)
 {
     _dataProvider       = dataProvider;
     _sequencer          = sequencer;
     _sequence           = sequence;
     _dependentSequences = dependentSequences;
 }
Ejemplo n.º 3
0
 public CustomSequenceBarrier(ISequencer sequencer, IWaitStrategy waitStrategy, Sequence cursorSequence, ISequence[] dependentSequences)
 {
     _sequencer               = sequencer;
     _waitStrategy            = waitStrategy;
     _dependentSequences      = new DependentSequenceGroup(cursorSequence, dependentSequences);
     _cancellationTokenSource = new CancellationTokenSource();
 }
Ejemplo n.º 4
0
    public void ShouldGetCursorValueAsValueWhenThereAreNoDependentSequences()
    {
        var cursor             = new Sequence(42);
        var dependentSequences = new DependentSequenceGroup(cursor);

        var value = dependentSequences.Value;

        Assert.AreEqual(42, value);
    }
Ejemplo n.º 5
0
    public void ShouldGetCursorValue()
    {
        var cursor             = new Sequence(42);
        var dependentSequences = new DependentSequenceGroup(cursor);

        var cursorValue = dependentSequences.CursorValue;

        Assert.AreEqual(42, cursorValue);
    }
    public SequenceWaitResult WaitFor(long sequence, DependentSequenceGroup dependentSequences, CancellationToken cancellationToken)
    {
        long availableSequence;

        while ((availableSequence = dependentSequences.Value) < sequence)
        {
            cancellationToken.ThrowIfCancellationRequested();
        }

        return(availableSequence);
    }
Ejemplo n.º 7
0
    public AsyncSequenceBarrier(ISequencer sequencer, IWaitStrategy waitStrategy, Sequence cursorSequence, ISequence[] dependentSequences)
    {
        if (waitStrategy is not IAsyncWaitStrategy asyncWaitStrategy)
        {
            throw new InvalidOperationException($"The disruptor must be configured with an async wait strategy (e.g.: {nameof(AsyncWaitStrategy)}");
        }

        _sequencer               = sequencer;
        _waitStrategy            = asyncWaitStrategy;
        _dependentSequences      = new DependentSequenceGroup(cursorSequence, dependentSequences);
        _cancellationTokenSource = new CancellationTokenSource();
    }
Ejemplo n.º 8
0
    public SequenceWaitResult WaitFor(long sequence, DependentSequenceGroup dependentSequences, CancellationToken cancellationToken)
    {
        long availableSequence;
        int  counter = _retries;

        while ((availableSequence = dependentSequences.Value) < sequence)
        {
            counter = ApplyWaitMethod(cancellationToken, counter);
        }

        return(availableSequence);
    }
Ejemplo n.º 9
0
    public void ShouldGetMinimumValueFromCustomSequences([Range(1, 4)] int dependentSequenceCount)
    {
        var cursor    = new Sequence();
        var random    = new Random();
        var sequences = Enumerable.Range(0, dependentSequenceCount)
                        .Select(_ => new ConstantSequence(random.Next(1000)))
                        .Cast <ISequence>()
                        .ToArray();

        var dependentSequences = new DependentSequenceGroup(cursor, sequences);

        var value = dependentSequences.Value;

        var expectedValue = sequences.Select(x => x.Value).Min();

        Assert.AreEqual(expectedValue, value);
    }
    public void ShouldWaitMultipleTimesAsync()
    {
        // Arrange
        var waitStrategy = CreateWaitStrategy();
        var sequence1    = new Sequence();

        var waitTask1 = Task.Run(async() =>
        {
            var cancellationTokenSource = new CancellationTokenSource();
            var dependentSequences      = new DependentSequenceGroup(Cursor);

            for (var i = 0; i < 500; i++)
            {
                await waitStrategy.WaitForAsync(i, dependentSequences, cancellationTokenSource.Token).ConfigureAwait(false);
                sequence1.SetValue(i);
            }
        });

        var waitTask2 = Task.Run(async() =>
        {
            var cancellationTokenSource = new CancellationTokenSource();
            var dependentSequences      = new DependentSequenceGroup(Cursor, sequence1);

            for (var i = 0; i < 500; i++)
            {
                await waitStrategy.WaitForAsync(i, dependentSequences, cancellationTokenSource.Token).ConfigureAwait(false);
            }
        });

        // Act
        for (var i = 0; i < 500; i++)
        {
            if (i % 50 == 0)
            {
                Thread.Sleep(1);
            }

            Cursor.SetValue(i);
            waitStrategy.SignalAllWhenBlocking();
        }

        // Assert
        AssertIsCompleted(waitTask1);
        AssertIsCompleted(waitTask2);
    }
    public SequenceWaitResult WaitFor(long sequence, DependentSequenceGroup dependentSequences, CancellationToken cancellationToken)
    {
        long startTime = 0;
        int  counter   = _spinTries;

        do
        {
            long availableSequence;
            if ((availableSequence = dependentSequences.Value) >= sequence)
            {
                return(availableSequence);
            }

            if (0 == --counter)
            {
                if (0 == startTime)
                {
                    startTime = GetSystemTimeTicks();
                }
                else
                {
                    var timeDelta = GetSystemTimeTicks() - startTime;
                    if (timeDelta > _yieldTimeoutTicks)
                    {
                        return(_fallbackStrategy.WaitFor(sequence, dependentSequences, cancellationToken));
                    }

                    if (timeDelta > _spinTimeoutTicks)
                    {
                        Thread.Yield();
                    }
                }

                counter = _spinTries;
            }
        }while (true);
    }
 public SequenceWaitResult WaitFor(long sequence, DependentSequenceGroup dependentSequences, CancellationToken cancellationToken)
 {
     return(dependentSequences.SpinWaitFor(sequence, cancellationToken));
 }
Ejemplo n.º 13
0
 public WorkerPoolInfo(WorkerPool <T> workerPool, DependentSequenceGroup dependentSequences)
 {
     _workerPool        = workerPool;
     DependentSequences = dependentSequences;
     IsEndOfChain       = true;
 }