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.348 by root, Wed Jun 10 00:20:26 2009 UTC vs.
Revision 1.351 by root, Sat Jun 20 08:58:25 2009 UTC

990} 990}
991 991
992static void 992static void
993coro_destruct_perl (pTHX_ struct coro *coro) 993coro_destruct_perl (pTHX_ struct coro *coro)
994{ 994{
995 SV *svf [9];
996
997 {
998 struct coro *current = SvSTATE_current;
999
1000 assert (("FATAL: tried to destroy currently running coroutine", coro->mainstack != PL_mainstack));
1001
1002 save_perl (aTHX_ current);
1003 load_perl (aTHX_ coro);
995 coro_unwind_stacks (aTHX); 1004 coro_unwind_stacks (aTHX);
1005 coro_destruct_stacks (aTHX);
996 1006
997 SvREFCNT_dec (GvSV (PL_defgv)); 1007 // now save some sv's to be free'd later
998 SvREFCNT_dec (GvAV (PL_defgv)); 1008 svf [0] = GvSV (PL_defgv);
999 SvREFCNT_dec (GvSV (PL_errgv)); 1009 svf [1] = (SV *)GvAV (PL_defgv);
1000 SvREFCNT_dec (PL_defoutgv); 1010 svf [2] = GvSV (PL_errgv);
1001 SvREFCNT_dec (PL_rs); 1011 svf [3] = (SV *)PL_defoutgv;
1002 SvREFCNT_dec (GvSV (irsgv)); 1012 svf [4] = PL_rs;
1003 SvREFCNT_dec (GvHV (PL_hintgv)); 1013 svf [5] = GvSV (irsgv);
1014 svf [6] = (SV *)GvHV (PL_hintgv);
1015 svf [7] = PL_diehook;
1016 svf [8] = PL_warnhook;
1017 assert (9 == sizeof (svf) / sizeof (*svf));
1004 1018
1005 SvREFCNT_dec (PL_diehook); 1019 load_perl (aTHX_ current);
1006 SvREFCNT_dec (PL_warnhook);
1007 1020 }
1021
1022 {
1023 int i;
1024
1025 for (i = 0; i < sizeof (svf) / sizeof (*svf); ++i)
1026 SvREFCNT_dec (svf [i]);
1027
1008 SvREFCNT_dec (coro->saved_deffh); 1028 SvREFCNT_dec (coro->saved_deffh);
1009 SvREFCNT_dec (coro->rouse_cb); 1029 SvREFCNT_dec (coro->rouse_cb);
1010 SvREFCNT_dec (coro->invoke_cb); 1030 SvREFCNT_dec (coro->invoke_cb);
1011 SvREFCNT_dec (coro->invoke_av); 1031 SvREFCNT_dec (coro->invoke_av);
1012 1032 }
1013 coro_destruct_stacks (aTHX);
1014} 1033}
1015 1034
1016INLINE void 1035INLINE void
1017free_coro_mortal (pTHX) 1036free_coro_mortal (pTHX)
1018{ 1037{
1505 1524
1506 if (coro->mainstack 1525 if (coro->mainstack
1507 && coro->mainstack != main_mainstack 1526 && coro->mainstack != main_mainstack
1508 && coro->slot 1527 && coro->slot
1509 && !PL_dirty) 1528 && !PL_dirty)
1510 {
1511 struct coro *current = SvSTATE_current;
1512
1513 assert (("FATAL: tried to destroy currently running coroutine", coro->mainstack != PL_mainstack));
1514
1515 save_perl (aTHX_ current);
1516 load_perl (aTHX_ coro);
1517
1518 coro_destruct_perl (aTHX_ coro); 1529 coro_destruct_perl (aTHX_ coro);
1519
1520 load_perl (aTHX_ current);
1521
1522 coro->slot = 0;
1523 }
1524 1530
1525 cctx_destroy (coro->cctx); 1531 cctx_destroy (coro->cctx);
1526 SvREFCNT_dec (coro->startcv); 1532 SvREFCNT_dec (coro->startcv);
1527 SvREFCNT_dec (coro->args); 1533 SvREFCNT_dec (coro->args);
1528 SvREFCNT_dec (CORO_THROW); 1534 SvREFCNT_dec (CORO_THROW);
3221 3227
3222MODULE = Coro::State PACKAGE = Coro 3228MODULE = Coro::State PACKAGE = Coro
3223 3229
3224BOOT: 3230BOOT:
3225{ 3231{
3226 int i;
3227
3228 sv_pool_rss = coro_get_sv (aTHX_ "Coro::POOL_RSS" , TRUE); 3232 sv_pool_rss = coro_get_sv (aTHX_ "Coro::POOL_RSS" , TRUE);
3229 sv_pool_size = coro_get_sv (aTHX_ "Coro::POOL_SIZE" , TRUE); 3233 sv_pool_size = coro_get_sv (aTHX_ "Coro::POOL_SIZE" , TRUE);
3230 cv_coro_run = get_cv ( "Coro::_coro_run" , GV_ADD); 3234 cv_coro_run = get_cv ( "Coro::_coro_run" , GV_ADD);
3231 cv_coro_terminate = get_cv ( "Coro::terminate" , GV_ADD); 3235 cv_coro_terminate = get_cv ( "Coro::terminate" , GV_ADD);
3232 coro_current = coro_get_sv (aTHX_ "Coro::current" , FALSE); SvREADONLY_on (coro_current); 3236 coro_current = coro_get_sv (aTHX_ "Coro::current" , FALSE); SvREADONLY_on (coro_current);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines