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.368 by root, Thu Aug 13 02:35:41 2009 UTC vs.
Revision 1.372 by root, Thu Oct 1 23:50:23 2009 UTC

142static SV *sv_pool_size; 142static SV *sv_pool_size;
143static SV *sv_async_pool_idle; /* description string */ 143static SV *sv_async_pool_idle; /* description string */
144static AV *av_async_pool; /* idle pool */ 144static AV *av_async_pool; /* idle pool */
145static SV *sv_Coro; /* class string */ 145static SV *sv_Coro; /* class string */
146static CV *cv_pool_handler; 146static CV *cv_pool_handler;
147static CV *cv_coro_state_new;
148 147
149/* Coro::AnyEvent */ 148/* Coro::AnyEvent */
150static SV *sv_activity; 149static SV *sv_activity;
151 150
152/* enable processtime/realtime profiling */ 151/* enable processtime/realtime profiling */
290static OP *(*coro_old_pp_sselect) (pTHX); 289static OP *(*coro_old_pp_sselect) (pTHX);
291static SV *coro_select_select; 290static SV *coro_select_select;
292 291
293/* horrible hack, but if it works... */ 292/* horrible hack, but if it works... */
294static OP * 293static OP *
295coro_pp_sselect (aTHX) 294coro_pp_sselect (pTHX)
296{ 295{
297 dSP; 296 dSP;
298 PUSHMARK (SP - 4); /* fake argument list */ 297 PUSHMARK (SP - 4); /* fake argument list */
299 XPUSHs (coro_select_select); 298 XPUSHs (coro_select_select);
300 PUTBACK; 299 PUTBACK;
1761 api_ready (aTHX_ SvRV (sv_idle)); 1760 api_ready (aTHX_ SvRV (sv_idle));
1762 --coro_nready; 1761 --coro_nready;
1763 } 1762 }
1764 else 1763 else
1765 { 1764 {
1765 /* TODO: deprecated, remove, cannot work reliably *//*D*/
1766 dSP; 1766 dSP;
1767 1767
1768 ENTER; 1768 ENTER;
1769 SAVETMPS; 1769 SAVETMPS;
1770 1770
2331 if (PL_op->op_ppaddr != PL_ppaddr [OP_ENTERSUB] 2331 if (PL_op->op_ppaddr != PL_ppaddr [OP_ENTERSUB]
2332 && PL_op->op_ppaddr != pp_slf) 2332 && PL_op->op_ppaddr != pp_slf)
2333 croak ("FATAL: Coro SLF calls can only be made normally, not via goto or any other means, caught"); 2333 croak ("FATAL: Coro SLF calls can only be made normally, not via goto or any other means, caught");
2334 2334
2335 CvFLAGS (cv) |= CVf_SLF; 2335 CvFLAGS (cv) |= CVf_SLF;
2336 CvNODEBUG_on (cv);
2336 CvXSUBANY (cv).any_ptr = (void *)init_cb; 2337 CvXSUBANY (cv).any_ptr = (void *)init_cb;
2337 slf_cv = cv; 2338 slf_cv = cv;
2338 2339
2339 /* we patch the op, and then re-run the whole call */ 2340 /* we patch the op, and then re-run the whole call */
2340 /* we have to put the same argument on the stack for this to work */ 2341 /* we have to put the same argument on the stack for this to work */
2918#endif 2919#endif
2919 2920
2920/*****************************************************************************/ 2921/*****************************************************************************/
2921 2922
2922static SV * 2923static SV *
2923coro_new (HV *stash, SV **argv, int argc, int is_coro) 2924coro_new (pTHX_ HV *stash, SV **argv, int argc, int is_coro)
2924{ 2925{
2925 SV *coro_sv; 2926 SV *coro_sv;
2926 struct coro *coro; 2927 struct coro *coro;
2927 MAGIC *mg; 2928 MAGIC *mg;
2928 HV *hv; 2929 HV *hv;
3054SV * 3055SV *
3055new (SV *klass, ...) 3056new (SV *klass, ...)
3056 ALIAS: 3057 ALIAS:
3057 Coro::new = 1 3058 Coro::new = 1
3058 CODE: 3059 CODE:
3059 RETVAL = coro_new (ix ? coro_stash : coro_state_stash, &ST (1), items - 1, ix); 3060 RETVAL = coro_new (aTHX_ ix ? coro_stash : coro_state_stash, &ST (1), items - 1, ix);
3060 OUTPUT: 3061 OUTPUT:
3061 RETVAL 3062 RETVAL
3062 3063
3063void 3064void
3064transfer (...) 3065transfer (...)
3332 sv_idle = coro_get_sv (aTHX_ "Coro::idle" , TRUE); 3333 sv_idle = coro_get_sv (aTHX_ "Coro::idle" , TRUE);
3333 3334
3334 sv_async_pool_idle = newSVpv ("[async pool idle]", 0); SvREADONLY_on (sv_async_pool_idle); 3335 sv_async_pool_idle = newSVpv ("[async pool idle]", 0); SvREADONLY_on (sv_async_pool_idle);
3335 sv_Coro = newSVpv ("Coro", 0); SvREADONLY_on (sv_Coro); 3336 sv_Coro = newSVpv ("Coro", 0); SvREADONLY_on (sv_Coro);
3336 cv_pool_handler = get_cv ("Coro::pool_handler", GV_ADD); SvREADONLY_on (cv_pool_handler); 3337 cv_pool_handler = get_cv ("Coro::pool_handler", GV_ADD); SvREADONLY_on (cv_pool_handler);
3337 cv_coro_state_new = get_cv ("Coro::State::new", 0); SvREADONLY_on (cv_coro_state_new); 3338 CvNODEBUG_on (get_cv ("Coro::_pool_handler", 0)); /* work around a debugger bug */
3338 3339
3339 coro_stash = gv_stashpv ("Coro", TRUE); 3340 coro_stash = gv_stashpv ("Coro", TRUE);
3340 3341
3341 newCONSTSUB (coro_stash, "PRIO_MAX", newSViv (CORO_PRIO_MAX)); 3342 newCONSTSUB (coro_stash, "PRIO_MAX", newSViv (CORO_PRIO_MAX));
3342 newCONSTSUB (coro_stash, "PRIO_HIGH", newSViv (CORO_PRIO_HIGH)); 3343 newCONSTSUB (coro_stash, "PRIO_HIGH", newSViv (CORO_PRIO_HIGH));
3343 newCONSTSUB (coro_stash, "PRIO_NORMAL", newSViv (CORO_PRIO_NORMAL)); 3344 newCONSTSUB (coro_stash, "PRIO_NORMAL", newSViv (CORO_PRIO_NORMAL));
3365 3366
3366SV * 3367SV *
3367async (...) 3368async (...)
3368 PROTOTYPE: &@ 3369 PROTOTYPE: &@
3369 CODE: 3370 CODE:
3370 RETVAL = coro_new (coro_stash, &ST (0), items, 1); 3371 RETVAL = coro_new (aTHX_ coro_stash, &ST (0), items, 1);
3371 api_ready (RETVAL); 3372 api_ready (aTHX_ RETVAL);
3372 OUTPUT: 3373 OUTPUT:
3373 RETVAL 3374 RETVAL
3374 3375
3375void 3376void
3376terminate (...) 3377terminate (...)
3496 for (i = 1; i < items; ++i) 3497 for (i = 1; i < items; ++i)
3497 av_push (av, SvREFCNT_inc_NN (ST (i))); 3498 av_push (av, SvREFCNT_inc_NN (ST (i)));
3498 3499
3499 if ((SV *)hv == &PL_sv_undef) 3500 if ((SV *)hv == &PL_sv_undef)
3500 { 3501 {
3501 PUSHMARK (SP); 3502 SV *sv = coro_new (aTHX_ coro_stash, (SV **)&cv_pool_handler, 1, 1);
3502 EXTEND (SP, 2);
3503 PUSHs (sv_Coro);
3504 PUSHs ((SV *)cv_pool_handler);
3505 PUTBACK;
3506 call_sv ((SV *)cv_coro_state_new, G_SCALAR);
3507 SPAGAIN;
3508
3509 hv = (HV *)SvREFCNT_inc_NN (SvRV (POPs)); 3503 hv = (HV *)SvREFCNT_inc_NN (SvRV (sv));
3504 SvREFCNT_dec (sv);
3510 } 3505 }
3511 3506
3512 { 3507 {
3513 struct coro *coro = SvSTATE_hv (hv); 3508 struct coro *coro = SvSTATE_hv (hv);
3514 3509

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines