示例#1
0
        internal static bool TestArgumentsExceptions <T>(ISourceBlock <T> source)
        {
            bool passed = true;

            var validMessageHeader                 = new DataflowMessageHeader(1);
            var invalidMessageHeader               = default(DataflowMessageHeader);
            ITargetBlock <T>    validTarget        = new BufferBlock <T>();
            ITargetBlock <T>    invalidTarget      = null;
            DataflowLinkOptions invalidLinkOptions = null;
            DataflowLinkOptions validLinkOptions   = new DataflowLinkOptions();
            bool consumed;

            Assert.Throws <ArgumentNullException>(() => source.ConsumeMessage(validMessageHeader, invalidTarget, out consumed));
            Assert.Throws <ArgumentException>(() => source.ConsumeMessage(invalidMessageHeader, validTarget, out consumed));
            Assert.Throws <ArgumentException>(() => source.ConsumeMessage(invalidMessageHeader, invalidTarget, out consumed));
            Assert.Throws <ArgumentNullException>(() => source.ReserveMessage(validMessageHeader, invalidTarget));
            Assert.Throws <ArgumentException>(() => source.ReserveMessage(invalidMessageHeader, validTarget));
            Assert.Throws <ArgumentException>(() => source.ReserveMessage(invalidMessageHeader, invalidTarget));
            Assert.Throws <ArgumentNullException>(() => source.ReleaseReservation(validMessageHeader, invalidTarget));
            Assert.Throws <ArgumentException>(() => source.ReleaseReservation(invalidMessageHeader, validTarget));
            Assert.Throws <ArgumentException>(() => source.ReleaseReservation(invalidMessageHeader, invalidTarget));
            Assert.Throws <ArgumentNullException>(() => source.LinkTo(invalidTarget));
            Assert.Throws <ArgumentNullException>(() => source.LinkTo(invalidTarget, validLinkOptions));
            Assert.Throws <ArgumentNullException>(() => source.LinkTo(validTarget, invalidLinkOptions));
            Assert.Throws <ArgumentNullException>(() => source.LinkTo(invalidTarget, invalidLinkOptions));

            return(passed);
        }
示例#2
0
        public DataflowMessageStatus OfferMessage(
            DataflowMessageHeader messageHeader, TInput messageValue,
            ISourceBlock <TInput> source, bool consumeToAccept)
        {
            if (!messageHeader.IsValid)
            {
                throw new ArgumentException("The messageHeader is not valid.",
                                            "messageHeader");
            }
            if (consumeToAccept && source == null)
            {
                throw new ArgumentException(
                          "consumeToAccept may only be true if provided with a non-null source.",
                          "consumeToAccept");
            }

            if (consumeToAccept)
            {
                if (!source.ReserveMessage(messageHeader, this))
                {
                    return(DataflowMessageStatus.NotAvailable);
                }
                bool consummed;
                source.ConsumeMessage(messageHeader, this, out consummed);
                if (!consummed)
                {
                    return(DataflowMessageStatus.NotAvailable);
                }
            }

            return(DataflowMessageStatus.Accepted);
        }
示例#3
0
        internal static bool TestConsumeMessage <T>(ISourceBlock <T> source)
        {
            bool consumed;

            source.ConsumeMessage(new DataflowMessageHeader(-99), new ActionBlock <T>(i => { }), out consumed);
            if (consumed)
            {
                Console.WriteLine("ConsumeMessage failed, didn't return messageConsumed==false for a unresrved msg");
                return(false);
            }

            // test consume the correct message with different target
            var mres           = new ManualResetEventSlim(false);
            var offeredMessage = default(DataflowMessageHeader);
            var target1        = new TransparentBlock <T>((msg) =>
            {
                offeredMessage = msg;
                mres.Set();
            }, false);

            source.LinkTo(target1);
            mres.Wait();

            if (!source.ReserveMessage(offeredMessage, target1))
            {
                Console.WriteLine("ReserveMessage failed, returned false");
                return(false);
            }

            //exclude writeOnce and broadCast because they don't respect reservation to the target
            if (!(source is WriteOnceBlock <T> || source is BroadcastBlock <T>))
            {
                //define another target
                var target2 = new TransparentBlock <T>(null);
                source.ConsumeMessage(offeredMessage, target2, out consumed);
                if (consumed)
                {
                    Console.WriteLine("ConsumeMessage failed, a different target succeeded to consume the message that it doesn't own");
                    return(false);
                }
            }

            //same target different msg
            source.ConsumeMessage(new DataflowMessageHeader(-99), target1, out consumed);
            if (consumed)
            {
                Console.WriteLine("ConsumeMessage failed, the target succeeded to consume a differnt msg");
                return(false);
            }

            //same target, same message
            source.ConsumeMessage(offeredMessage, target1, out consumed);
            if (!consumed)
            {
                Console.WriteLine("ConsumeMessage failed, the target failed to consume the reserved msg");
                return(false);
            }

            return(true);
        }
示例#4
0
        internal static void TestConsumeReserveReleaseArgumentsExceptions <T>(ISourceBlock <T> source)
        {
            DataflowMessageHeader validMessageHeader = new DataflowMessageHeader(1), invalidMessageHeader = default(DataflowMessageHeader);
            ITargetBlock <T>      validTarget = new BufferBlock <T>(), invalidTarget = null;
            bool consumed;

            Assert.Throws <ArgumentNullException>(() => source.ConsumeMessage(validMessageHeader, invalidTarget, out consumed));
            Assert.Throws <ArgumentException>(() => source.ConsumeMessage(invalidMessageHeader, validTarget, out consumed));
            Assert.Throws <ArgumentException>(() => source.ConsumeMessage(invalidMessageHeader, invalidTarget, out consumed));
            Assert.Throws <ArgumentNullException>(() => source.ReserveMessage(validMessageHeader, invalidTarget));
            Assert.Throws <ArgumentException>(() => source.ReserveMessage(invalidMessageHeader, validTarget));
            Assert.Throws <ArgumentException>(() => source.ReserveMessage(invalidMessageHeader, invalidTarget));
            Assert.Throws <ArgumentNullException>(() => source.ReleaseReservation(validMessageHeader, invalidTarget));
            Assert.Throws <ArgumentException>(() => source.ReleaseReservation(invalidMessageHeader, validTarget));
            Assert.Throws <ArgumentException>(() => source.ReleaseReservation(invalidMessageHeader, invalidTarget));
        }
示例#5
0
        public bool ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock <T> target)
        {
            bool result = Source.ReserveMessage(messageHeader, target);

            BlockInfo.PoolRequestCounters.IncrementReserve();
            return(result);
        }
示例#6
0
        static void SourceBlockTestInternal <T>(ISourceBlock <T> block)
        {
            var target = new BufferBlock <T> ();

            bool consumed;

            // invalid header
            AssertEx.Throws <ArgumentException> (
                () =>
                block.ConsumeMessage(new DataflowMessageHeader(), target, out consumed));

            // header that wasn't sent by the block doesn't throw
            block.ConsumeMessage(new DataflowMessageHeader(1), target, out consumed);

            AssertEx.Throws <ArgumentNullException> (
                () =>
                block.ConsumeMessage(new DataflowMessageHeader(1), null, out consumed));


            AssertEx.Throws <ArgumentException> (
                () =>
                block.ReserveMessage(new DataflowMessageHeader(), target));

            // header that wasn't sent by the block doesn't throw
            block.ReserveMessage(new DataflowMessageHeader(1), target);

            AssertEx.Throws <ArgumentNullException> (
                () =>
                block.ReserveMessage(new DataflowMessageHeader(1), null));

            AssertEx.Throws <ArgumentException> (
                () =>
                block.ReleaseReservation(new DataflowMessageHeader(), target));

            AssertEx.Throws <ArgumentNullException>(() => block.LinkTo(null, new DataflowLinkOptions()));

            AssertEx.Throws <ArgumentNullException>(() => block.LinkTo(target, null));
        }
示例#7
0
        public DataflowMessageStatus OfferMessage(DataflowMessageHeader messageHeader, T messageValue, ISourceBlock <T> source, bool consumeToAccept)
        {
            // Either both tasks are set or both tasks are unset
            Contract.Assert(!(ReservingTask != null ^ ReleasingTask != null));

            // Reserve the message only if there is no other reservation in place
            if (ReservingTask == null)
            {
                ReservingTask = Task.Run(() => { return(source.ReserveMessage(messageHeader, this)); });
                ReleasingTask = new Task(() => { source.ReleaseReservation(messageHeader, this); });
            }

            return(DataflowMessageStatus.Postponed);
        }
示例#8
0
        public DataflowMessageStatus OfferMessage(ITargetBlock <TInput> target,
                                                  DataflowMessageHeader messageHeader,
                                                  TInput messageValue,
                                                  ISourceBlock <TInput> source,
                                                  bool consumeToAccept)
        {
            if (!messageHeader.IsValid)
            {
                return(DataflowMessageStatus.Declined);
            }
            if (messageQueue.IsAddingCompleted)
            {
                return(DataflowMessageStatus.DecliningPermanently);
            }

            if (consumeToAccept)
            {
                bool consummed;
                if (!source.ReserveMessage(messageHeader, target))
                {
                    return(DataflowMessageStatus.NotAvailable);
                }
                messageValue = source.ConsumeMessage(messageHeader, target, out consummed);
                if (!consummed)
                {
                    return(DataflowMessageStatus.NotAvailable);
                }
            }

            try {
                messageQueue.Add(messageValue);
            } catch (InvalidOperationException) {
                // This is triggered either if the underlying collection didn't accept the item
                // or if the messageQueue has been marked complete, either way it corresponds to a false
                return(DataflowMessageStatus.DecliningPermanently);
            }
            EnsureProcessing();

            VerifyCompleteness();

            return(DataflowMessageStatus.Accepted);
        }
示例#9
0
        public DataflowMessageStatus OfferMessage(DataflowMessageHeader messageHeader,
                                                  TOutput messageValue,
                                                  ISourceBlock <TOutput> source,
                                                  bool consumeToAccept)
        {
            if (!messageHeader.IsValid)
            {
                return(DataflowMessageStatus.Declined);
            }

            if (consumeToAccept)
            {
                bool consummed;
                if (!source.ReserveMessage(messageHeader, this))
                {
                    return(DataflowMessageStatus.NotAvailable);
                }
                messageValue = source.ConsumeMessage(messageHeader, this, out consummed);
                if (!consummed)
                {
                    return(DataflowMessageStatus.NotAvailable);
                }
            }

            ReceivedValue = messageValue;
            completion.TrySetResult(messageValue);
            Thread.MemoryBarrier();
            waitHandle.Set();

            /* We do the unlinking here so that we don't get called twice
             */
            if (linkBridge != null)
            {
                linkBridge.Dispose();
                linkBridge = null;
            }

            return(DataflowMessageStatus.Accepted);
        }
示例#10
0
        public DataflowMessageStatus OfferMessage(
            DataflowMessageHeader messageHeader, TOutput messageValue,
            ISourceBlock <TOutput> source, bool consumeToAccept)
        {
            if (!messageHeader.IsValid)
            {
                return(DataflowMessageStatus.Declined);
            }

            if (completion.Task.Status != TaskStatus.WaitingForActivation)
            {
                return(DataflowMessageStatus.DecliningPermanently);
            }

            lock (completion) {
                if (completion.Task.Status != TaskStatus.WaitingForActivation)
                {
                    return(DataflowMessageStatus.DecliningPermanently);
                }

                if (consumeToAccept)
                {
                    bool consummed;
                    if (!source.ReserveMessage(messageHeader, this))
                    {
                        return(DataflowMessageStatus.NotAvailable);
                    }
                    messageValue = source.ConsumeMessage(messageHeader, this, out consummed);
                    if (!consummed)
                    {
                        return(DataflowMessageStatus.NotAvailable);
                    }
                }

                completion.TrySetResult(messageValue);
            }
            CompletionSet();
            return(DataflowMessageStatus.Accepted);
        }
示例#11
0
            public DataflowMessageStatus OfferMessage(
                DataflowMessageHeader messageHeader, TSource messageValue,
                ISourceBlock <TSource> source, bool consumeToAccept)
            {
                if (consumeToAccept)
                {
                    if (!source.ReserveMessage(messageHeader, this))
                    {
                        return(DataflowMessageStatus.NotAvailable);
                    }
                    bool consumed;
                    messageValue = source.ConsumeMessage(messageHeader, this, out consumed);
                    if (!consumed)
                    {
                        return(DataflowMessageStatus.NotAvailable);
                    }
                }

                observer.OnNext(messageValue);

                return(DataflowMessageStatus.Accepted);
            }
        internal static async Task TestReserveAndConsume <T>(
            ISourceBlock <T> block, bool reservationIsTargetSpecific = true)
        {
            bool consumed;

            block.ConsumeMessage(new DataflowMessageHeader(-99), new ActionBlock <T>(i => { }), out consumed);
            Assert.False(consumed);

            var tcs            = new TaskCompletionSource <bool>();
            var offeredMessage = default(DataflowMessageHeader);
            var target         = new DelegatePropagator <T, T>
            {
                OfferMessageDelegate = (messageHeader, value, source, consumeToAccept) =>
                {
                    offeredMessage = messageHeader;
                    tcs.TrySetResult(true);
                    return(DataflowMessageStatus.Postponed);
                }
            };

            block.LinkTo(target);
            await tcs.Task;

            Assert.True(block.ReserveMessage(offeredMessage, target));             // reserve the message

            if (reservationIsTargetSpecific)
            {
                block.ConsumeMessage(offeredMessage, new ActionBlock <T>(delegate { }), out consumed);                // different target tries to consume
                Assert.False(consumed);
            }

            block.ConsumeMessage(new DataflowMessageHeader(-99), target, out consumed);             // right target, wrong message
            Assert.False(consumed);

            block.ConsumeMessage(offeredMessage, target, out consumed);             // right target, right message
            Assert.True(consumed);
        }
示例#13
0
 public bool ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock <TOutput> target)
 {
     return(source.ReserveMessage(messageHeader, target));
 }
示例#14
0
 public bool ReserveMessage(DataflowMessageHeader messageHeader,
                            ITargetBlock <T> target)
 {
     return(actualSource.ReserveMessage(messageHeader, predicateBlock));
 }
 public bool ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock <ISegment <IGeofencingSample> > target) => _source.ReserveMessage(messageHeader, target);
示例#16
0
 public bool ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock <TTarget> target) =>
 _output.ReserveMessage(messageHeader, target);
示例#17
0
 public bool ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock <T[]> target)
 {
     return(_batchBlock.ReserveMessage(messageHeader, target));
 }
示例#18
0
 bool ISourceBlock <TSplit> .ReserveMessage(DataflowMessageHeader messageHeader, ITargetBlock <TSplit> target)
 {
     return(orderCapturer.ReserveMessage(messageHeader, target));
 }