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.374 by root, Fri Oct 2 19:55:59 2009 UTC vs.
Revision 1.378 by root, Sat Dec 12 01:30:26 2009 UTC

718 { 718 {
719 CV *cv = cx->blk_sub.cv; 719 CV *cv = cx->blk_sub.cv;
720 720
721 if (expect_true (CvDEPTH (cv))) 721 if (expect_true (CvDEPTH (cv)))
722 { 722 {
723 EXTEND (SP, 3);
723 PUSHs ((SV *)CvPADLIST (cv)); 724 PUSHs ((SV *)CvPADLIST (cv));
724 PUSHs (INT2PTR (SV *, (IV)CvDEPTH (cv))); 725 PUSHs (INT2PTR (SV *, (IV)CvDEPTH (cv)));
725 PUSHs ((SV *)cv); 726 PUSHs ((SV *)cv);
726 727
727 CvDEPTH (cv) = 0; 728 CvDEPTH (cv) = 0;
1135 1136
1136 SvREFCNT_dec (coro->saved_deffh); 1137 SvREFCNT_dec (coro->saved_deffh);
1137 SvREFCNT_dec (coro->rouse_cb); 1138 SvREFCNT_dec (coro->rouse_cb);
1138 SvREFCNT_dec (coro->invoke_cb); 1139 SvREFCNT_dec (coro->invoke_cb);
1139 SvREFCNT_dec (coro->invoke_av); 1140 SvREFCNT_dec (coro->invoke_av);
1140 SvREFCNT_dec (coro->swap_sv);
1141 } 1141 }
1142} 1142}
1143 1143
1144INLINE void 1144INLINE void
1145free_coro_mortal (pTHX) 1145free_coro_mortal (pTHX)
1636 && coro->mainstack != main_mainstack 1636 && coro->mainstack != main_mainstack
1637 && coro->slot 1637 && coro->slot
1638 && !PL_dirty) 1638 && !PL_dirty)
1639 destroy_perl (aTHX_ coro); 1639 destroy_perl (aTHX_ coro);
1640 1640
1641 if (coro->next) coro->next->prev = coro->prev;
1642 if (coro->prev) coro->prev->next = coro->next;
1643 if (coro == coro_first) coro_first = coro->next;
1644
1641 cctx_destroy (coro->cctx); 1645 cctx_destroy (coro->cctx);
1642 SvREFCNT_dec (coro->startcv); 1646 SvREFCNT_dec (coro->startcv);
1643 SvREFCNT_dec (coro->args); 1647 SvREFCNT_dec (coro->args);
1648 SvREFCNT_dec (coro->swap_sv);
1644 SvREFCNT_dec (CORO_THROW); 1649 SvREFCNT_dec (CORO_THROW);
1645
1646 if (coro->next) coro->next->prev = coro->prev;
1647 if (coro->prev) coro->prev->next = coro->next;
1648 if (coro == coro_first) coro_first = coro->next;
1649 1650
1650 return 1; 1651 return 1;
1651} 1652}
1652 1653
1653static int 1654static int
1823 { 1824 {
1824 /* nothing to schedule: call the idle handler */ 1825 /* nothing to schedule: call the idle handler */
1825 if (SvROK (sv_idle) 1826 if (SvROK (sv_idle)
1826 && SvOBJECT (SvRV (sv_idle))) 1827 && SvOBJECT (SvRV (sv_idle)))
1827 { 1828 {
1829 if (SvRV (sv_idle) == SvRV (coro_current))
1830 croak ("FATAL: $Coro::IDLE blocked itself - did you try to block inside an event loop callback? Caught");
1831
1828 ++coro_nready; /* hack so that api_ready doesn't invoke ready hook */ 1832 ++coro_nready; /* hack so that api_ready doesn't invoke ready hook */
1829 api_ready (aTHX_ SvRV (sv_idle)); 1833 api_ready (aTHX_ SvRV (sv_idle));
1830 --coro_nready; 1834 --coro_nready;
1831 } 1835 }
1832 else 1836 else
3396 SWAP_SVS (current); 3400 SWAP_SVS (current);
3397 3401
3398 if (!coro->swap_sv) 3402 if (!coro->swap_sv)
3399 coro->swap_sv = newAV (); 3403 coro->swap_sv = newAV ();
3400 3404
3401 av_push (coro->swap_sv, SvREFCNT_inc_NN (sv)); 3405 av_push (coro->swap_sv, SvREFCNT_inc_NN (SvRV (sv )));
3402 av_push (coro->swap_sv, SvREFCNT_inc_NN (swapsv)); 3406 av_push (coro->swap_sv, SvREFCNT_inc_NN (SvRV (swapsv)));
3403 3407
3404 if (current == coro) 3408 if (current == coro)
3405 SWAP_SVS (current); 3409 SWAP_SVS (current);
3406} 3410}
3407 3411

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines