-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcc_jobq.h
72 lines (61 loc) · 2.22 KB
/
cc_jobq.h
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
/*
* Copyright (c) 2010 Jeff Boody
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*/
#ifndef cc_jobq_H
#define cc_jobq_H
#include <pthread.h>
#include "cc_list.h"
#define CC_JOBQ_THREAD_PRIORITY_DEFAULT 0
#define CC_JOBQ_THREAD_PRIORITY_HIGH 1
// called from the jobq thread
typedef void (*cc_jobqRun_fn)(int tid,
void* owner,
void* task);
typedef struct
{
// queue state
int state;
void* owner;
// queues
cc_list_t* queue_pending;
cc_list_t* queue_active;
// callbacks
cc_jobqRun_fn run_fn;
// jobq thread(s)
int thread_count;
int thread_priority;
pthread_t* threads;
int next_tid;
pthread_mutex_t mutex;
pthread_cond_t cond_pending;
pthread_cond_t cond_complete;
} cc_jobq_t;
cc_jobq_t* cc_jobq_new(void* owner, int thread_count,
int thread_priority,
cc_jobqRun_fn run_fn);
void cc_jobq_delete(cc_jobq_t** _self);
void cc_jobq_pause(cc_jobq_t* self);
void cc_jobq_resume(cc_jobq_t* self);
void cc_jobq_finish(cc_jobq_t* self);
int cc_jobq_run(cc_jobq_t* self, void* task);
int cc_jobq_pending(cc_jobq_t* self);
#endif