private bool PerformGenericWork()
        {
            m_pendingStates   = m_pendingStates.Reset(CurrStateGenericWork);
            m_completedStates = m_completedStates.Reset(CurrStateGenericWork);

            // If there's nothing to do we can skip this state
            if (m_genericWorkItems.Count <= 0)
            {
                OnGenericWorkDone(this);
                m_completedStatesSafe = m_completedStates;
                return(false);
            }

            m_completedStatesSafe = m_completedStates;

            // We have work to do
            SGenericWorkItem workItem = new SGenericWorkItem(this, m_genericWorkItems.Dequeue());

            m_taskRunning = true;
            WorkPoolManager.Add(
                new ThreadPoolItem(
                    chunk.ThreadID,
                    arg =>
            {
                SGenericWorkItem item = (SGenericWorkItem)arg;
                OnGenericWork(ref item);
            },
                    workItem)
                );

            return(true);
        }
        private static void OnGenericWork(ref SGenericWorkItem item)
        {
            ChunkStateManagerClient chunk = item.Chunk;

            item.Action();
            OnGenericWorkDone(chunk);
        }
Esempio n. 3
0
        private bool PerformGenericWork()
        {
            // When we get here we expect all generic tasks to be processed
            Assert.IsTrue(Interlocked.CompareExchange(ref m_genericWorkItemsLeftToProcess, 0, 0) == 0);

            m_pendingTasks = m_pendingTasks.Reset(CurrStateGenericWork);

            // Nothing here for us to do if the chunk was not changed
            if (m_completedTasks.Check(CurrStateGenericWork) && !m_refreshTasks.Check(CurrStateGenericWork))
            {
                m_genericWorkItemsLeftToProcess = 0;
                OnGenericWorkDone(this);
                return(false);
            }

            m_refreshTasks   = m_refreshTasks.Reset(CurrStateGenericWork);
            m_completedTasks = m_completedTasks.Reset(CurrStateGenericWork);

            // If there's nothing to do we can skip this state
            if (m_genericWorkItems.Count <= 0)
            {
                m_genericWorkItemsLeftToProcess = 0;
                OnGenericWorkDone(this);
                return(false);
            }

            m_taskRunning = true;
            m_genericWorkItemsLeftToProcess = m_genericWorkItems.Count;

            for (int i = 0; i < m_genericWorkItems.Count; i++)
            {
                SGenericWorkItem workItem = new SGenericWorkItem(this, m_genericWorkItems[i]);

                WorkPoolManager.Add(
                    new ThreadItem(
                        m_threadID,
                        arg =>
                {
                    SGenericWorkItem item = (SGenericWorkItem)arg;
                    OnGenericWork(ref item);
                },
                        workItem)
                    );
            }
            m_genericWorkItems.Clear();

            return(true);
        }
Esempio n. 4
0
        private static void OnGenericWork(ref SGenericWorkItem item)
        {
            ChunkStateManagerClient chunk = item.Chunk;

            // Perform the action
            item.Action();

            int cnt = Interlocked.Decrement(ref chunk.m_genericWorkItemsLeftToProcess);

            if (cnt <= 0)
            {
                // Something is very wrong if we go below zero
                Assert.IsTrue(cnt == 0);

                // All generic work is done
                OnGenericWorkDone(chunk);
            }
        }