bool QueueUnchecked(Job job) { job->m_sheduler = this; m_lock.lock(); m_jobQueue.AddBack(job); m_lock.unlock(); return true; }
// Single job thread void m_JobThread(JobThread* myThread) { while(!myThread->terminate) { if(!m_jobQueue.empty()) { m_lock.lock(); if(!m_jobQueue.empty()) { myThread->idleDuration.Restart(); // Process a job Job peekJob = m_jobQueue.front(); if((peekJob->jobFlags & JobFlags::IO) != JobFlags::IO || (myThread->index != 0)) // Only perform IO on first thread { myThread->activeJob = m_jobQueue.PopFront(); m_lock.unlock(); // Run myThread->activeJob->m_ret = myThread->activeJob->Run(); myThread->activeJob->m_finished = true; // Add to finished queue m_lock.lock(); m_finishedJobs.AddBack(myThread->activeJob); m_lock.unlock(); // Clear the active job myThread->activeJob.Release(); } else { m_lock.unlock(); } } else { // Just do nothing m_lock.unlock(); } } // Various idle levels if(myThread->idleDuration.Minutes() > 1) std::this_thread::sleep_for(std::chrono::milliseconds(1000)); if(myThread->idleDuration.Seconds() > 1) std::this_thread::sleep_for(std::chrono::milliseconds(500)); else std::this_thread::sleep_for(std::chrono::milliseconds(10)); } }