-
Notifications
You must be signed in to change notification settings - Fork 4
/
wq.h
76 lines (55 loc) · 2.24 KB
/
wq.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
73
74
75
76
/*
eventfs: a self-cleaning filesystem for event queues.
Copyright (C) 2015 Jude Nelson
This program is dual-licensed: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License version 3 or later as
published by the Free Software Foundation. For the terms of this
license, see LICENSE.LGPLv3+ or <http://www.gnu.org/licenses/>.
You are free to use this program under the terms of the GNU Lesser General
Public License, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU Lesser General Public License for more details.
Alternatively, you are free to use this program under the terms of the
Internet Software Consortium License, but WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
For the terms of this license, see LICENSE.ISC or
<http://www.isc.org/downloads/software-support-policy/isc-license/>.
*/
#ifndef _EVENTFS_WQ_H_
#define _EVENTFS_WQ_H_
#include "os.h"
#include "util.h"
struct eventfs_wreq;
// eventfs workqueue callback type
typedef int (*eventfs_wq_func_t)( struct eventfs_wreq* wreq, void* cls );
// eventfs workqueue request
struct eventfs_wreq {
// callback to do work
eventfs_wq_func_t work;
// user-supplied arguments
void* work_data;
struct eventfs_wreq* next; // pointer to next work element
};
// eventfs workqueue
struct eventfs_wq {
// worker thread
pthread_t thread;
// is the thread running?
volatile bool running;
// things to do
struct eventfs_wreq* work;
struct eventfs_wreq* tail;
// lock governing access to work
pthread_mutex_t work_lock;
// semaphore to signal the availability of work
sem_t work_sem;
};
struct eventfs_wq* eventfs_wq_new();
int eventfs_wq_init( struct eventfs_wq* wq );
int eventfs_wq_start( struct eventfs_wq* wq );
int eventfs_wq_stop( struct eventfs_wq* wq );
int eventfs_wq_free( struct eventfs_wq* wq );
int eventfs_wreq_init( struct eventfs_wreq* wreq, eventfs_wq_func_t work, void* work_data );
int eventfs_wreq_free( struct eventfs_wreq* wreq );
int eventfs_wq_add( struct eventfs_wq* wq, struct eventfs_wreq* wreq );
#endif