Promise-XS

 view release on metacpan or  search on metacpan

XS.xs  view on Meta::CPAN


# 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;

XS.xs  view on Meta::CPAN


            /* _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);

XS.xs  view on Meta::CPAN

    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;

XS.xs  view on Meta::CPAN

    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.377 second using v1.01-cache-2.11-cpan-5511b514fd6 )