/** * The real thread entry point. It waits for work events to be queued. Once * an event is queued, it executes it and goes back to waiting. */ virtual uint32 Run() override { while (!TimeToDie) { // This will force sending the stats packet from the previous frame. SET_DWORD_STAT( STAT_ThreadPoolDummyCounter, 0 ); // We need to wait for shorter amount of time bool bContinueWaiting = true; while( bContinueWaiting ) { DECLARE_SCOPE_CYCLE_COUNTER( TEXT( "FQueuedThread::Run.WaitForWork" ), STAT_FQueuedThread_Run_WaitForWork, STATGROUP_ThreadPoolAsyncTasks ); // Wait for some work to do bContinueWaiting = !DoWorkEvent->Wait( 10 ); } IQueuedWork* LocalQueuedWork = QueuedWork; QueuedWork = nullptr; FPlatformMisc::MemoryBarrier(); check(LocalQueuedWork || TimeToDie); // well you woke me up, where is the job or termination request? while (LocalQueuedWork) { // Tell the object to do the work LocalQueuedWork->DoThreadedWork(); // Let the object cleanup before we remove our ref to it LocalQueuedWork = OwningThreadPool->ReturnToPoolOrGetNextJob(this); } } return 0; }
/** * The real thread entry point. It waits for work events to be queued. Once * an event is queued, it executes it and goes back to waiting. */ virtual uint32 Run() override { while (!TimeToDie) { // Wait for some work to do DoWorkEvent->Wait(); IQueuedWork* LocalQueuedWork = QueuedWork; QueuedWork = nullptr; FPlatformMisc::MemoryBarrier(); check(LocalQueuedWork || TimeToDie); // well you woke me up, where is the job or termination request? while (LocalQueuedWork) { // Tell the object to do the work LocalQueuedWork->DoThreadedWork(); // Let the object cleanup before we remove our ref to it LocalQueuedWork = OwningThreadPool->ReturnToPoolOrGetNextJob(this); } } return 0; }