Promise-XS
view release on metacpan or search on metacpan
# In some old thread-multi perls sv_dup_inc() wasnât defined.
#if defined(USE_ITHREADS) && defined(sv_dup_inc)
# ithreads would seem to be a very bad idea in Promise-based code,
# but anyway ..
void
CLONE(...)
PPCODE:
SV* pxs_flush_cr = NULL;
SV* deferral_cr = NULL;
event_system_t event_system;
SV* deferral_arg = NULL;
SV* stop_cr = NULL;
{
dMY_CXT;
/* _promise_to_sv takes ownership of the refs=1 from create_promise */
RETVAL = _promise_to_sv(aTHX_ output);
guard->output = NULL; /* RETVAL's DESTROY owns output now */
}
OUTPUT:
RETVAL
void
then(SV* self_sv, SV* on_resolve = NULL, SV* on_reject = NULL)
PPCODE:
_CROAK_IF_LOOKS_LIKE_INFINITE_RECURSION;
PROMISE_CLASS_TYPE* self = _get_promise_from_sv(aTHX_ self_sv);
xspr_promise_t* next;
if (on_resolve == NULL) on_resolve = &PL_sv_undef;
if (on_reject == NULL) on_reject = &PL_sv_undef;
next = create_next_promise_if_needed(aTHX_ self_sv, &ST(0));
xspr_callback_t* callback = xspr_callback_new_perl(aTHX_ on_resolve, on_reject, next);
xspr_promise_then(aTHX_ self->promise, callback);
XSRETURN(next ? 1 : 0);
void
catch(SV* self_sv, SV* on_reject)
PPCODE:
_CROAK_IF_LOOKS_LIKE_INFINITE_RECURSION;
PROMISE_CLASS_TYPE* self = _get_promise_from_sv(aTHX_ self_sv);
xspr_promise_t* next = create_next_promise_if_needed(aTHX_ self_sv, &ST(0));
xspr_callback_t* callback = xspr_callback_new_perl(aTHX_ &PL_sv_undef, on_reject, next);
xspr_promise_then(aTHX_ self->promise, callback);
XSRETURN(next ? 1 : 0);
void
finally(SV* self_sv, SV* on_finally)
PPCODE:
_CROAK_IF_LOOKS_LIKE_INFINITE_RECURSION;
PROMISE_CLASS_TYPE* self = _get_promise_from_sv(aTHX_ self_sv);
xspr_promise_t* next = create_next_promise_if_needed(aTHX_ self_sv, &ST(0));
xspr_callback_t* callback = xspr_callback_new_finally(aTHX_ on_finally, next);
xspr_promise_then(aTHX_ self->promise, callback);
XSRETURN(next ? 1 : 0);
CODE:
_DO_DEBUG_AWAITABLE();
PROMISE_CLASS_TYPE* self = _get_promise_from_sv(aTHX_ self_sv);
RETVAL = (self->promise->state != XSPR_STATE_PENDING);
OUTPUT:
RETVAL
void
AWAIT_GET(SV *self_sv)
PPCODE:
_DO_DEBUG_AWAITABLE();
DEFERRED_CLASS_TYPE* self = _get_deferred_from_sv(aTHX_ self_sv);
ASSUME(self->promise->state == XSPR_STATE_FINISHED);
SV** results = self->promise->finished.result->results;
int result_count = self->promise->finished.result->count;
if (RESULT_IS_RESOLVED(self->promise->finished.result)) {
int i;
CODE:
_DO_DEBUG_AWAITABLE();
PROMISE_CLASS_TYPE* self = _get_promise_from_sv(aTHX_ self_sv);
self->promise->on_ready_immediate = coderef;
SvREFCNT_inc(coderef);
SvREFCNT_inc(SvRV(coderef));
void
AWAIT_WAIT(SV* self_sv)
PPCODE:
_DO_DEBUG_AWAITABLE();
dMY_CXT;
switch (MY_CXT.event_system) {
case _DEFER_ANYEVENT:
_anyevent_wait_promise(aTHX_ self_sv);
break;
case _DEFER_IOASYNC:
_ioasync_wait_promise(aTHX_ self_sv, MY_CXT.deferral_arg, MY_CXT.stop_cr);
( run in 0.455 second using v1.01-cache-2.11-cpan-5511b514fd6 )