Example #1
0
	bool QueueUnchecked(Job job)
	{
		job->m_sheduler = this;

		m_lock.lock();
		m_jobQueue.AddBack(job);
		m_lock.unlock();

		return true;
	}
Example #2
0
	// 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));
		}
	}