-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdispatch-c++.h
91 lines (63 loc) · 2.08 KB
/
dispatch-c++.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <dispatch/dispatch.h>
#include <functional>
#include <string>
namespace dispatch {
void dispatch_after(dispatch_time_t when, dispatch_queue_t queue, const std::function<void (void)> &func);
void dispatch_apply(size_t iterations, dispatch_queue_t queue, const std::function<void (size_t)> &func);
void dispatch_async(dispatch_queue_t queue, const std::function<void (void)> &func);
void dispatch_sync(dispatch_queue_t queue, const std::function<void (void)> &func);
void dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, const std::function<void (void)> &func);
void dispatch_group_notify(dispatch_group_t group, dispatch_queue_t queue, const std::function<void (void)> &func);
void dispatch_once(dispatch_once_t * predicate, const std::function<void (void)> &func);
class queue {
friend class group;
public:
enum class attr {
SERIAL, CONCURRENT,
};
queue();
queue(const std::string &label, const attr attr);
queue(const queue &q);
queue(queue &&q);
virtual ~queue();
std::string label();
enum class priority {
HIGH, DEFAULT, LOW, BACKGROUND,
};
static queue globalQueue(const priority priority); // assert flags == 0 now
static queue mainQueue();
void apply(const size_t iterations, const std::function<void (size_t)> &func);
void async(const std::function<void (void)> &func);
void sync(const std::function<void (void)> &func);
void suspend();
void resume();
private:
dispatch_queue_t priQueue;
};
class group {
public:
group();
group(const group &grp);
group(group &&grp);
virtual ~group();
void enter();
void leave();
long wait(dispatch_time_t timeout);
void notify(queue &q, const std::function<void (void)> &func);
void async(queue &q, const std::function<void (void)> &func);
private:
dispatch_group_t priGroup;
};
class semaphore {
public:
semaphore();
semaphore(long count);
semaphore(const semaphore &sema);
semaphore(semaphore &&sema);
virtual ~semaphore();
long signal();
long wait(dispatch_time_t timeout);
private:
dispatch_semaphore_t priSemaphore;
};
}