… | |
… | |
47 | void *sptr; |
47 | void *sptr; |
48 | long ssize; /* positive == mmap, otherwise malloc */ |
48 | long ssize; /* positive == mmap, otherwise malloc */ |
49 | } coro_stack; |
49 | } coro_stack; |
50 | |
50 | |
51 | struct coro { |
51 | struct coro { |
|
|
52 | /* the top-level JMPENV for each coroutine, needed to catch dies. */ |
|
|
53 | JMPENV start_env; |
|
|
54 | |
52 | /* the optional C context */ |
55 | /* the optional C context */ |
53 | coro_stack *stack; |
56 | coro_stack *stack; |
54 | void *cursp; |
57 | void *cursp; |
55 | int gencnt; |
58 | int gencnt; |
56 | |
59 | |
… | |
… | |
656 | * this is a _very_ stripped down perl interpreter ;) |
659 | * this is a _very_ stripped down perl interpreter ;) |
657 | */ |
660 | */ |
658 | Coro__State ctx = (Coro__State)arg; |
661 | Coro__State ctx = (Coro__State)arg; |
659 | JMPENV coro_start_env; |
662 | JMPENV coro_start_env; |
660 | |
663 | |
661 | /* same as JMPENV_BOOTSTRAP */ |
|
|
662 | Zero(&coro_start_env, 1, JMPENV); |
|
|
663 | coro_start_env.je_ret = -1; |
|
|
664 | coro_start_env.je_mustcatch = TRUE; |
|
|
665 | PL_top_env = &coro_start_env; |
664 | PL_top_env = &ctx->start_env; |
666 | |
665 | |
667 | ctx->cursp = 0; |
666 | ctx->cursp = 0; |
668 | PL_op = PL_op->op_next; |
667 | PL_op = PL_op->op_next; |
669 | CALLRUNOPS(aTHX); |
668 | CALLRUNOPS(aTHX); |
670 | |
669 | |
… | |
… | |
728 | if (!prev->stack) |
727 | if (!prev->stack) |
729 | allocate_stack (prev, 0); |
728 | allocate_stack (prev, 0); |
730 | |
729 | |
731 | if (prev->stack->sptr && flags & TRANSFER_LAZY_STACK) |
730 | if (prev->stack->sptr && flags & TRANSFER_LAZY_STACK) |
732 | { |
731 | { |
|
|
732 | PL_top_env = &next->start_env; |
|
|
733 | |
733 | setup_coro (next); |
734 | setup_coro (next); |
734 | |
735 | |
735 | prev->stack->refcnt++; |
736 | prev->stack->refcnt++; |
736 | prev->stack->usecnt++; |
737 | prev->stack->usecnt++; |
737 | next->stack = prev->stack; |
738 | next->stack = prev->stack; |
… | |
… | |
930 | |
931 | |
931 | coro->args = (AV *)SvREFCNT_inc (SvRV (args)); |
932 | coro->args = (AV *)SvREFCNT_inc (SvRV (args)); |
932 | coro->mainstack = 0; /* actual work is done inside transfer */ |
933 | coro->mainstack = 0; /* actual work is done inside transfer */ |
933 | coro->stack = 0; |
934 | coro->stack = 0; |
934 | |
935 | |
|
|
936 | /* same as JMPENV_BOOTSTRAP */ |
|
|
937 | /* we might be able to recycle start_env, but safe is safe */ |
|
|
938 | Zero(&coro->start_env, 1, JMPENV); |
|
|
939 | coro->start_env.je_ret = -1; |
|
|
940 | coro->start_env.je_mustcatch = TRUE; |
|
|
941 | |
935 | RETVAL = coro; |
942 | RETVAL = coro; |
936 | OUTPUT: |
943 | OUTPUT: |
937 | RETVAL |
944 | RETVAL |
938 | |
945 | |
939 | void |
946 | void |