| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | static pe_ring Prepare, Check, AsyncCheck, Callback; | 
| 2 |  |  |  |  |  |  |  | 
| 3 | 25 |  |  |  |  |  | static void boot_hook() | 
| 4 |  |  |  |  |  |  | { | 
| 5 | 25 |  |  |  |  |  | PE_RING_INIT(&Prepare, 0); | 
| 6 | 25 |  |  |  |  |  | PE_RING_INIT(&Check, 0); | 
| 7 | 25 |  |  |  |  |  | PE_RING_INIT(&AsyncCheck, 0); | 
| 8 | 25 |  |  |  |  |  | PE_RING_INIT(&Callback, 0); | 
| 9 | 25 |  |  |  |  |  | } | 
| 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 |  |  |  |  |  |  |  |