public void When_multiple_messages_written_then_they_are_consumed_in_order_leaving_nothing()
        {
            var guidMessages = new GuidMessageReaderWriter();
            var store        = new SegmentChainMessageStore(guidMessages, _pool);

            var lowerBoundEstimationOfMessagesPerSegment = SingleThreadSegmentPool.SegmentSize / sizeof(Guid);
            var atLeastTwoSegmentsOfMessages             = lowerBoundEstimationOfMessagesPerSegment * 2;

            var guids = Enumerable.Range(0, atLeastTwoSegmentsOfMessages).Select(i => Guid.NewGuid()).ToArray();
            var env   = new Envelope();
            var head  = default(Segment *);

            fixed(Guid *g = guids)
            {
                for (var i = 0; i < guids.Length; i++)
                {
                    store.Write(ref env, ref *(g + i), ref head);
                }
            }

            store.Consume(guidMessages.MessageHandler, ref head);
            CollectionAssert.AreEquivalent(guids, guidMessages.Received);

            // nothing is left
            guidMessages.Received.Clear();

            store.Consume(guidMessages.MessageHandler, ref head);
            CollectionAssert.IsEmpty(guidMessages.Received);
        }
        public void When_multiple_messages_written_then_they_are_consumed_in_order_leaving_nothing()
        {
            var guidMessages = new GuidMessageReaderWriter();
            var store = new SegmentChainMessageStore(guidMessages, _pool);

            var lowerBoundEstimationOfMessagesPerSegment = SingleThreadSegmentPool.SegmentSize/sizeof (Guid);
            var atLeastTwoSegmentsOfMessages = lowerBoundEstimationOfMessagesPerSegment*2;

            var guids = Enumerable.Range(0, atLeastTwoSegmentsOfMessages).Select(i => Guid.NewGuid()).ToArray();
            var env = new Envelope();
            var head = default(Segment*);

            fixed (Guid* g = guids)
            {
                for (var i = 0; i < guids.Length; i++)
                {
                    store.Write(ref env, ref *(g + i), ref head);
                }
            }

            store.Consume(guidMessages.MessageHandler, ref head);
            CollectionAssert.AreEquivalent(guids, guidMessages.Received);

            // nothing is left
            guidMessages.Received.Clear();

            store.Consume(guidMessages.MessageHandler, ref head);
            CollectionAssert.IsEmpty(guidMessages.Received);
        }
Beispiel #3
0
        public TimerWheel(ActorId thisActor, ISegmentPool pool, IMessageWriter writer, MessageHandler handler,
                          TimeSpan tickLength, Func <long> getTicks, long ticksPerSecond)
        {
            _envelope = new Envelope(thisActor);
            _pool     = pool;
            _handler  = handler;
            _getTicks = getTicks;
            _store    = new SegmentChainMessageStore(writer, pool);
            var segment = _pool.Pop();

            _wheel   = (Segment **)segment->Buffer;
            _segment = segment;

            // ensure clean wheel
            for (var i = 0; i < TimeoutsPerSegment; i++)
            {
                _wheel[i] = null;
            }

            _ticksPerMilisecond           = ticksPerSecond / 1000;
            _clockTickDurationInStopWatch = (long)tickLength.TotalMilliseconds * _ticksPerMilisecond;
            _startTime = _getTicks();
        }