… | |
… | |
1719 | PL_runops = RUNOPS_DEFAULT; |
1719 | PL_runops = RUNOPS_DEFAULT; |
1720 | else |
1720 | else |
1721 | coro->slot->runops = RUNOPS_DEFAULT; |
1721 | coro->slot->runops = RUNOPS_DEFAULT; |
1722 | } |
1722 | } |
1723 | } |
1723 | } |
1724 | |
|
|
1725 | #if 0 |
|
|
1726 | static int |
|
|
1727 | coro_gensub_free (pTHX_ SV *sv, MAGIC *mg) |
|
|
1728 | { |
|
|
1729 | AV *padlist; |
|
|
1730 | AV *av = (AV *)mg->mg_obj; |
|
|
1731 | |
|
|
1732 | abort (); |
|
|
1733 | |
|
|
1734 | return 0; |
|
|
1735 | } |
|
|
1736 | |
|
|
1737 | static MGVTBL coro_gensub_vtbl = { |
|
|
1738 | 0, 0, 0, 0, |
|
|
1739 | coro_gensub_free |
|
|
1740 | }; |
|
|
1741 | #endif |
|
|
1742 | |
1724 | |
1743 | /*****************************************************************************/ |
1725 | /*****************************************************************************/ |
1744 | /* PerlIO::cede */ |
1726 | /* PerlIO::cede */ |
1745 | |
1727 | |
1746 | typedef struct |
1728 | typedef struct |
… | |
… | |
2064 | |
2046 | |
2065 | frame->check = slf_check_semaphore_down; |
2047 | frame->check = slf_check_semaphore_down; |
2066 | |
2048 | |
2067 | } |
2049 | } |
2068 | |
2050 | |
|
|
2051 | /*****************************************************************************/ |
|
|
2052 | |
|
|
2053 | #define GENSUB_ARG CvXSUBANY (cv).any_ptr |
|
|
2054 | |
|
|
2055 | /* create a closure from XS, returns a code reference */ |
|
|
2056 | /* the arg can be accessed via GENSUB_ARG from the callback */ |
|
|
2057 | /* the callback must use dXSARGS/XSRETURN */ |
|
|
2058 | static SV * |
|
|
2059 | gensub (pTHX_ void (*xsub)(pTHX_ CV *), void *arg) |
|
|
2060 | { |
|
|
2061 | CV *cv = (CV *)NEWSV (0, 0); |
|
|
2062 | |
|
|
2063 | sv_upgrade ((SV *)cv, SVt_PVCV); |
|
|
2064 | |
|
|
2065 | CvANON_on (cv); |
|
|
2066 | CvISXSUB_on (cv); |
|
|
2067 | CvXSUB (cv) = xsub; |
|
|
2068 | GENSUB_ARG = arg; |
|
|
2069 | |
|
|
2070 | return newRV_noinc ((SV *)cv); |
|
|
2071 | } |
|
|
2072 | |
|
|
2073 | /*****************************************************************************/ |
|
|
2074 | |
2069 | MODULE = Coro::State PACKAGE = Coro::State PREFIX = api_ |
2075 | MODULE = Coro::State PACKAGE = Coro::State PREFIX = api_ |
2070 | |
2076 | |
2071 | PROTOTYPES: DISABLE |
2077 | PROTOTYPES: DISABLE |
2072 | |
2078 | |
2073 | BOOT: |
2079 | BOOT: |
… | |
… | |
2536 | api_trace (aTHX_ coro_current, 0); |
2542 | api_trace (aTHX_ coro_current, 0); |
2537 | |
2543 | |
2538 | av_push (av_async_pool, newSVsv (coro_current)); |
2544 | av_push (av_async_pool, newSVsv (coro_current)); |
2539 | } |
2545 | } |
2540 | |
2546 | |
2541 | #if 0 |
|
|
2542 | |
|
|
2543 | void |
|
|
2544 | _generator_call (...) |
|
|
2545 | PROTOTYPE: @ |
|
|
2546 | PPCODE: |
|
|
2547 | fprintf (stderr, "call %p\n", CvXSUBANY(cv).any_ptr); |
|
|
2548 | xxxx |
|
|
2549 | abort (); |
|
|
2550 | |
|
|
2551 | SV * |
|
|
2552 | gensub (SV *sub, ...) |
|
|
2553 | PROTOTYPE: &;@ |
|
|
2554 | CODE: |
|
|
2555 | { |
|
|
2556 | struct coro *coro; |
|
|
2557 | MAGIC *mg; |
|
|
2558 | CV *xcv; |
|
|
2559 | CV *ncv = (CV *)newSV_type (SVt_PVCV); |
|
|
2560 | int i; |
|
|
2561 | |
|
|
2562 | CvGV (ncv) = CvGV (cv); |
|
|
2563 | CvFILE (ncv) = CvFILE (cv); |
|
|
2564 | |
|
|
2565 | Newz (0, coro, 1, struct coro); |
|
|
2566 | coro->args = newAV (); |
|
|
2567 | coro->flags = CF_NEW; |
|
|
2568 | |
|
|
2569 | av_extend (coro->args, items - 1); |
|
|
2570 | for (i = 1; i < items; i++) |
|
|
2571 | av_push (coro->args, newSVsv (ST (i))); |
|
|
2572 | |
|
|
2573 | CvISXSUB_on (ncv); |
|
|
2574 | CvXSUBANY (ncv).any_ptr = (void *)coro; |
|
|
2575 | |
|
|
2576 | xcv = GvCV (gv_fetchpv ("Coro::_generator_call", 0, SVt_PVCV)); |
|
|
2577 | |
|
|
2578 | CvXSUB (ncv) = CvXSUB (xcv); |
|
|
2579 | CvANON_on (ncv); |
|
|
2580 | |
|
|
2581 | mg = sv_magicext ((SV *)ncv, 0, CORO_MAGIC_type_state, &coro_gensub_vtbl, (char *)coro, 0); |
|
|
2582 | RETVAL = newRV_noinc ((SV *)ncv); |
|
|
2583 | } |
|
|
2584 | OUTPUT: |
|
|
2585 | RETVAL |
|
|
2586 | |
|
|
2587 | #endif |
|
|
2588 | |
|
|
2589 | |
2547 | |
2590 | MODULE = Coro::State PACKAGE = Coro::AIO |
2548 | MODULE = Coro::State PACKAGE = Coro::AIO |
2591 | |
2549 | |
2592 | void |
2550 | void |
2593 | _get_state (SV *self) |
2551 | _get_state (SV *self) |