Beispiel #1
0
        public void Scheduler_CheckPriorityExecutionOfLongRunningTasks()
        {
            const int BatchSize = 1;

            using var physicalScheduler = PhysicalScheduler.Create(1);
            using var scheduler         = new LogicalScheduler(physicalScheduler);

            var countdown = new CountdownEvent(2);

            var queue0 = new ConcurrentQueue <int>();
            var queue1 = new ConcurrentQueue <int>();

            bool firstHasCalled = true;

            bool action(IScheduler s, ConcurrentQueue <int> q, int batch, int state)
            {
                if (state == 0)
                {
                    Volatile.Write(ref firstHasCalled, true);
                }
                else
                {
                    Assert.AreEqual(true, Volatile.Read(ref firstHasCalled));
                }

                while (!q.IsEmpty)
                {
                    q.TryDequeue(out int result);
                }

                countdown.Signal();

                return(false);
            }

            //
            // NB: Tasks don't become runnable before items have been enqueued.
            //

            var task0 = new MessageQueueBasedTask <int>(queue0, BatchSize, 0, action);
            var task1 = new MessageQueueBasedTask <int>(queue1, BatchSize, 1, action);

            scheduler.Schedule(task1);
            scheduler.Schedule(task0);

            queue0.Enqueue(0);
            queue1.Enqueue(1);

            scheduler.RecalculatePriority();

            countdown.Wait();
        }
Beispiel #2
0
        [TestCategory("Scheduler_NonDeterministic_Weak")] // May time-out and be inconclusive.
        public void Scheduler_TestSimpleLongRunningTask()
        {
            const int IterationCount = 10;
            const int MessageCount   = 100;
            const int BatchSize      = 10;

            using var scheduler = _root.CreateChildScheduler();

            var queue = new ConcurrentQueue <int>();

            var countdown = new CountdownEvent(IterationCount);

            bool action(IScheduler s, ConcurrentQueue <int> q, int batch, int state)
            {
                countdown.Signal();

                for (int i = 0; i < batch; ++i)
                {
                    q.TryDequeue(out int result);
                }

                return(false);
            }

            var task = new MessageQueueBasedTask <int>(queue, BatchSize, 0, action);

            scheduler.Schedule(task);

            Thread.Sleep(/* no work is expected */ NotExpected);

            //
            // NB: No messages have been enqueued yet, so the task is not runnable, so it
            //     should not get executed, thus leaving the count down event untouched.
            //

            Assert.AreEqual(IterationCount, countdown.CurrentCount);

            for (var i = 0; i < MessageCount; i++)
            {
                queue.Enqueue(i);
            }

            scheduler.RecalculatePriority();

            WaitForSoon(countdown.WaitHandle); // NB: This is non-deterministic.
        }