line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
static pe_ring Prepare, Check, AsyncCheck, Callback; |
2
|
|
|
|
|
|
|
|
3
|
24
|
|
|
|
|
|
static void boot_hook() |
4
|
|
|
|
|
|
|
{ |
5
|
24
|
|
|
|
|
|
PE_RING_INIT(&Prepare, 0); |
6
|
24
|
|
|
|
|
|
PE_RING_INIT(&Check, 0); |
7
|
24
|
|
|
|
|
|
PE_RING_INIT(&AsyncCheck, 0); |
8
|
24
|
|
|
|
|
|
PE_RING_INIT(&Callback, 0); |
9
|
24
|
|
|
|
|
|
} |
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
static pe_qcallback * |
12
|
4
|
|
|
|
|
|
pe_add_hook(char *which, int is_perl, void *cb, void *ext_data) |
13
|
|
|
|
|
|
|
{ |
14
|
|
|
|
|
|
|
pe_qcallback *qcb; |
15
|
4
|
|
|
|
|
|
EvNew(2, qcb, 1, pe_qcallback); |
16
|
4
|
|
|
|
|
|
PE_RING_INIT(&qcb->ring, qcb); |
17
|
4
|
|
|
|
|
|
qcb->is_perl = is_perl; |
18
|
4
|
50
|
|
|
|
|
if (is_perl) { |
19
|
4
|
|
|
|
|
|
qcb->callback = SvREFCNT_inc((SV*)cb); |
20
|
4
|
|
|
|
|
|
qcb->ext_data = 0; |
21
|
|
|
|
|
|
|
} |
22
|
|
|
|
|
|
|
else { |
23
|
0
|
|
|
|
|
|
qcb->callback = cb; |
24
|
0
|
|
|
|
|
|
qcb->ext_data = ext_data; |
25
|
|
|
|
|
|
|
} |
26
|
4
|
100
|
|
|
|
|
if (strEQ(which, "prepare")) |
27
|
1
|
|
|
|
|
|
PE_RING_UNSHIFT(&qcb->ring, &Prepare); |
28
|
3
|
100
|
|
|
|
|
else if (strEQ(which, "check")) |
29
|
1
|
|
|
|
|
|
PE_RING_UNSHIFT(&qcb->ring, &Check); |
30
|
2
|
100
|
|
|
|
|
else if (strEQ(which, "asynccheck")) |
31
|
1
|
|
|
|
|
|
PE_RING_UNSHIFT(&qcb->ring, &AsyncCheck); |
32
|
1
|
50
|
|
|
|
|
else if (strEQ(which, "callback")) |
33
|
1
|
|
|
|
|
|
PE_RING_UNSHIFT(&qcb->ring, &Callback); |
34
|
|
|
|
|
|
|
else |
35
|
0
|
|
|
|
|
|
croak("Unknown hook '%s' in pe_add_hook", which); |
36
|
4
|
|
|
|
|
|
return qcb; |
37
|
|
|
|
|
|
|
} |
38
|
|
|
|
|
|
|
|
39
|
0
|
|
|
|
|
|
static pe_qcallback *capi_add_hook(char *which, void *cb, void *ext_data) |
40
|
0
|
|
|
|
|
|
{ return pe_add_hook(which, 0, cb, ext_data); } |
41
|
|
|
|
|
|
|
|
42
|
0
|
|
|
|
|
|
static void pe_cancel_hook(pe_qcallback *qcb) |
43
|
|
|
|
|
|
|
{ |
44
|
0
|
0
|
|
|
|
|
if (qcb->is_perl) |
45
|
0
|
|
|
|
|
|
SvREFCNT_dec((SV*)qcb->callback); |
46
|
0
|
0
|
|
|
|
|
PE_RING_DETACH(&qcb->ring); |
47
|
0
|
|
|
|
|
|
EvFree(2, qcb); |
48
|
0
|
|
|
|
|
|
} |
49
|
|
|
|
|
|
|
|
50
|
3
|
|
|
|
|
|
static void pe_map_check(pe_ring *List) |
51
|
|
|
|
|
|
|
{ |
52
|
3
|
|
|
|
|
|
pe_qcallback *qcb = (pe_qcallback*) List->prev->self; |
53
|
6
|
100
|
|
|
|
|
while (qcb) { |
54
|
3
|
50
|
|
|
|
|
if (qcb->is_perl) { |
55
|
3
|
|
|
|
|
|
dSP; |
56
|
3
|
50
|
|
|
|
|
PUSHMARK(SP); |
57
|
3
|
|
|
|
|
|
PUTBACK; |
58
|
3
|
|
|
|
|
|
perl_call_sv((SV*)qcb->callback, G_DISCARD); |
59
|
|
|
|
|
|
|
} |
60
|
|
|
|
|
|
|
else { /* !is_perl */ |
61
|
0
|
|
|
|
|
|
(* (void(*)(void*)) qcb->callback)(qcb->ext_data); |
62
|
|
|
|
|
|
|
} |
63
|
3
|
|
|
|
|
|
qcb = (pe_qcallback*) qcb->ring.prev->self; |
64
|
|
|
|
|
|
|
} |
65
|
3
|
|
|
|
|
|
} |
66
|
|
|
|
|
|
|
|