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.185 by root, Thu Oct 4 19:35:08 2007 UTC vs.
Revision 1.192 by root, Fri Oct 5 21:51:40 2007 UTC

75/* 5.8.7 */ 75/* 5.8.7 */
76#ifndef SvRV_set 76#ifndef SvRV_set
77# define SvRV_set(s,v) SvRV(s) = (v) 77# define SvRV_set(s,v) SvRV(s) = (v)
78#endif 78#endif
79 79
80/* 5.8.8 */
81#ifndef GV_NOTQUAL
82# define GV_NOTQUAL 0
83#endif
84#ifndef newSV
85# define newSV(l) NEWSV(0,l)
86#endif
87
80#if !__i386 && !__x86_64 && !__powerpc && !__m68k && !__alpha && !__mips && !__sparc64 88#if !__i386 && !__x86_64 && !__powerpc && !__m68k && !__alpha && !__mips && !__sparc64
81# undef CORO_STACKGUARD 89# undef CORO_STACKGUARD
82#endif 90#endif
83 91
84#ifndef CORO_STACKGUARD 92#ifndef CORO_STACKGUARD
132static AV *main_mainstack; /* used to differentiate between $main and others */ 140static AV *main_mainstack; /* used to differentiate between $main and others */
133static JMPENV *main_top_env; 141static JMPENV *main_top_env;
134static HV *coro_state_stash, *coro_stash; 142static HV *coro_state_stash, *coro_stash;
135static SV *coro_mortal; /* will be freed after next transfer */ 143static SV *coro_mortal; /* will be freed after next transfer */
136 144
137static GV *irsgv; /* $/ */ 145static GV *irsgv; /* $/ */
146static GV *stdoutgv; /* *STDOUT */
138 147
139/* async_pool helper stuff */ 148/* async_pool helper stuff */
140static SV *sv_pool_rss; 149static SV *sv_pool_rss;
141static SV *sv_pool_size; 150static SV *sv_pool_size;
142static AV *av_async_pool; 151static AV *av_async_pool;
598 PL_curpm = 0; 607 PL_curpm = 0;
599 PL_localizing = 0; 608 PL_localizing = 0;
600 PL_dirty = 0; 609 PL_dirty = 0;
601 PL_restartop = 0; 610 PL_restartop = 0;
602 611
603 GvSV (PL_defgv) = NEWSV (0, 0); 612 GvSV (PL_defgv) = newSV (0);
604 GvAV (PL_defgv) = coro->args; coro->args = 0; 613 GvAV (PL_defgv) = coro->args; coro->args = 0;
605 GvSV (PL_errgv) = NEWSV (0, 0); 614 GvSV (PL_errgv) = newSV (0);
606 GvSV (irsgv) = newSVpvn ("\n", 1); sv_magic (GvSV (irsgv), (SV *)irsgv, PERL_MAGIC_sv, "/", 0); 615 GvSV (irsgv) = newSVpvn ("\n", 1); sv_magic (GvSV (irsgv), (SV *)irsgv, PERL_MAGIC_sv, "/", 0);
607 PL_rs = newSVsv (GvSV (irsgv)); 616 PL_rs = newSVsv (GvSV (irsgv));
617 PL_defoutgv = SvREFCNT_inc (stdoutgv);
608 618
609 { 619 ENTER; /* necessary e.g. for dounwind */
610 IO *io = newIO ();
611 PL_defoutgv = newGVgen ("Coro");
612 GvIOp(PL_defoutgv) = io;
613 IoTYPE (io) = IoTYPE_WRONLY;
614 IoOFP (io) = IoIFP (io) = PerlIO_stdout ();
615 IoFLAGS (io) |= IOf_FLUSH;
616 }
617 620
618 { 621 {
619 dSP; 622 dSP;
620 LOGOP myop; 623 LOGOP myop;
621 624
622 Zero (&myop, 1, LOGOP); 625 Zero (&myop, 1, LOGOP);
623 myop.op_next = Nullop; 626 myop.op_next = Nullop;
624 myop.op_flags = OPf_WANT_VOID; 627 myop.op_flags = OPf_WANT_VOID;
625 628
626 PUSHMARK (SP); 629 PUSHMARK (SP);
627 XPUSHs (av_shift (GvAV (PL_defgv))); 630 XPUSHs (sv_2mortal (av_shift (GvAV (PL_defgv))));
628 PUTBACK; 631 PUTBACK;
629 PL_op = (OP *)&myop; 632 PL_op = (OP *)&myop;
630 PL_op = PL_ppaddr[OP_ENTERSUB](aTHX); 633 PL_op = PL_ppaddr[OP_ENTERSUB](aTHX);
631 SPAGAIN; 634 SPAGAIN;
632 } 635 }
633
634 ENTER; /* necessary e.g. for dounwind */
635} 636}
636 637
637static void 638static void
638coro_destroy (pTHX_ struct coro *coro) 639coro_destroy (pTHX_ struct coro *coro)
639{ 640{
1385#ifdef USE_ITHREADS 1386#ifdef USE_ITHREADS
1386 MUTEX_INIT (&coro_mutex); 1387 MUTEX_INIT (&coro_mutex);
1387#endif 1388#endif
1388 BOOT_PAGESIZE; 1389 BOOT_PAGESIZE;
1389 1390
1390 irsgv = gv_fetchpv ("/", 1, SVt_PV); 1391 irsgv = gv_fetchpv ("/" , GV_ADD|GV_NOTQUAL, SVt_PV);
1392 stdoutgv = gv_fetchpv ("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVIO);
1391 1393
1392 coro_state_stash = gv_stashpv ("Coro::State", TRUE); 1394 coro_state_stash = gv_stashpv ("Coro::State", TRUE);
1393 1395
1394 newCONSTSUB (coro_state_stash, "CC_TRACE" , newSViv (CC_TRACE)); 1396 newCONSTSUB (coro_state_stash, "CC_TRACE" , newSViv (CC_TRACE));
1395 newCONSTSUB (coro_state_stash, "CC_TRACE_SUB" , newSViv (CC_TRACE_SUB)); 1397 newCONSTSUB (coro_state_stash, "CC_TRACE_SUB" , newSViv (CC_TRACE_SUB));
1425 coro_first = coro; 1427 coro_first = coro;
1426 1428
1427 coro->hv = hv = newHV (); 1429 coro->hv = hv = newHV ();
1428 sv_magicext ((SV *)hv, 0, PERL_MAGIC_ext, &coro_state_vtbl, (char *)coro, 0)->mg_flags |= MGf_DUP; 1430 sv_magicext ((SV *)hv, 0, PERL_MAGIC_ext, &coro_state_vtbl, (char *)coro, 0)->mg_flags |= MGf_DUP;
1429 RETVAL = sv_bless (newRV_noinc ((SV *)hv), gv_stashpv (klass, 1)); 1431 RETVAL = sv_bless (newRV_noinc ((SV *)hv), gv_stashpv (klass, 1));
1432
1433 av_extend (coro->args, items - 1);
1430 1434
1431 for (i = 1; i < items; i++) 1435 for (i = 1; i < items; i++)
1432 av_push (coro->args, newSVsv (ST (i))); 1436 av_push (coro->args, newSVsv (ST (i)));
1433} 1437}
1434 OUTPUT: 1438 OUTPUT:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines