Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
 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;
 }
Esempio n. 3
0
        public void Push(Segment* segment)
        {
            if (_segment != null)
            {
                throw new InvalidOperationException();
            }

            _segment = segment;
        }
Esempio n. 4
0
        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;
        }
Esempio n. 5
0
        public bool TryPop(out Segment* result)
        {
            if (_head == null)
            {
                result = null;
                return false;
            }

            result = _head;
            _head = _head->Next;
            result->Next = null;

            return true;
        }
Esempio n. 6
0
        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;
        }
Esempio n. 7
0
 public Payload(Segment* head, IndexCalculator calculator, int length, int position)
 {
     Head = head;
     Calculator = calculator;
     Length = length;
     Position = position;
 }
Esempio n. 8
0
        protected static Segment* GetTailOrThis(Segment* segment)
        {
            if (segment == null)
            {
                return null;
            }

            var tail = segment;
            while (tail->Next != null)
            {
                tail = tail->Next;
            }
            return tail;
        }
Esempio n. 9
0
 public int TryPop(int numberOfSegmentsToRetrieve, out Segment* startingSegment)
 {
     throw new System.NotImplementedException();
 }
Esempio n. 10
0
 public bool TryPop(out Segment* result)
 {
     result = _segment;
     _segment = null;
     return result != null;
 }