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.47 by pcg, Sat Nov 15 03:53:10 2003 UTC vs.
Revision 1.51 by pcg, Sun Nov 30 17:03:48 2003 UTC

38# else 38# else
39# undef HAVE_MMAP 39# undef HAVE_MMAP
40# endif 40# endif
41# endif 41# endif
42#endif 42#endif
43
44#define MAY_FLUSH /* increases codesize and is rarely used */
45 43
46#define SUB_INIT "Coro::State::initialize" 44#define SUB_INIT "Coro::State::initialize"
47#define UCORO_STATE "_coro_state" 45#define UCORO_STATE "_coro_state"
48 46
49/* The next macro should declare a variable stacklevel that contains and approximation 47/* The next macro should declare a variable stacklevel that contains and approximation
184 sv = (SV *) newAV (); 182 sv = (SV *) newAV ();
185 else if (*name == '%') 183 else if (*name == '%')
186 sv = (SV *) newHV (); 184 sv = (SV *) newHV ();
187 else 185 else
188 sv = NEWSV (0, 0); 186 sv = NEWSV (0, 0);
187#ifdef SvPADBUSY
189 if (!SvPADBUSY (sv)) 188 if (!SvPADBUSY (sv))
189#endif
190 SvPADMY_on (sv); 190 SvPADMY_on (sv);
191 npad[ix] = sv; 191 npad[ix] = sv;
192 } 192 }
193 } 193 }
194 else if (IS_PADGV (ppad[ix]) || IS_PADCONST (ppad[ix])) 194 else if (IS_PADGV (ppad[ix]) || IS_PADCONST (ppad[ix]))
224#endif 224#endif
225 225
226 return newpadlist; 226 return newpadlist;
227} 227}
228 228
229#ifdef MAY_FLUSH
230STATIC void 229STATIC void
231free_padlist (AV *padlist) 230free_padlist (AV *padlist)
232{ 231{
233 /* may be during global destruction */ 232 /* may be during global destruction */
234 if (SvREFCNT(padlist)) 233 if (SvREFCNT (padlist))
235 { 234 {
236 I32 i = AvFILLp(padlist); 235 I32 i = AvFILLp (padlist);
237 while (i >= 0) 236 while (i >= 0)
238 { 237 {
239 SV **svp = av_fetch(padlist, i--, FALSE); 238 SV **svp = av_fetch (padlist, i--, FALSE);
240 SV *sv = svp ? *svp : Nullsv;
241 if (sv) 239 if (svp)
240 {
241 SV *sv;
242 while (&PL_sv_undef != (sv = av_pop ((AV *)*svp)))
242 SvREFCNT_dec(sv); 243 SvREFCNT_dec (sv);
244
245 SvREFCNT_dec (*svp);
246 }
243 } 247 }
244 248
245 SvREFCNT_dec((SV*)padlist); 249 SvREFCNT_dec ((SV*)padlist);
246 } 250 }
247} 251}
248#endif 252
253STATIC int
254coro_cv_free (SV *sv, MAGIC *mg)
255{
256 AV *padlist;
257 AV *av = (AV *)mg->mg_obj;
258
259 /* casting is fun. */
260 while (&PL_sv_undef != (SV *)(padlist = (AV *)av_pop (av)))
261 free_padlist (padlist);
262}
263
264#define PERL_MAGIC_coro PERL_MAGIC_ext
265
266static MGVTBL vtbl_coro = {0, 0, 0, 0, coro_cv_free};
249 267
250/* the next two functions merely cache the padlists */ 268/* the next two functions merely cache the padlists */
251STATIC void 269STATIC void
252get_padlist (CV *cv) 270get_padlist (CV *cv)
253{ 271{
254 SV **he = hv_fetch (padlist_cache, (void *)&cv, sizeof (CV *), 0); 272 MAGIC *mg = mg_find ((SV *)cv, PERL_MAGIC_coro);
255 273
256 if (he && AvFILLp ((AV *)*he) >= 0) 274 if (mg && AvFILLp ((AV *)mg->mg_obj) >= 0)
257 CvPADLIST (cv) = (AV *)av_pop ((AV *)*he); 275 CvPADLIST (cv) = (AV *)av_pop ((AV *)mg->mg_obj);
258 else 276 else
259 CvPADLIST (cv) = clone_padlist (CvPADLIST (cv)); 277 CvPADLIST (cv) = clone_padlist (CvPADLIST (cv));
260} 278}
261 279
262STATIC void 280STATIC void
263put_padlist (CV *cv) 281put_padlist (CV *cv)
264{ 282{
265 SV **he = hv_fetch (padlist_cache, (void *)&cv, sizeof (CV *), 1); 283 MAGIC *mg = mg_find ((SV *)cv, PERL_MAGIC_coro);
266 284
267 if (SvTYPE (*he) != SVt_PVAV) 285 if (!mg)
268 { 286 {
269 SvREFCNT_dec (*he); 287 sv_magic ((SV *)cv, 0, PERL_MAGIC_coro, 0, 0);
288 mg = mg_find ((SV *)cv, PERL_MAGIC_coro);
289 mg->mg_virtual = &vtbl_coro;
270 *he = (SV *)newAV (); 290 mg->mg_obj = (SV *)newAV ();
271 } 291 }
272 292
273 av_push ((AV *)*he, (SV *)CvPADLIST (cv)); 293 av_push ((AV *)mg->mg_obj, (SV *)CvPADLIST (cv));
274} 294}
275
276#ifdef MAY_FLUSH
277STATIC void
278flush_padlist_cache ()
279{
280 HV *hv = padlist_cache;
281 padlist_cache = newHV ();
282
283 if (hv_iterinit (hv))
284 {
285 HE *he;
286 AV *padlist;
287
288 while (!!(he = hv_iternext (hv)))
289 {
290 AV *av = (AV *)HeVAL(he);
291
292 /* casting is fun. */
293 while (&PL_sv_undef != (SV *)(padlist = (AV *)av_pop (av)))
294 free_padlist (padlist);
295 }
296 }
297
298 SvREFCNT_dec (hv);
299}
300#endif
301 295
302#define SB do { 296#define SB do {
303#define SE } while (0) 297#define SE } while (0)
304 298
305#define LOAD(state) load_state(aTHX_ (state)); 299#define LOAD(state) load_state(aTHX_ (state));
518 PL_retstack_max = 8; 512 PL_retstack_max = 8;
519} 513}
520 514
521/* 515/*
522 * destroy the stacks, the callchain etc... 516 * destroy the stacks, the callchain etc...
523 * still there is a memleak of 128 bytes...
524 */ 517 */
525STATIC void 518STATIC void
526destroy_stacks(pTHX) 519destroy_stacks(pTHX)
527{ 520{
528 if (!IN_DESTRUCT) 521 if (!IN_DESTRUCT)
584 stack->sptr = mmap (0, stack->ssize, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0); 577 stack->sptr = mmap (0, stack->ssize, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);
585 if (stack->sptr == (void *)-1) 578 if (stack->sptr == (void *)-1)
586#endif 579#endif
587 { 580 {
588 /*FIXME*//*D*//* reasonable stack size! */ 581 /*FIXME*//*D*//* reasonable stack size! */
589 stack->ssize = -4096 * sizeof (long); 582 stack->ssize = - (16384 * sizeof (long));
590 New (0, stack->sptr, 4096, long); 583 New (0, stack->sptr, 16384, long);
591 } 584 }
592 } 585 }
593 else 586 else
594 stack->sptr = 0; 587 stack->sptr = 0;
595 588
1009 deallocate_stack (coro); 1002 deallocate_stack (coro);
1010 SvREFCNT_dec (coro->args); 1003 SvREFCNT_dec (coro->args);
1011 Safefree (coro); 1004 Safefree (coro);
1012 1005
1013void 1006void
1014flush()
1015 CODE:
1016#ifdef MAY_FLUSH
1017 flush_padlist_cache ();
1018#endif
1019
1020void
1021_exit(code) 1007_exit(code)
1022 int code 1008 int code
1023 PROTOTYPE: $ 1009 PROTOTYPE: $
1024 CODE: 1010 CODE:
1025#if defined(__GLIBC__) || _POSIX_C_SOURCE 1011#if defined(__GLIBC__) || _POSIX_C_SOURCE
1095 sv_setiv(sv, (IV)&coroapi); 1081 sv_setiv(sv, (IV)&coroapi);
1096 SvREADONLY_on(sv); 1082 SvREADONLY_on(sv);
1097 } 1083 }
1098} 1084}
1099 1085
1086#if !PERL_MICRO
1087
1100void 1088void
1101ready(self) 1089ready(self)
1102 SV * self 1090 SV * self
1103 PROTOTYPE: $ 1091 PROTOTYPE: $
1104 CODE: 1092 CODE:
1105 api_ready (self); 1093 api_ready (self);
1094
1095#endif
1106 1096
1107int 1097int
1108nready(...) 1098nready(...)
1109 PROTOTYPE: 1099 PROTOTYPE:
1110 CODE: 1100 CODE:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines