diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-09-07 21:13:24 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-09-07 21:13:24 +0000 |
| commit | 3b086d616a9090f714c90c7985f10c5dc4bd5733 (patch) | |
| tree | 8137021d446260adfc5eacd753f9e42ab5281e7d /src/engine/e_jobs.c | |
| parent | 6a4e17ea8520e9eb3a88ce15a9e337679d631775 (diff) | |
| download | zcatch-3b086d616a9090f714c90c7985f10c5dc4bd5733.tar.gz zcatch-3b086d616a9090f714c90c7985f10c5dc4bd5733.zip | |
fixed threaded jobs
Diffstat (limited to 'src/engine/e_jobs.c')
| -rw-r--r-- | src/engine/e_jobs.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/engine/e_jobs.c b/src/engine/e_jobs.c new file mode 100644 index 00000000..e87b395a --- /dev/null +++ b/src/engine/e_jobs.c @@ -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; +} |