… | |
… | |
140 | |
140 | |
141 | static GV *irsgv; /* $/ */ |
141 | static GV *irsgv; /* $/ */ |
142 | static GV *stdoutgv; /* *STDOUT */ |
142 | static GV *stdoutgv; /* *STDOUT */ |
143 | static SV *rv_diehook; |
143 | static SV *rv_diehook; |
144 | static SV *rv_warnhook; |
144 | static SV *rv_warnhook; |
145 | static HV *hv_sig; /* %SIG */ |
|
|
146 | |
145 | |
147 | /* async_pool helper stuff */ |
146 | /* async_pool helper stuff */ |
148 | static SV *sv_pool_rss; |
147 | static SV *sv_pool_rss; |
149 | static SV *sv_pool_size; |
148 | static SV *sv_pool_size; |
150 | static SV *sv_async_pool_idle; /* description string */ |
149 | static SV *sv_async_pool_idle; /* description string */ |
… | |
… | |
709 | tmp.sv_u = a->sv_u; a->sv_u = b->sv_u; b->sv_u = tmp.sv_u; |
708 | tmp.sv_u = a->sv_u; a->sv_u = b->sv_u; b->sv_u = tmp.sv_u; |
710 | |
709 | |
711 | /* if SvANY points to the head, we need to adjust the pointers, |
710 | /* if SvANY points to the head, we need to adjust the pointers, |
712 | * as the pointer for a still points to b, and maybe vice versa. |
711 | * as the pointer for a still points to b, and maybe vice versa. |
713 | */ |
712 | */ |
714 | #define svany_in_head(type) \ |
713 | U32 svany_in_head_set = (1 << SVt_NULL) | (1 << SVt_BIND) | (1 << SVt_IV) | (1 << SVt_RV); |
715 | (((1 << SVt_NULL) | (1 << SVt_BIND) | (1 << SVt_IV) | (1 << SVt_RV)) & (1 << (type))) |
714 | #if NVSIZE <= IVSIZE && PERL_VERSION_ATLEAST(5,22,0) |
|
|
715 | svany_in_head_set |= 1 << SVt_NV; |
|
|
716 | #endif |
|
|
717 | |
|
|
718 | #define svany_in_head(type) (svany_in_head_set & (1 << (type))) |
716 | |
719 | |
717 | if (svany_in_head (SvTYPE (a))) |
720 | if (svany_in_head (SvTYPE (a))) |
718 | SvANY (a) = (void *)((PTRV)SvANY (a) - (PTRV)b + (PTRV)a); |
721 | SvANY (a) = (void *)((PTRV)SvANY (a) - (PTRV)b + (PTRV)a); |
719 | |
722 | |
720 | if (svany_in_head (SvTYPE (b))) |
723 | if (svany_in_head (SvTYPE (b))) |
… | |
… | |
2878 | |
2881 | |
2879 | for (i = AvFILLp (av) - 1; i >= 0; i -= 2) |
2882 | for (i = AvFILLp (av) - 1; i >= 0; i -= 2) |
2880 | if (AvARRAY (av)[i] == (SV *)hook) |
2883 | if (AvARRAY (av)[i] == (SV *)hook) |
2881 | { |
2884 | { |
2882 | if (execute) |
2885 | if (execute) |
2883 | hook ((void *)AvARRAY (av)[i + 1]); |
2886 | hook (aTHX_ (void *)AvARRAY (av)[i + 1]); |
2884 | |
2887 | |
2885 | memmove (AvARRAY (av) + i, AvARRAY (av) + i + 2, AvFILLp (av) - i - 1); |
2888 | memmove (AvARRAY (av) + i, AvARRAY (av) + i + 2, AvFILLp (av) - i - 1); |
2886 | av_pop (av); |
2889 | av_pop (av); |
2887 | av_pop (av); |
2890 | av_pop (av); |
2888 | break; |
2891 | break; |
… | |
… | |
2900 | { |
2903 | { |
2901 | struct coro *coro = SvSTATE (coro_sv); |
2904 | struct coro *coro = SvSTATE (coro_sv); |
2902 | |
2905 | |
2903 | if (SvSTATE_current == coro) |
2906 | if (SvSTATE_current == coro) |
2904 | if (enter) |
2907 | if (enter) |
2905 | enter (aTHX enter_arg); |
2908 | enter (aTHX_ enter_arg); |
2906 | |
2909 | |
2907 | enterleave_hook_xs (aTHX_ coro, &coro->on_enter_xs, enter, enter_arg); |
2910 | enterleave_hook_xs (aTHX_ coro, &coro->on_enter_xs, enter, enter_arg); |
2908 | enterleave_hook_xs (aTHX_ coro, &coro->on_leave_xs, leave, leave_arg); |
2911 | enterleave_hook_xs (aTHX_ coro, &coro->on_leave_xs, leave, leave_arg); |
2909 | } |
2912 | } |
2910 | |
2913 | |
… | |
… | |
3600 | |
3603 | |
3601 | orig_sigelem_get = PL_vtbl_sigelem.svt_get; PL_vtbl_sigelem.svt_get = coro_sigelem_get; |
3604 | orig_sigelem_get = PL_vtbl_sigelem.svt_get; PL_vtbl_sigelem.svt_get = coro_sigelem_get; |
3602 | orig_sigelem_set = PL_vtbl_sigelem.svt_set; PL_vtbl_sigelem.svt_set = coro_sigelem_set; |
3605 | orig_sigelem_set = PL_vtbl_sigelem.svt_set; PL_vtbl_sigelem.svt_set = coro_sigelem_set; |
3603 | orig_sigelem_clr = PL_vtbl_sigelem.svt_clear; PL_vtbl_sigelem.svt_clear = coro_sigelem_clr; |
3606 | orig_sigelem_clr = PL_vtbl_sigelem.svt_clear; PL_vtbl_sigelem.svt_clear = coro_sigelem_clr; |
3604 | |
3607 | |
3605 | hv_sig = coro_get_hv (aTHX_ "SIG", TRUE); |
|
|
3606 | rv_diehook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::diehook" , 0, SVt_PVCV)); |
3608 | rv_diehook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::diehook" , 0, SVt_PVCV)); |
3607 | rv_warnhook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::warnhook", 0, SVt_PVCV)); |
3609 | rv_warnhook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::warnhook", 0, SVt_PVCV)); |
3608 | |
3610 | |
3609 | coro_state_stash = gv_stashpv ("Coro::State", TRUE); |
3611 | coro_state_stash = gv_stashpv ("Coro::State", TRUE); |
3610 | |
3612 | |
… | |
… | |
3939 | |
3941 | |
3940 | MODULE = Coro::State PACKAGE = Coro |
3942 | MODULE = Coro::State PACKAGE = Coro |
3941 | |
3943 | |
3942 | BOOT: |
3944 | BOOT: |
3943 | { |
3945 | { |
|
|
3946 | if (SVt_LAST > 32) |
|
|
3947 | croak ("Coro internal error: SVt_LAST > 32, swap_sv might need adjustment"); |
|
|
3948 | |
3944 | sv_pool_rss = coro_get_sv (aTHX_ "Coro::POOL_RSS" , TRUE); |
3949 | sv_pool_rss = coro_get_sv (aTHX_ "Coro::POOL_RSS" , TRUE); |
3945 | sv_pool_size = coro_get_sv (aTHX_ "Coro::POOL_SIZE" , TRUE); |
3950 | sv_pool_size = coro_get_sv (aTHX_ "Coro::POOL_SIZE" , TRUE); |
3946 | cv_coro_run = get_cv ( "Coro::_coro_run" , GV_ADD); |
3951 | cv_coro_run = get_cv ( "Coro::_coro_run" , GV_ADD); |
3947 | coro_current = coro_get_sv (aTHX_ "Coro::current" , FALSE); SvREADONLY_on (coro_current); |
3952 | coro_current = coro_get_sv (aTHX_ "Coro::current" , FALSE); SvREADONLY_on (coro_current); |
3948 | av_async_pool = coro_get_av (aTHX_ "Coro::async_pool", TRUE); |
3953 | av_async_pool = coro_get_av (aTHX_ "Coro::async_pool", TRUE); |
… | |
… | |
4252 | RETVAL = newSVsv (AvARRAY ((AV *)SvRV (self))[0]); |
4257 | RETVAL = newSVsv (AvARRAY ((AV *)SvRV (self))[0]); |
4253 | OUTPUT: |
4258 | OUTPUT: |
4254 | RETVAL |
4259 | RETVAL |
4255 | |
4260 | |
4256 | void |
4261 | void |
4257 | up (SV *self, int adjust = 1) |
4262 | up (SV *self) |
4258 | ALIAS: |
|
|
4259 | adjust = 1 |
|
|
4260 | CODE: |
4263 | CODE: |
|
|
4264 | coro_semaphore_adjust (aTHX_ (AV *)SvRV (self), 1); |
|
|
4265 | |
|
|
4266 | void |
|
|
4267 | adjust (SV *self, int adjust) |
|
|
4268 | CODE: |
4261 | coro_semaphore_adjust (aTHX_ (AV *)SvRV (self), ix ? adjust : 1); |
4269 | coro_semaphore_adjust (aTHX_ (AV *)SvRV (self), adjust); |
4262 | |
4270 | |
4263 | void |
4271 | void |
4264 | down (...) |
4272 | down (...) |
4265 | CODE: |
4273 | CODE: |
4266 | CORO_EXECUTE_SLF_XS (slf_init_semaphore_down); |
4274 | CORO_EXECUTE_SLF_XS (slf_init_semaphore_down); |