예제 #1
0
        public bool Dequeue(out T t)
        {
            t = default(T);

            lock (_lock)
            {
                while (!_token.IsCancellationRequested && RealTimeQueue <T> .IsEmpty(_queue))
                {
                    Monitor.Wait(_lock);
                }

                // We can exit, once the queue is empty.
                if (RealTimeQueue <T> .IsEmpty(_queue))
                {
                    return(false);
                }

                _count--;
                t = RealTimeQueue <T> .Head(_queue);

                _queue = RealTimeQueue <T> .Tail(_queue);

                Monitor.PulseAll(_lock);
            }

            return(true);
        }
        public void PerfTest()
        {
            var heap = RealTimeQueue <int> .Empty;

            for (var i = 0; i < Size; i++)
            {
                heap = RealTimeQueue <int> .Snoc(heap, i);
            }

            Console.WriteLine(DumpQueue(heap, true));

            var count = 0;

            while (!RealTimeQueue <int> .IsEmpty(heap))
            {
                var next = RealTimeQueue <int> .Head(heap);

                Assert.AreEqual(count, next);
                heap = RealTimeQueue <int> .Tail(heap);

                count++;
            }

            Assert.AreEqual(Size, count);
        }
예제 #3
0
        public void Simple()
        {
            const int N      = 100;
            var       queues = new RealTimeQueue <int> [N][];

            for (int i = 0; i < queues.Length; i++)
            {
                queues[0] = new RealTimeQueue <int> [N];
            }
            queues[0][0] = RealTimeQueue <int> .Empty;
            for (int i = 0; i + 1 < N; i++)
            {
                queues[0][i + 1] = queues[0][i].Enqueue(i);
            }
            for (int i = 0; i + 1 < N; i++)
            {
                queues[i + 1] = new RealTimeQueue <int> [N];
                for (int j = i + 1; j < N; j++)
                {
                    queues[i + 1][j] = queues[i][j].Dequeue(out var v);
                    v.Should().Be(i);
                }
            }
            for (int i = 0; i + 1 < N; i++)
            {
                queues[i][i].Should().BeSameAs(RealTimeQueue <int> .Empty);
                for (int j = i + 1; j < N; j++)
                {
                    queues[i][j].Should().Equal(Enumerable.Range(i, j - i));
                }
            }
        }
        public void TailTest()
        {
            const string data  = "One Two Three One Three";
            var          queue = data.Split().Aggregate(RealTimeQueue <string> .Empty, RealTimeQueue <string> .Snoc);
            var          tail  = RealTimeQueue <string> .Tail(queue);

            Assert.AreEqual("[{Two, Three}, [Three, One], {}]", DumpQueue(tail, true));
        }
        public void HeadTest()
        {
            const string data  = "One Two Three One Three";
            var          queue = data.Split().Aggregate(RealTimeQueue <string> .Empty, RealTimeQueue <string> .Snoc);
            var          head  = RealTimeQueue <string> .Head(queue);

            Assert.AreEqual("One", head);
        }
        public void EmptyTest()
        {
            var queue = RealTimeQueue <string> .Empty;

            Assert.IsTrue(RealTimeQueue <string> .IsEmpty(queue));

            queue = RealTimeQueue <string> .Snoc(queue, "Item");

            Assert.IsFalse(RealTimeQueue <string> .IsEmpty(queue));

            queue = RealTimeQueue <string> .Tail(queue);

            Assert.IsTrue(RealTimeQueue <string> .IsEmpty(queue));
        }
        public void PushPopTest()
        {
            const string data  = "One Two Three One Three";
            var          queue = data.Split().Aggregate(RealTimeQueue <string> .Empty, RealTimeQueue <string> .Snoc);

            foreach (var expected in data.Split())
            {
                var head = RealTimeQueue <string> .Head(queue);

                Assert.AreEqual(expected, head);
                queue = RealTimeQueue <string> .Tail(queue);
            }

            Assert.IsTrue(RealTimeQueue <string> .IsEmpty(queue));
        }
        public void SnocTest()
        {
            var queue = RealTimeQueue <string> .Empty;

            queue = RealTimeQueue <string> .Snoc(queue, "One");

            Assert.AreEqual("[{$}, null, {$}]", DumpQueue(queue, false));

            queue = RealTimeQueue <string> .Snoc(queue, "Two");

            Assert.AreEqual("[{One}, [Two], {}]", DumpQueue(queue, false));

            queue = RealTimeQueue <string> .Snoc(queue, "Three");

            Assert.AreEqual("[{$One, $Two, $Three}, null, {One, Two, Three}]", DumpQueue(queue, true));
        }
        public static string DumpQueue <T>(RealTimeQueue <T> .Queue queue, bool expandUnCreated)
        {
            if (RealTimeQueue <T> .IsEmpty(queue))
            {
                return(string.Empty);
            }

            var result = new StringBuilder();

            result.Append("[{");
            result.Append(StreamTests.DumpStream(queue.F, expandUnCreated));
            result.Append("}, ");
            result.Append(queue.R?.ToReadableString() ?? "null");
            result.Append(", {");
            result.Append(StreamTests.DumpStream(queue.S, expandUnCreated));
            result.Append("}]");
            return(result.ToString());
        }
예제 #10
0
        public override void Solve(ConsoleReader cr, ConsoleWriter cw)
        {
            int q      = cr;
            var queues = new RealTimeQueue <int> [q];

            for (int i = 0; i < q; i++)
            {
                var type = cr.Int();
                var t    = cr.Int();
                var prev = (uint)t < (uint)queues.Length ? queues[t] : RealTimeQueue <int> .Empty;
                if (type == 0)
                {
                    queues[i] = prev.Enqueue(cr.Int());
                }
                else
                {
                    queues[i] = prev.Dequeue(out var v);
                    cw.WriteLine(v);
                }
            }
        }
예제 #11
0
        public bool Enqueue(T t)
        {
            lock (_lock)
            {
                while (!_token.IsCancellationRequested && _count >= _size)
                {
                    Monitor.Wait(_lock);
                }

                if (_token.IsCancellationRequested)
                {
                    return(false);
                }

                _count++;
                _queue = RealTimeQueue <T> .Snoc(_queue, t);

                Monitor.PulseAll(_lock);
            }

            return(true);
        }
예제 #12
0
 public Task Scan()
 {
     Stopped.Value = false;
     return(Task.Factory.StartNew(state =>
     {
         if (!((InternalStop)state).Value)
         {
             BacklogQueue.Scan();
             InProcessQueue.Scan(); // for directly insert data to db
             if (_firstRun)
             {
                 _firstRun = false;
                 RealTimeQueue.Scan();
                 EmailMessage message;
                 while (!((InternalStop)state).Value && RealTimeQueue.Dequeue(out message))
                 {
                     InProcessQueue.Enqueue(message);
                 }
             }
         }
     }, Stopped, TaskCreationOptions.AttachedToParent));
 }
예제 #13
0
        /// <summary>
        /// Creates the workers and work slots to match the number
        /// of available processors.
        /// </summary>
        public WorkerThreads()
        {
#if FORCE_SINGLETHREADED
            var count = 1;
#warning KERNEL FORCED TO SINGLE THREADED MODE!
#else
            var count = Environment.ProcessorCount * 2; // TESTING WITH 4 THREADS PER CORE... TODO: fix the deadlocks instead
#endif

            // create the real time thread
            _realTimeWork   = new RealTimeQueue <IKernelTask>();
            _realTimeThread = new Thread(RealTimeThreadMain);

            // create empty standard work load
            _work = new IKernelTask[count];
            for (var i = 0; i < count; i++)
            {
                _work[i] = null;
            }

            //start up the threads
            _threads = new Thread[count];
            Start();
        }
 public void EmptySnocTest()
 {
     AssertThrows <NullReferenceException>(() => RealTimeQueue <string> .Snoc(null, "Item"));
 }
        public void EmptyTailTest()
        {
            var queue = RealTimeQueue <string> .Empty;

            AssertThrows <ArgumentNullException>(() => RealTimeQueue <string> .Tail(queue));
        }
예제 #16
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Enumerator"/> struct.
 /// </summary>
 /// <param name="queue">The queue to enumerate.</param>
 internal EnumeratorObject(RealTimeQueue <T> queue)
 {
     _originalQueue = queue;
 }