예제 #1
0
        private SessionTasksQueue GetSessionTasksQueue(IoSession session)
        {
            SessionTasksQueue queue = session.GetAttribute <SessionTasksQueue>(TASKS_QUEUE);

            if (queue == null)
            {
                queue = new SessionTasksQueue();
                SessionTasksQueue oldQueue = (SessionTasksQueue)session.SetAttributeIfAbsent(TASKS_QUEUE, queue);
                if (oldQueue != null)
                {
                    queue = oldQueue;
                }
            }

            return(queue);
        }
예제 #2
0
        /// <inheritdoc/>
        public void Execute(IoEvent ioe)
        {
            IoSession         session           = ioe.Session;
            SessionTasksQueue sessionTasksQueue = GetSessionTasksQueue(session);
            Boolean           exec;

            // propose the new event to the event queue handler. If we
            // use a throttle queue handler, the message may be rejected
            // if the maximum size has been reached.
            Boolean offerEvent = _queueHandler.Accept(this, ioe);

            if (offerEvent)
            {
                lock (sessionTasksQueue.syncRoot)
                {
                    sessionTasksQueue.tasksQueue.Enqueue(ioe);

                    if (sessionTasksQueue.processingCompleted)
                    {
                        sessionTasksQueue.processingCompleted = false;
                        exec = true;
                    }
                    else
                    {
                        exec = false;
                    }

                    if (log.IsDebugEnabled)
                    {
                        Print(sessionTasksQueue.tasksQueue, ioe);
                    }
                }

                if (exec)
                {
                    Execute(() =>
                    {
                        RunTasks(sessionTasksQueue);
                    });
                }

                _queueHandler.Offered(this, ioe);
            }
        }
예제 #3
0
        private void RunTasks(SessionTasksQueue sessionTasksQueue)
        {
            IoEvent ioe;

            while (true)
            {
                lock (sessionTasksQueue.syncRoot)
                {
                    if (!sessionTasksQueue.tasksQueue.TryDequeue(out ioe))
                    {
                        sessionTasksQueue.processingCompleted = true;
                        break;
                    }
                }

                _queueHandler.Polled(this, ioe);
                ioe.Fire();
            }
        }
예제 #4
0
        private void RunTasks(SessionTasksQueue sessionTasksQueue)
        {
            IoEvent ioe;
            while (true)
            {
                lock (sessionTasksQueue.syncRoot)
                {
                    if (!sessionTasksQueue.tasksQueue.TryDequeue(out ioe))
                    {
                        sessionTasksQueue.processingCompleted = true;
                        break;
                    }
                }

                _queueHandler.Polled(this, ioe);
                ioe.Fire();
            }
        }
예제 #5
0
        private SessionTasksQueue GetSessionTasksQueue(IoSession session)
        {
            SessionTasksQueue queue = session.GetAttribute<SessionTasksQueue>(TASKS_QUEUE);

            if (queue == null)
            {
                queue = new SessionTasksQueue();
                SessionTasksQueue oldQueue = (SessionTasksQueue)session.SetAttributeIfAbsent(TASKS_QUEUE, queue);
                if (oldQueue != null)
                    queue = oldQueue;
            }

            return queue;
        }