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(); } } }
public AcquiredSendRequestEntry(UnmanagedRingBuffer <SendRequestEntry> ringBuffer, long sequence, SendRequestEntry *value) { _ringBuffer = ringBuffer; _sequence = sequence; Value = value; }
public void Reset() { BatchingEntry = null; BatchingEntrySequence = default; }
public void Initialize(ref SendRequestEntry currentEntry, long sequence) { BatchingEntry = (SendRequestEntry *)Unsafe.AsPointer(ref currentEntry); BatchingEntrySequence = sequence; Size = 1; }