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.349 by root, Wed Jun 10 00:47:24 2009 UTC vs.
Revision 1.350 by root, Sat Jun 20 08:58:00 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;
1004 1017
1005 SvREFCNT_dec (PL_diehook); 1018 assert (9 == sizeof (svf) / sizeof (*svf));
1006 SvREFCNT_dec (PL_warnhook); 1019
1020 load_perl (aTHX_ current);
1007 1021 }
1022
1023 {
1024 int i;
1025
1026 for (i = 0; i < sizeof (svf) / sizeof (*svf); ++i)
1027 SvREFCNT_dec (svf [i]);
1028
1008 SvREFCNT_dec (coro->saved_deffh); 1029 SvREFCNT_dec (coro->saved_deffh);
1009 SvREFCNT_dec (coro->rouse_cb); 1030 SvREFCNT_dec (coro->rouse_cb);
1010 SvREFCNT_dec (coro->invoke_cb); 1031 SvREFCNT_dec (coro->invoke_cb);
1011 SvREFCNT_dec (coro->invoke_av); 1032 SvREFCNT_dec (coro->invoke_av);
1012 1033 }
1013 coro_destruct_stacks (aTHX);
1014} 1034}
1015 1035
1016INLINE void 1036INLINE void
1017free_coro_mortal (pTHX) 1037free_coro_mortal (pTHX)
1018{ 1038{
1505 1525
1506 if (coro->mainstack 1526 if (coro->mainstack
1507 && coro->mainstack != main_mainstack 1527 && coro->mainstack != main_mainstack
1508 && coro->slot 1528 && coro->slot
1509 && !PL_dirty) 1529 && !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); 1530 coro_destruct_perl (aTHX_ coro);
1519
1520 load_perl (aTHX_ current);
1521
1522 coro->slot = 0;
1523 }
1524 1531
1525 cctx_destroy (coro->cctx); 1532 cctx_destroy (coro->cctx);
1526 SvREFCNT_dec (coro->startcv); 1533 SvREFCNT_dec (coro->startcv);
1527 SvREFCNT_dec (coro->args); 1534 SvREFCNT_dec (coro->args);
1528 SvREFCNT_dec (CORO_THROW); 1535 SvREFCNT_dec (CORO_THROW);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines