diff options
Diffstat (limited to 'src/engine/e_jobs.cpp')
| -rw-r--r-- | src/engine/e_jobs.cpp | 76 |
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; +} |