… | |
… | |
938 | /* copy throw, in case it was set before coro_setup */ |
938 | /* copy throw, in case it was set before coro_setup */ |
939 | CORO_THROW = coro->except; |
939 | CORO_THROW = coro->except; |
940 | } |
940 | } |
941 | |
941 | |
942 | static void |
942 | static void |
943 | coro_destruct (pTHX_ struct coro *coro) |
943 | coro_destruct_perl (pTHX_ struct coro *coro) |
944 | { |
944 | { |
945 | if (!IN_DESTRUCT) |
945 | if (!IN_DESTRUCT) |
946 | { |
946 | { |
947 | /* restore all saved variables and stuff */ |
947 | /* restore all saved variables and stuff */ |
948 | LEAVE_SCOPE (0); |
948 | LEAVE_SCOPE (0); |
… | |
… | |
1471 | --coro_nready; |
1471 | --coro_nready; |
1472 | } |
1472 | } |
1473 | else |
1473 | else |
1474 | coro->flags |= CF_READY; /* make sure it is NOT put into the readyqueue */ |
1474 | coro->flags |= CF_READY; /* make sure it is NOT put into the readyqueue */ |
1475 | |
1475 | |
1476 | if (coro->mainstack && coro->mainstack != main_mainstack) |
1476 | if (coro->mainstack |
|
|
1477 | && coro->mainstack != main_mainstack |
|
|
1478 | && !PL_dirty) |
1477 | { |
1479 | { |
1478 | struct coro temp; |
1480 | struct coro temp; |
1479 | |
1481 | |
1480 | assert (("FATAL: tried to destroy currently running coroutine (please report)", !(coro->flags & CF_RUNNING))); |
1482 | assert (("FATAL: tried to destroy currently running coroutine (please report)", !(coro->flags & CF_RUNNING))); |
1481 | |
1483 | |
1482 | save_perl (aTHX_ &temp); |
1484 | save_perl (aTHX_ &temp); |
1483 | load_perl (aTHX_ coro); |
1485 | load_perl (aTHX_ coro); |
1484 | |
1486 | |
1485 | coro_destruct (aTHX_ coro); |
1487 | coro_destruct_perl (aTHX_ coro); |
1486 | |
1488 | |
1487 | load_perl (aTHX_ &temp); |
1489 | load_perl (aTHX_ &temp); |
1488 | |
1490 | |
1489 | coro->slot = 0; |
1491 | coro->slot = 0; |
1490 | } |
1492 | } |
… | |
… | |
2925 | SV * |
2927 | SV * |
2926 | clone (Coro::State coro) |
2928 | clone (Coro::State coro) |
2927 | CODE: |
2929 | CODE: |
2928 | { |
2930 | { |
2929 | #if CORO_CLONE |
2931 | #if CORO_CLONE |
2930 | struct coro *ncoro = coro_clone (coro); |
2932 | struct coro *ncoro = coro_clone (aTHX_ coro); |
2931 | MAGIC *mg; |
2933 | MAGIC *mg; |
2932 | /* TODO: too much duplication */ |
2934 | /* TODO: too much duplication */ |
2933 | ncoro->hv = newHV (); |
2935 | ncoro->hv = newHV (); |
2934 | mg = sv_magicext ((SV *)ncoro->hv, 0, CORO_MAGIC_type_state, &coro_state_vtbl, (char *)ncoro, 0); |
2936 | mg = sv_magicext ((SV *)ncoro->hv, 0, CORO_MAGIC_type_state, &coro_state_vtbl, (char *)ncoro, 0); |
2935 | mg->mg_flags |= MGf_DUP; |
2937 | mg->mg_flags |= MGf_DUP; |
… | |
… | |
3126 | { |
3128 | { |
3127 | int i; |
3129 | int i; |
3128 | |
3130 | |
3129 | sv_pool_rss = coro_get_sv (aTHX_ "Coro::POOL_RSS" , TRUE); |
3131 | sv_pool_rss = coro_get_sv (aTHX_ "Coro::POOL_RSS" , TRUE); |
3130 | sv_pool_size = coro_get_sv (aTHX_ "Coro::POOL_SIZE" , TRUE); |
3132 | sv_pool_size = coro_get_sv (aTHX_ "Coro::POOL_SIZE" , TRUE); |
3131 | cv_coro_run = get_cv ( "Coro::_terminate", GV_ADD); |
3133 | cv_coro_run = get_cv ( "Coro::_coro_run" , GV_ADD); |
3132 | cv_coro_terminate = get_cv ( "Coro::terminate" , GV_ADD); |
3134 | cv_coro_terminate = get_cv ( "Coro::terminate" , GV_ADD); |
3133 | coro_current = coro_get_sv (aTHX_ "Coro::current" , FALSE); SvREADONLY_on (coro_current); |
3135 | coro_current = coro_get_sv (aTHX_ "Coro::current" , FALSE); SvREADONLY_on (coro_current); |
3134 | av_async_pool = coro_get_av (aTHX_ "Coro::async_pool", TRUE); |
3136 | av_async_pool = coro_get_av (aTHX_ "Coro::async_pool", TRUE); |
3135 | av_destroy = coro_get_av (aTHX_ "Coro::destroy" , TRUE); |
3137 | av_destroy = coro_get_av (aTHX_ "Coro::destroy" , TRUE); |
3136 | sv_manager = coro_get_sv (aTHX_ "Coro::manager" , TRUE); |
3138 | sv_manager = coro_get_sv (aTHX_ "Coro::manager" , TRUE); |