about summary refs log tree commit diff
path: root/src/engine/shared/jobs.cpp
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2010-05-29 07:25:38 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2010-05-29 07:25:38 +0000
commit72c06a258940696093f255fb1061beb58e1cdd0b (patch)
tree36b9a7712eec2d4f07837eab9c38ef1c5af85319 /src/engine/shared/jobs.cpp
parente56feb597bc743677633432f77513b02907fd169 (diff)
downloadzcatch-72c06a258940696093f255fb1061beb58e1cdd0b.tar.gz
zcatch-72c06a258940696093f255fb1061beb58e1cdd0b.zip
copied refactor to trunk
Diffstat (limited to 'src/engine/shared/jobs.cpp')
-rw-r--r--src/engine/shared/jobs.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/engine/shared/jobs.cpp b/src/engine/shared/jobs.cpp
new file mode 100644
index 00000000..83d7290b
--- /dev/null
+++ b/src/engine/shared/jobs.cpp
@@ -0,0 +1,74 @@
+// copyright (c) 2007 magnus auvinen, see licence.txt for more info
+#include <base/system.h>
+#include "jobs.h"
+
+CJobPool::CJobPool()
+{
+	// empty the pool
+	m_Lock = lock_create();
+	m_pFirstJob = 0;
+	m_pLastJob = 0;
+}
+
+void CJobPool::WorkerThread(void *pUser)
+{
+	CJobPool *pPool = (CJobPool *)pUser;
+	
+	while(1)
+	{
+		CJob *pJob = 0;
+		
+		// fetch job from queue
+		lock_wait(pPool->m_Lock);
+		if(pPool->m_pFirstJob)
+		{
+			pJob = pPool->m_pFirstJob;
+			pPool->m_pFirstJob = pPool->m_pFirstJob->m_pNext;
+			if(pPool->m_pFirstJob)
+				pPool->m_pFirstJob->m_pPrev = 0;
+			else
+				pPool->m_pLastJob = 0;
+		}
+		lock_release(pPool->m_Lock);
+		
+		// do the job if we have one
+		if(pJob)
+		{
+			pJob->m_Status = CJob::STATE_RUNNING;
+			pJob->m_Result = pJob->m_pfnFunc(pJob->m_pFuncData);
+			pJob->m_Status = CJob::STATE_DONE;
+		}
+		else
+			thread_sleep(10);
+	}
+	
+}
+
+int CJobPool::Init(int NumThreads)
+{
+	// start threads
+	for(int i = 0; i < NumThreads; i++)
+		thread_create(WorkerThread, this);
+	return 0;
+}
+
+int CJobPool::Add(CJob *pJob, JOBFUNC pfnFunc, void *pData)
+{
+	mem_zero(pJob, sizeof(CJob));
+	pJob->m_pfnFunc = pfnFunc;
+	pJob->m_pFuncData = pData;
+	
+	lock_wait(m_Lock);
+	
+	// add job to queue
+	pJob->m_pPrev = m_pLastJob;
+	if(m_pLastJob)
+		m_pLastJob->m_pNext = pJob;
+	m_pLastJob = pJob;
+	if(!m_pFirstJob)
+		m_pFirstJob = pJob;
+	
+	lock_release(m_Lock);
+	return 0;
+}
+