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.44 by root, Sat Mar 22 18:50:32 2003 UTC vs.
Revision 1.45 by root, Tue May 27 01:15:31 2003 UTC

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
51struct coro { 51struct 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
939void 946void

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines