about summary refs log tree commit diff
path: root/src/engine/e_jobs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/e_jobs.cpp')
-rw-r--r--src/engine/e_jobs.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/engine/e_jobs.cpp b/src/engine/e_jobs.cpp
new file mode 100644
index 00000000..e87b395a
--- /dev/null
+++ b/src/engine/e_jobs.cpp
@@ -0,0 +1,76 @@
+/* copyright (c) 2007 magnus auvinen, see licence.txt for more info */
+#include <base/system.h>
+#include "e_jobs.h"
+
+void worker_thread(void *user)
+{
+	JOBPOOL *pool = (JOBPOOL *)user;
+	
+	while(1)
+	{
+		JOB *job = 0;
+		
+		/* fetch job from queue */
+		lock_wait(pool->lock);
+		if(pool->first_job)
+		{
+			job = pool->first_job;
+			pool->first_job = pool->first_job->next;
+			if(pool->first_job)
+				pool->first_job->prev = 0;
+			else
+				pool->last_job = 0;
+		}
+		lock_release(pool->lock);
+		
+		/* do the job if we have one */
+		if(job)
+		{
+			job->status = JOBSTATUS_RUNNING;
+			job->result = job->func(job->func_data);
+			job->status = JOBSTATUS_DONE;
+		}
+		else
+			thread_sleep(10);
+	}
+	
+}
+
+int jobs_initpool(JOBPOOL *pool, int num_threads)
+{
+	int i;
+	
+	/* empty the pool */
+	mem_zero(pool, sizeof(JOBPOOL));
+	pool->lock = lock_create();
+	
+	/* start threads */
+	for(i = 0; i < num_threads; i++)
+		thread_create(worker_thread, pool);
+	return 0;
+}
+
+int jobs_add(JOBPOOL *pool, JOB *job, JOBFUNC func, void *data)
+{
+	mem_zero(job, sizeof(JOB));
+	job->func = func;
+	job->func_data = data;
+	
+	lock_wait(pool->lock);
+	
+	/* add job to queue */
+	job->prev = pool->last_job;
+	if(pool->last_job)
+		pool->last_job->next = job;
+	pool->last_job = job;
+	if(!pool->first_job)
+		pool->first_job = job;
+	
+	lock_release(pool->lock);
+	return 0;
+}
+
+int jobs_status(JOB *job)
+{
+	return job->status;
+}