… | |
… | |
533 | } |
533 | } |
534 | |
534 | |
535 | static SV * |
535 | static SV * |
536 | get_cb (SV *cb_sv) |
536 | get_cb (SV *cb_sv) |
537 | { |
537 | { |
538 | HV *st; |
538 | SvGETMAGIC (cb_sv); |
539 | GV *gvp; |
539 | return SvOK (cb_sv) ? s_get_cv_croak (cb_sv) : 0; |
540 | CV *cv; |
|
|
541 | |
|
|
542 | if (!SvOK (cb_sv)) |
|
|
543 | return 0; |
|
|
544 | |
|
|
545 | cv = sv_2cv (cb_sv, &st, &gvp, 0); |
|
|
546 | |
|
|
547 | if (!cv) |
|
|
548 | croak ("IO::AIO callback must be undef or a CODE reference"); |
|
|
549 | |
|
|
550 | return (SV *)cv; |
|
|
551 | } |
540 | } |
552 | |
541 | |
553 | #define dREQ \ |
542 | #define dREQ \ |
554 | SV *cb_cv; \ |
543 | SV *cb_cv; \ |
555 | aio_req req; \ |
544 | aio_req req; \ |
… | |
… | |
1221 | if (GIMME_V != G_VOID) |
1210 | if (GIMME_V != G_VOID) |
1222 | XPUSHs (req->callback ? sv_2mortal (newRV_inc (req->callback)) : &PL_sv_undef); |
1211 | XPUSHs (req->callback ? sv_2mortal (newRV_inc (req->callback)) : &PL_sv_undef); |
1223 | |
1212 | |
1224 | if (items > 1) |
1213 | if (items > 1) |
1225 | { |
1214 | { |
1226 | SV *cb_cv = get_cb (callback); |
1215 | SV *cb_cv =get_cb (callback); |
1227 | |
1216 | |
1228 | SvREFCNT_dec (req->callback); |
1217 | SvREFCNT_dec (req->callback); |
1229 | req->callback = SvREFCNT_inc (cb_cv); |
1218 | req->callback = SvREFCNT_inc (cb_cv); |
1230 | } |
1219 | } |
1231 | } |
1220 | } |