Future-XS
view release on metacpan or search on metacpan
src/future.c view on Meta::CPAN
568569570571572573574575576577578579580581582583584585586587
if
(future_is_ready(f2)) {
if
(!future_is_cancelled(f2))
future_on_ready(f2, fseq);
else
if
(flags & CB_CANCEL)
future_cancel(fseq);
}
else
{
struct FutureXS
*f2self
= get_future(f2);
struct FutureXSCallback cb2 = {
.flags = CB_DONE|CB_FAIL|CB_IS_FUTURE,
.code = sv_rvweaken(newSVsv(fseq)),
};
push_callback(f2self,
&cb2
);
}
assert(SvREFCNT(f2) == 1);
SvREFCNT_dec(f2);
}
else
{
SV
*code
= CB_NONSEQ_CODE(cb);
src/future.c view on Meta::CPAN
714715716717718719720721722723724725726727728729730731732733734
SV
*fseq
= future_new_proto(f1);
if
(cb->flags & CB_SEQ_CANCEL)
future_on_cancel(fseq, f1);
cb->flags |= CB_DONE|CB_FAIL;
if
(cb->seq.thencode)
cb->seq.thencode = wrap_cb(f1,
"sequence"
, sv_2mortal(cb->seq.thencode));
if
(cb->seq.elsecode)
cb->seq.elsecode = wrap_cb(f1,
"sequence"
, sv_2mortal(cb->seq.elsecode));
cb->seq.f = sv_rvweaken(newSVsv(fseq));
push_callback(self, cb);
return
fseq;
}
// TODO: move to a hax/ file
#define CvNAME_FILE_LINE(cv) S_CvNAME_FILE_LINE(aTHX_ cv)
static SV
*S_CvNAME_FILE_LINE
(pTHX_ CV
*cv
)
{
src/future.c view on Meta::CPAN
895896897898899900901902903904905906907908909910911912913914915916
if
(!self->on_cancel)
self->on_cancel = newAV();
SV
*rv
= newSVsv((SV *)code);
av_push(self->on_cancel, rv);
if
(is_future) {
struct FutureXSRevocation
*rev
;
Newx(rev, 1, struct FutureXSRevocation);
rev->precedent_f = sv_rvweaken(newSVsv(f));
rev->toclear_sv_at = sv_rvweaken(newRV_inc(rv));
struct FutureXS
*codeself
= get_future(code);
if
(!codeself->revoke_when_ready)
codeself->revoke_when_ready = newAV();
av_push(codeself->revoke_when_ready, (SV *)rev);
}
}
void Future_on_ready(pTHX_ SV
*f
, SV
*code
)
src/future.c view on Meta::CPAN
13361337133813391340134113421343134413451346134713481349135013511352135313541355if
(!self->pending_subs) {
self->result = newAV_svn_dup(subs, n);
mark_ready(self, f,
"wait_all"
);
return
f;
}
CV
*sub_on_ready
= newXS(NULL, sub_on_ready_waitall, __FILE__);
cv_set_anysv_refcounted(sub_on_ready, newSVsv(f));
sv_rvweaken(CvXSUBANY_sv(sub_on_ready));
GV
*gv
= gv_fetchpvs(
"Future::XS::(wait_all callback)"
, GV_ADDMULTI, SVt_PVCV);
CvGV_set(sub_on_ready, gv);
CvANON_off(sub_on_ready);
for
(Size_t i = 0; i < n; i++) {
if
(!future_is_ready(subs[i]))
future_on_ready(subs[i], sv_2mortal(newRV_inc((SV *)sub_on_ready)));
}
src/future.c view on Meta::CPAN
142614271428142914301431143214331434143514361437143814391440144114421443144414451446
mark_ready(self, f,
"wait_any"
);
return
f;
}
self->pending_subs = 0;
CV
*sub_on_ready
= newXS(NULL, sub_on_ready_waitany, __FILE__);
cv_set_anysv_refcounted(sub_on_ready, newSVsv(f));
sv_rvweaken(CvXSUBANY_sv(sub_on_ready));
GV
*gv
= gv_fetchpvs(
"Future::XS::(wait_any callback)"
, GV_ADDMULTI, SVt_PVCV);
CvGV_set(sub_on_ready, gv);
CvANON_off(sub_on_ready);
for
(Size_t i = 0; i < n; i++) {
if
(future_is_cancelled(subs[i]))
continue
;
future_on_ready(subs[i], sv_2mortal(newRV_inc((SV *)sub_on_ready)));
src/future.c view on Meta::CPAN
153215331534153515361537153815391540154115421543154415451546154715481549155015511552
copy_result(self, immediate_fail);
cancel_pending_subs(self);
mark_ready(self, f,
"needs_all"
);
return
f;
}
self->pending_subs = 0;
CV
*sub_on_ready
= newXS(NULL, sub_on_ready_needsall, __FILE__);
cv_set_anysv_refcounted(sub_on_ready, newSVsv(f));
sv_rvweaken(CvXSUBANY_sv(sub_on_ready));
GV
*gv
= gv_fetchpvs(
"Future::XS::(needs_all callback)"
, GV_ADDMULTI, SVt_PVCV);
CvGV_set(sub_on_ready, gv);
CvANON_off(sub_on_ready);
for
(Size_t i = 0; i < n; i++) {
if
(future_is_ready(subs[i]))
continue
;
future_on_ready(subs[i], sv_2mortal(newRV_inc((SV *)sub_on_ready)));
src/future.c view on Meta::CPAN
163116321633163416351636163716381639164016411642164316441645164616471648164916501651
copy_result(self, immediate_done);
cancel_pending_subs(self);
mark_ready(self, f,
"needs_any"
);
return
f;
}
self->pending_subs = 0;
CV
*sub_on_ready
= newXS(NULL, sub_on_ready_needsany, __FILE__);
cv_set_anysv_refcounted(sub_on_ready, newSVsv(f));
sv_rvweaken(CvXSUBANY_sv(sub_on_ready));
GV
*gv
= gv_fetchpvs(
"Future::XS::(needs_any callback)"
, GV_ADDMULTI, SVt_PVCV);
CvGV_set(sub_on_ready, gv);
CvANON_off(sub_on_ready);
for
(Size_t i = 0; i < n; i++) {
if
(future_is_ready(subs[i]))
continue
;
future_on_ready(subs[i], sv_2mortal(newRV_inc((SV *)sub_on_ready)));
( run in 0.331 second using v1.01-cache-2.11-cpan-fd5d4e115d8 )