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); }
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); }
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); } }