public void EnqueueOrMergeSendRequest(ReadOnlySpan <byte> message, SendRequestProcessingEngine engine)
        {
            var lockTaken = false;

            try
            {
                _lock.Enter(ref lockTaken);

                var currentEntry = _currentRequestEntry;

                if (currentEntry != null)
                {
                    if (TryAddMessageToExistingRequest(currentEntry, message))
                    {
                        return;
                    }
                }

                _currentRequestEntry = null;
            }
            finally
            {
                if (lockTaken)
                {
                    _lock.Exit();
                }
            }

            EnqueueNewMergeRequest(message, engine);
        }
 private void EnqueueNewMergeRequest(ReadOnlySpan <byte> message, SendRequestProcessingEngine engine)
 {
     using (var entry = engine.AcquireSendRequestEntry())
     {
         entry.Value->SetWriteRequest(_sessionId, message);
         _currentRequestEntry = entry.Value;
     }
 }
        private bool TryAddMessageToExistingRequest(SendRequestEntry *currentEntry, ReadOnlySpan <byte> message)
        {
            if (message.Length > _bufferSegmentLength - currentEntry->RioBufferSegmentDescriptor.Length)
            {
                return(false);
            }

            var endOfBatchingEntryData = currentEntry->GetBufferSegmentStart() + currentEntry->RioBufferSegmentDescriptor.Length;

            Unsafe.Write(endOfBatchingEntryData, message.Length);
            message.CopyTo(new Span <byte>(sizeof(int) + endOfBatchingEntryData, message.Length));
            currentEntry->RioBufferSegmentDescriptor.Length += sizeof(int) + message.Length;
            return(true);
        }
        public void DetachFrom(SendRequestEntry *entry)
        {
            var lockTaken = false;

            try
            {
                _lock.Enter(ref lockTaken);

                if (_currentRequestEntry == entry)
                {
                    _currentRequestEntry = null;
                }
            }
            finally
            {
                if (lockTaken)
                {
                    _lock.Exit();
                }
            }
        }
Exemple #5
0
 public AcquiredSendRequestEntry(UnmanagedRingBuffer <SendRequestEntry> ringBuffer, long sequence, SendRequestEntry *value)
 {
     _ringBuffer = ringBuffer;
     _sequence   = sequence;
     Value       = value;
 }
Exemple #6
0
 public void Reset()
 {
     BatchingEntry         = null;
     BatchingEntrySequence = default;
 }
Exemple #7
0
 public void Initialize(ref SendRequestEntry currentEntry, long sequence)
 {
     BatchingEntry         = (SendRequestEntry *)Unsafe.AsPointer(ref currentEntry);
     BatchingEntrySequence = sequence;
     Size = 1;
 }