File Coverage

c/hook.c
Criterion Covered Total %
statement 32 44 72.7
branch 12 20 60.0
condition n/a
subroutine n/a
pod n/a
total 44 64 68.7


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