ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro/State.xs
(Generate patch)

Comparing Coro/Coro/State.xs (file contents):
Revision 1.470 by root, Fri Jul 14 13:14:32 2017 UTC vs.
Revision 1.475 by root, Tue Aug 14 16:51:38 2018 UTC

2#define USE_NO_MINGW_SETJMP_TWO_ARGS 2#define USE_NO_MINGW_SETJMP_TWO_ARGS
3 3
4#define NDEBUG 1 /* perl usually disables NDEBUG later */ 4#define NDEBUG 1 /* perl usually disables NDEBUG later */
5 5
6#include "libcoro/coro.c" 6#include "libcoro/coro.c"
7
8#if CORO_UCONTEXT
9 #define CORO_BACKEND "ucontext"
10#elif CORO_SJLJ
11 #define CORO_BACKEND "sjlj"
12#elif CORO_LINUX
13 #define CORO_BACKEND "linux"
14#elif CORO_LOSER
15 #define CORO_BACKEND "loser"
16#elif CORO_FIBER
17 #define CORO_BACKEND "fiber"
18#elif CORO_IRIX
19 #define CORO_BACKEND "irix"
20#elif CORO_ASM
21 #define CORO_BACKEND "asm"
22#elif CORO_PTHREAD
23 #define CORO_BACKEND "pthread"
24#else
25 #define CORO_BACKEND "unknown"
26#endif
7 27
8#define PERL_NO_GET_CONTEXT 28#define PERL_NO_GET_CONTEXT
9#define PERL_EXT 29#define PERL_EXT
10 30
11#include "EXTERN.h" 31#include "EXTERN.h"
116# define CORO_CLOCK_MONOTONIC 1 136# define CORO_CLOCK_MONOTONIC 1
117# define CORO_CLOCK_THREAD_CPUTIME_ID 3 137# define CORO_CLOCK_THREAD_CPUTIME_ID 3
118# endif 138# endif
119#endif 139#endif
120 140
141/* one off bugfix for perl 5.22 */
142#if PERL_VERSION_ATLEAST(5,22,0) && !PERL_VERSION_ATLEAST(5,24,0)
143# undef PadlistNAMES
144# define PadlistNAMES(pl) *((PADNAMELIST **)PadlistARRAY (pl))
145#endif
146
121#if PERL_VERSION_ATLEAST(5,24,0) 147#if PERL_VERSION_ATLEAST(5,24,0)
122# define SUB_ARGARRAY PL_curpad[0] 148# define SUB_ARGARRAY PL_curpad[0]
123#else 149#else
124# define SUB_ARGARRAY (SV *)cx->blk_sub.argarray 150# define SUB_ARGARRAY (SV *)cx->blk_sub.argarray
125#endif 151#endif
1216 myop.op_next = Nullop; 1242 myop.op_next = Nullop;
1217 myop.op_type = OP_ENTERSUB; 1243 myop.op_type = OP_ENTERSUB;
1218 myop.op_flags = OPf_WANT_VOID; 1244 myop.op_flags = OPf_WANT_VOID;
1219 1245
1220 PUSHMARK (SP); 1246 PUSHMARK (SP);
1221 PUSHs ((SV *)coro->startcv); 1247 XPUSHs ((SV *)coro->startcv);
1222 PUTBACK; 1248 PUTBACK;
1223 PL_op = (OP *)&myop; 1249 PL_op = (OP *)&myop;
1224 PL_op = PL_ppaddr[OP_ENTERSUB](aTHX); 1250 PL_op = PL_ppaddr[OP_ENTERSUB](aTHX);
1225 } 1251 }
1226 1252
1374 av_push (av, SvREFCNT_inc_NN (*bot++)); 1400 av_push (av, SvREFCNT_inc_NN (*bot++));
1375 1401
1376 PL_runops = RUNOPS_DEFAULT; 1402 PL_runops = RUNOPS_DEFAULT;
1377 ENTER; 1403 ENTER;
1378 SAVETMPS; 1404 SAVETMPS;
1405 PUSHMARK (SP);
1379 EXTEND (SP, 3); 1406 EXTEND (SP, 3);
1380 PUSHMARK (SP);
1381 PUSHs (&PL_sv_no); 1407 PUSHs (&PL_sv_no);
1382 PUSHs (fullname); 1408 PUSHs (fullname);
1383 PUSHs (sv_2mortal (newRV_noinc ((SV *)av))); 1409 PUSHs (sv_2mortal (newRV_noinc ((SV *)av)));
1384 PUTBACK; 1410 PUTBACK;
1385 cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_sub_cb", sizeof ("_trace_sub_cb") - 1, 0); 1411 cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_sub_cb", sizeof ("_trace_sub_cb") - 1, 0);
1412 gv_efullname3 (fullname, gv, 0); 1438 gv_efullname3 (fullname, gv, 0);
1413 1439
1414 PL_runops = RUNOPS_DEFAULT; 1440 PL_runops = RUNOPS_DEFAULT;
1415 ENTER; 1441 ENTER;
1416 SAVETMPS; 1442 SAVETMPS;
1443 PUSHMARK (SP);
1417 EXTEND (SP, 3); 1444 EXTEND (SP, 3);
1418 PUSHMARK (SP);
1419 PUSHs (&PL_sv_yes); 1445 PUSHs (&PL_sv_yes);
1420 PUSHs (fullname); 1446 PUSHs (fullname);
1421 PUSHs (CxHASARGS (cx) ? sv_2mortal (newRV_inc (SUB_ARGARRAY)) : &PL_sv_undef); 1447 PUSHs (CxHASARGS (cx) ? sv_2mortal (newRV_inc (SUB_ARGARRAY)) : &PL_sv_undef);
1422 PUTBACK; 1448 PUTBACK;
1423 cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_sub_cb", sizeof ("_trace_sub_cb") - 1, 0); 1449 cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_sub_cb", sizeof ("_trace_sub_cb") - 1, 0);
1436 dSP; 1462 dSP;
1437 1463
1438 PL_runops = RUNOPS_DEFAULT; 1464 PL_runops = RUNOPS_DEFAULT;
1439 ENTER; 1465 ENTER;
1440 SAVETMPS; 1466 SAVETMPS;
1441 EXTEND (SP, 3);
1442 PL_runops = RUNOPS_DEFAULT;
1443 PUSHMARK (SP); 1467 PUSHMARK (SP);
1468 EXTEND (SP, 2);
1444 PUSHs (sv_2mortal (newSVpv (OutCopFILE (oldcop), 0))); 1469 PUSHs (sv_2mortal (newSVpv (OutCopFILE (oldcop), 0)));
1445 PUSHs (sv_2mortal (newSViv (CopLINE (oldcop)))); 1470 PUSHs (sv_2mortal (newSViv (CopLINE (oldcop))));
1446 PUTBACK; 1471 PUTBACK;
1447 cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_line_cb", sizeof ("_trace_line_cb") - 1, 0); 1472 cb = hv_fetch ((HV *)SvRV (coro_current), "_trace_line_cb", sizeof ("_trace_line_cb") - 1, 0);
1448 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD); 1473 if (cb) call_sv (*cb, G_KEEPERR | G_EVAL | G_VOID | G_DISCARD);
2366safe_cancel (pTHX_ struct coro *coro, SV **arg, int items) 2391safe_cancel (pTHX_ struct coro *coro, SV **arg, int items)
2367{ 2392{
2368 if (coro->cctx) 2393 if (coro->cctx)
2369 croak ("coro inside C callback, unable to cancel at this time, caught"); 2394 croak ("coro inside C callback, unable to cancel at this time, caught");
2370 2395
2371 if (coro->flags & CF_NEW) 2396 if (coro->flags & (CF_NEW | CF_ZOMBIE))
2372 { 2397 {
2373 coro_set_status (aTHX_ coro, arg, items); 2398 coro_set_status (aTHX_ coro, arg, items);
2374 coro_state_destroy (aTHX_ coro); 2399 coro_state_destroy (aTHX_ coro);
2375 } 2400 }
2376 else 2401 else
3669 rv_diehook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::diehook" , 0, SVt_PVCV)); 3694 rv_diehook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::diehook" , 0, SVt_PVCV));
3670 rv_warnhook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::warnhook", 0, SVt_PVCV)); 3695 rv_warnhook = newRV_inc ((SV *)gv_fetchpv ("Coro::State::warnhook", 0, SVt_PVCV));
3671 3696
3672 coro_state_stash = gv_stashpv ("Coro::State", TRUE); 3697 coro_state_stash = gv_stashpv ("Coro::State", TRUE);
3673 3698
3699 newCONSTSUB (coro_state_stash, "BACKEND", newSVpv (CORO_BACKEND, 0)); /* undocumented */
3700
3674 newCONSTSUB (coro_state_stash, "CC_TRACE" , newSViv (CC_TRACE)); 3701 newCONSTSUB (coro_state_stash, "CC_TRACE" , newSViv (CC_TRACE));
3675 newCONSTSUB (coro_state_stash, "CC_TRACE_SUB" , newSViv (CC_TRACE_SUB)); 3702 newCONSTSUB (coro_state_stash, "CC_TRACE_SUB" , newSViv (CC_TRACE_SUB));
3676 newCONSTSUB (coro_state_stash, "CC_TRACE_LINE", newSViv (CC_TRACE_LINE)); 3703 newCONSTSUB (coro_state_stash, "CC_TRACE_LINE", newSViv (CC_TRACE_LINE));
3677 newCONSTSUB (coro_state_stash, "CC_TRACE_ALL" , newSViv (CC_TRACE_ALL)); 3704 newCONSTSUB (coro_state_stash, "CC_TRACE_ALL" , newSViv (CC_TRACE_ALL));
3678 3705
3802call (Coro::State coro, SV *coderef) 3829call (Coro::State coro, SV *coderef)
3803 ALIAS: 3830 ALIAS:
3804 eval = 1 3831 eval = 1
3805 CODE: 3832 CODE:
3806{ 3833{
3834 struct coro *current = SvSTATE_current;
3835
3807 if (coro->mainstack && ((coro->flags & CF_RUNNING) || coro->slot)) 3836 if ((coro == current) || (coro->mainstack && ((coro->flags & CF_RUNNING) || coro->slot)))
3808 { 3837 {
3809 struct coro *current = SvSTATE_current;
3810 struct CoroSLF slf_save; 3838 struct CoroSLF slf_save;
3811 3839
3812 if (current != coro) 3840 if (current != coro)
3813 { 3841 {
3814 PUTBACK; 3842 PUTBACK;
4073 coroapi.enterleave_hook = api_enterleave_hook; 4101 coroapi.enterleave_hook = api_enterleave_hook;
4074 coroapi.enterleave_unhook = api_enterleave_unhook; 4102 coroapi.enterleave_unhook = api_enterleave_unhook;
4075 coroapi.enterleave_scope_hook = api_enterleave_scope_hook; 4103 coroapi.enterleave_scope_hook = api_enterleave_scope_hook;
4076 4104
4077 /*GCoroAPI = &coroapi;*/ 4105 /*GCoroAPI = &coroapi;*/
4078 sv_setiv (sv, (IV)&coroapi); 4106 sv_setiv (sv, PTR2IV (&coroapi));
4079 SvREADONLY_on (sv); 4107 SvREADONLY_on (sv);
4080 } 4108 }
4081} 4109}
4082 4110
4083SV * 4111SV *

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines