blob: e87b395a00dbc36d0191dd8e7be394aa6c9f25d2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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;
}
|