X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Types.xs;h=a8fb284c35a89b6f8379f04553f51f7f676a54fa;hb=420f91f3c4f8aa318ede84928eb7c671921500ea;hp=47f822274b0e001167923041bd8bc0cf4d8fbeda;hpb=6f58548bdd94477177ad27890b9d9f2f3e6cd42d;p=perl%2Fmodules%2FLexical-Types.git diff --git a/Types.xs b/Types.xs index 47f8222..a8fb284 100644 --- a/Types.xs +++ b/Types.xs @@ -39,12 +39,18 @@ # define SvREFCNT_inc_simple_NN SvREFCNT_inc #endif -#ifndef ENTER_with_name -# define ENTER_with_name(N) ENTER +#undef ENTERn +#if defined(ENTER_with_name) && !LT_HAS_PERL(5, 11, 4) +# define ENTERn(N) ENTER_with_name(N) +#else +# define ENTERn(N) ENTER #endif -#ifndef LEAVE_with_name -# define LEAVE_with_name(N) LEAVE +#undef LEAVEn +#if defined(LEAVE_with_name) && !LT_HAS_PERL(5, 11, 4) +# define LEAVEn(N) LEAVE_with_name(N) +#else +# define LEAVEn(N) LEAVE #endif /* ... Thread safety and multiplicity ...................................... */ @@ -210,21 +216,12 @@ STATIC void lt_ptable_hints_clone(pTHX_ ptable_ent *ent, void *ud_) { ptable_hints_store(ud->tbl, ent->key, h2); } -STATIC void lt_thread_cleanup(pTHX_ void *); +#include "reap.h" STATIC void lt_thread_cleanup(pTHX_ void *ud) { - int *level = ud; + dMY_CXT; - if (*level) { - *level = 0; - LEAVE; - SAVEDESTRUCTOR_X(lt_thread_cleanup, level); - ENTER; - } else { - dMY_CXT; - PerlMemShared_free(level); - ptable_hints_free(MY_CXT.tbl); - } + ptable_hints_free(MY_CXT.tbl); } #endif /* LT_THREADSAFE */ @@ -669,19 +666,21 @@ STATIC void lt_teardown(pTHX_ void *root) { lt_initialized = 0; } -STATIC lt_setup(pTHX) { +STATIC void lt_setup(pTHX) { #define lt_setup() lt_setup(aTHX) if (lt_initialized) return; - MY_CXT_INIT; + { + MY_CXT_INIT; #if LT_THREADSAFE - MY_CXT.tbl = ptable_new(); - MY_CXT.owner = aTHX; + MY_CXT.tbl = ptable_new(); + MY_CXT.owner = aTHX; #endif - MY_CXT.pp_padsv_saved = 0; - MY_CXT.default_meth = newSVpvn("TYPEDSCALAR", 11); - SvREADONLY_on(MY_CXT.default_meth); + MY_CXT.pp_padsv_saved = 0; + MY_CXT.default_meth = newSVpvn("TYPEDSCALAR", 11); + SvREADONLY_on(MY_CXT.default_meth); + } lt_old_ck_padany = PL_check[OP_PADANY]; PL_check[OP_PADANY] = MEMBER_TO_FPTR(lt_ck_padany); @@ -705,8 +704,8 @@ MODULE = Lexical::Types PACKAGE = Lexical::Types PROTOTYPES: ENABLE -BOOT: -{ +BOOT: +{ if (!lt_booted++) { HV *stash; @@ -731,9 +730,8 @@ CLONE(...) PROTOTYPE: DISABLE PREINIT: ptable *t; - int *level; SV *cloned_default_meth; -CODE: +PPCODE: { my_cxt_t ud; dMY_CXT; @@ -749,13 +747,8 @@ CODE: MY_CXT.pp_padsv_saved = 0; MY_CXT.default_meth = cloned_default_meth; } - { - level = PerlMemShared_malloc(sizeof *level); - *level = 1; - LEAVE_with_name("sub"); - SAVEDESTRUCTOR_X(lt_thread_cleanup, level); - ENTER_with_name("sub"); - } + reap(3, lt_thread_cleanup, NULL); + XSRETURN(0); #endif