… | |
… | |
990 | } |
990 | } |
991 | |
991 | |
992 | static void |
992 | static void |
993 | coro_destruct_perl (pTHX_ struct coro *coro) |
993 | coro_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 | |
1016 | INLINE void |
1036 | INLINE void |
1017 | free_coro_mortal (pTHX) |
1037 | free_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); |