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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
#include "../pkev.h"
#include "../pkmacros.h"
#include <stdio.h>
struct ev {
pk_ev_mgr_id_T evmgr;
pk_ev_id_T evid;
pk_ev_cb_id_T evcbid;
int handled_count;
};
struct ev ev_one = {0};
struct ev ev_two = {0};
void
handle_ev_one(void *, void *, void *)
{
ev_one.handled_count++;
}
void
handle_ev_two(void *, void *, void *)
{
ev_two.handled_count++;
}
int
thrd_ev_emit_one(void *)
{
pk_ev_emit(ev_one.evmgr, ev_one.evid, NULL);
return 0;
}
int
thrd_ev_emit_two(void *)
{
pk_ev_emit(ev_two.evmgr, ev_two.evid, NULL);
return 0;
}
pk_ev_mgr_id_T
test_setup()
{
memset(&ev_one, 0, sizeof(struct ev));
memset(&ev_two, 0, sizeof(struct ev));
pk_ev_init();
const pk_ev_mgr_id_T evmgr = pk_ev_create_mgr();
if (evmgr >= 64) {
PK_LOGV_ERR("%s: failed to create pk_ev_mgr\n", __FILE__);
exit(1);
}
ev_one.evmgr = evmgr;
ev_two.evmgr = evmgr;
return evmgr;
}
int main(int argc, char *argv[])
{
(void)argc;
(void)argv;
(void)stdout;
int i;
// register, emit, catch
{
const pk_ev_mgr_id_T evmgr = test_setup();
ev_one.evid = pk_ev_register_ev(evmgr, NULL);
ev_two.evid = pk_ev_register_ev(evmgr, NULL);
ev_one.evcbid = pk_ev_register_cb(evmgr, ev_one.evid, handle_ev_one, NULL);
ev_two.evcbid = pk_ev_register_cb(evmgr, ev_two.evid, handle_ev_two, NULL);
pk_ev_emit(evmgr, ev_one.evid, NULL);
pk_ev_emit(evmgr, ev_two.evid, NULL);
PK_LOGV_INF("%s: ev_one: %i, ev_two: %i\n", __FILE__, ev_one.handled_count, ev_two.handled_count);
pk_ev_teardown();
if (ev_one.handled_count != 1 || ev_two.handled_count != 1) exit(1);
}
// register, emit, catch
{
const pk_ev_mgr_id_T evmgr = test_setup();
ev_one.evid = pk_ev_register_ev(evmgr, NULL);
ev_two.evid = pk_ev_register_ev(evmgr, NULL);
ev_one.evcbid = pk_ev_register_cb(evmgr, ev_one.evid, handle_ev_one, NULL);
ev_two.evcbid = pk_ev_register_cb(evmgr, ev_two.evid, handle_ev_two, NULL);
pk_ev_emit(evmgr, ev_one.evid, NULL);
pk_ev_emit(evmgr, ev_two.evid, NULL);
PK_LOGV_INF("%s: ev_one: %i, ev_two: %i\n", __FILE__, ev_one.handled_count, ev_two.handled_count);
pk_ev_unregister_cb(evmgr, ev_one.evid, ev_one.evcbid);
pk_ev_unregister_cb(evmgr, ev_two.evid, ev_two.evcbid);
pk_ev_emit(evmgr, ev_one.evid, NULL);
pk_ev_emit(evmgr, ev_two.evid, NULL);
uint64_t left, right;
left = pk_ev_mstr.mgrs[ev_one.evmgr]->ev[ev_one.evid].left_ev_cbs;
right = pk_ev_mstr.mgrs[ev_one.evmgr]->ev[ev_one.evid].right_ev_cbs;
PK_LOGV_INF("%s: left: %lu, right: %lu\n", __FILE__, left, right);
left = pk_ev_mstr.mgrs[ev_two.evmgr]->ev[ev_two.evid].left_ev_cbs;
right = pk_ev_mstr.mgrs[ev_two.evmgr]->ev[ev_two.evid].right_ev_cbs;
PK_LOGV_INF("%s: left: %lu, right: %lu\n", __FILE__, left, right);
if (pk_ev_mstr.mgrs[ev_one.evmgr]->ev[ev_one.evid].left_ev_cbs != 0) exit (1);
if (pk_ev_mstr.mgrs[ev_one.evmgr]->ev[ev_one.evid].right_ev_cbs != 1) exit (1);
if (pk_ev_mstr.mgrs[ev_two.evmgr]->ev[ev_two.evid].left_ev_cbs != 0) exit (1);
if (pk_ev_mstr.mgrs[ev_two.evmgr]->ev[ev_two.evid].right_ev_cbs != 1) exit (1);
pk_ev_teardown();
if (ev_one.handled_count != 1 || ev_two.handled_count != 1) exit(1);
}
// threaded register, emit, catch
{
thrd_t t1, t2;
const pk_ev_mgr_id_T evmgr = test_setup();
ev_one.evid = pk_ev_register_ev(evmgr, NULL);
ev_two.evid = pk_ev_register_ev(evmgr, NULL);
pk_ev_register_cb(evmgr, ev_one.evid, handle_ev_one, NULL);
pk_ev_register_cb(evmgr, ev_two.evid, handle_ev_two, NULL);
thrd_create(&t1, thrd_ev_emit_one, NULL);
thrd_create(&t2, thrd_ev_emit_two, NULL);
thrd_join(t1, &i);
thrd_join(t2, &i);
PK_LOGV_INF("%s: ev_one: %i, ev_two: %i\n", __FILE__, ev_one.handled_count, ev_two.handled_count);
pk_ev_teardown();
if (ev_one.handled_count != 1 || ev_two.handled_count != 1) exit(1);
}
return 0;
}
|