public SingleThreadSegmentPool(int segmentCount) { if (segmentCount < 1024) { throw new ArgumentException($"SegmentCount must be at least {MinimalSegmentCount}", nameof(segmentCount)); } var segmentStructureOverhead = segmentCount*Segment.Size; var segmentData = segmentCount*SegmentSize; _buffer = new UnsafeBuffer(segmentData + segmentStructureOverhead); var segments = (Segment*) _buffer.RawBytes; var data = _buffer.RawBytes + segmentStructureOverhead; for (var i = 0; i < segmentCount; i++) { var s = segments + i; var buffer = data + i*SegmentSize; var segment = new Segment(buffer, SegmentSize); // copy to the memory pointed by s Native.MemcpyUnmanaged((byte*) s, (byte*) &segment, Segment.Size); Push(s); } }
public OneSegmentOnlyPool() { _handle = GCHandle.Alloc(_managedBytes, GCHandleType.Pinned); var bytes = (byte*) _handle.AddrOfPinnedObject(); _segment = (Segment*) (bytes + SingleThreadSegmentPool.SegmentSize); *_segment = new Segment(bytes, SingleThreadSegmentPool.SegmentSize); SegmentLength = SingleThreadSegmentPool.SegmentSize; }
public void Push(Segment* segment) { if (_segment != null) { throw new InvalidOperationException(); } _segment = segment; }
public void Push(Segment* segment) { if (segment->Length != SegmentLength) { throw new ArgumentException( "The segment length is different from the segment sizes of this pool. Are you trying to push a segment from another pool maybe?"); } var tail = segment->Tail; if (tail == null) { segment->Next = _head; } else { tail->Next = _head; } _head = segment; }
public bool TryPop(out Segment* result) { if (_head == null) { result = null; return false; } result = _head; _head = _head->Next; result->Next = null; return true; }
public int TryPop(int numberOfSegmentsToRetrieve, out Segment* startingSegment) { if (_head == null) { startingSegment = null; return 0; } var next = _head; var nodesCount = 1; for (; nodesCount < numberOfSegmentsToRetrieve && next->Next != null; nodesCount++) { next = next->Next; } startingSegment = _head; _head = next->Next; next->Next = null; // cut the end return nodesCount; }
public Payload(Segment* head, IndexCalculator calculator, int length, int position) { Head = head; Calculator = calculator; Length = length; Position = position; }
protected static Segment* GetTailOrThis(Segment* segment) { if (segment == null) { return null; } var tail = segment; while (tail->Next != null) { tail = tail->Next; } return tail; }
public int TryPop(int numberOfSegmentsToRetrieve, out Segment* startingSegment) { throw new System.NotImplementedException(); }
public bool TryPop(out Segment* result) { result = _segment; _segment = null; return result != null; }