Async-Trampoline

 view release on metacpan or  search on metacpan

lib/Async/Trampoline.xs++  view on Meta::CPAN

#define ASYNC_TYPE_IS_CANCEL            ASYNC_TYPE_GET(IS_CANCEL)
#define ASYNC_TYPE_IS_ERROR             ASYNC_TYPE_GET(IS_ERROR)
#define ASYNC_TYPE_IS_VALUE             ASYNC_TYPE_GET(IS_VALUE)

MODULE = Async::Trampoline PACKAGE = Async::Trampoline

void
Async::run_until_completion()
    INIT:
        CXX_TRY
    PPCODE:
    {
        Async_run_until_completion(THIS);

        Async& result = THIS->ptr_follow();

        if (!result.has_category(Async_Type::CATEGORY_COMPLETE))
        {
            croak(  "run_until_completion() did not complete " ASYNC_FORMAT,
                    ASYNC_FORMAT_ARGS(&result));
        }

lib/Async/Trampoline.xs++  view on Meta::CPAN

        else if (result.has_type(Async_Type::IS_ERROR))
        {
            croak_sv((SV*) result.as_error.data);
        }
        else if (result.has_type(Async_Type::IS_VALUE))
        {
            ASYNC_LOG_DEBUG("returning to Perl: " ASYNC_FORMAT "\n",
                    ASYNC_FORMAT_ARGS(&result));

            DestructibleTuple& values = result.as_value;
            XSprePUSH;  // to fix weird XS+PPCODE argument handling
            EXTEND(SP, static_cast<ssize_t>(values.size));
            for (auto value : values)
            {
                ASYNC_LOG_DEBUG("  - " DESTRUCTIBLE_FORMAT "\n",
                        DESTRUCTIBLE_FORMAT_ARGS_BORROWED(values.vtable, value));
                PUSHs(sv_mortalcopy((SV*) value));
            }

            ASYNC_LOG_DEBUG("result end\n");



( run in 1.600 second using v1.01-cache-2.11-cpan-71847e10f99 )