X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Magic.xs;h=caff817b84c869d0d76fd6a63c9e0e9fe7c8d4f8;hb=cb678e6b73356092edce6d42b76f3d667f95d7c4;hp=1920c7880c80540256905bd955aab2381969ba9b;hpb=110ed6888ddf13f751e5ee0de5b0d8188e2f956e;p=perl%2Fmodules%2FVariable-Magic.git diff --git a/Magic.xs b/Magic.xs index 1920c78..caff817 100644 --- a/Magic.xs +++ b/Magic.xs @@ -490,6 +490,22 @@ STATIC void vmg_ptable_clone(pTHX_ ptable_ent *ent, void *ud_) { ptable_store(ud->wizards, ent->key, w); } +STATIC void vmg_thread_cleanup(pTHX_ void *); + +STATIC void vmg_thread_cleanup(pTHX_ void *ud) { + int *level = ud; + + if (*level) { + --*level; + LEAVE; + SAVEDESTRUCTOR_X(vmg_thread_cleanup, level); + ENTER; + } else { + dMY_CXT; + PerlMemShared_free(level); + ptable_free(MY_CXT.wizards); + } +} #endif /* VMG_THREADSAFE */ /* --- Wizard objects ------------------------------------------------------ */ @@ -1294,10 +1310,9 @@ CLONE(...) PROTOTYPE: DISABLE PREINIT: ptable *t; - int *level; U32 had_b__op_stash = 0; opclass c; -CODE: +PPCODE: { my_cxt_t ud; dMY_CXT; @@ -1320,6 +1335,15 @@ CODE: ? gv_stashpv(vmg_opclassnames[c], 1) : NULL; } } + { + int *level; + level = PerlMemShared_malloc(sizeof *level); + *level = 1; + LEAVE; + SAVEDESTRUCTOR_X(vmg_thread_cleanup, level); + ENTER; + } + XSRETURN(0); #endif /* VMG_THREADSAFE */ @@ -1327,11 +1351,8 @@ SV *_wizard(...) PROTOTYPE: DISABLE PREINIT: I32 i = 0; - char buf[8]; MGWIZ *w; MGVTBL *t; - MAGIC *mg; - SV *wiz; SV *cb; CODE: dMY_CXT; @@ -1437,8 +1458,6 @@ PPCODE: SV *dispell(SV *sv, SV *wiz) PROTOTYPE: \[$@%&*]$ -PREINIT: - U16 sig; CODE: wiz = vmg_wizard_validate(wiz); RETVAL = newSVuv(vmg_dispell(SvRV(sv), wiz));