X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Types.xs;h=4b3856225042fa8b68990568595565812b8cb535;hb=2217d97ba313979a7103df908a936b36a8c3f457;hp=b3412b55e66d8bf9f432121e169941724033a592;hpb=ddc623c3ccab687373e43b96910dce8be84f5d1c;p=perl%2Fmodules%2FLexical-Types.git diff --git a/Types.xs b/Types.xs index b3412b5..4b38562 100644 --- a/Types.xs +++ b/Types.xs @@ -284,9 +284,6 @@ STATIC SV *lt_tag(pTHX_ SV *value) { #define lt_tag(V) lt_tag(aTHX_ (V)) lt_hint_t *h; SV *code = NULL; -#if LT_THREADSAFE - dMY_CXT; -#endif if (SvROK(value)) { value = SvRV(value); @@ -307,10 +304,13 @@ STATIC SV *lt_tag(pTHX_ SV *value) { #endif /* !LT_HINT_STRUCT */ #if LT_THREADSAFE - /* We only need for the key to be an unique tag for looking up the value later. - * Allocated memory provides convenient unique identifiers, so that's why we - * use the hint as the key itself. */ - ptable_hints_store(MY_CXT.tbl, h, h); + { + dMY_CXT; + /* We only need for the key to be an unique tag for looking up the value later + * Allocated memory provides convenient unique identifiers, so that's why we + * use the hint as the key itself. */ + ptable_hints_store(MY_CXT.tbl, h, h); + } #endif /* LT_THREADSAFE */ return newSViv(PTR2IV(h)); @@ -373,8 +373,18 @@ STATIC SV *lt_hint(pTHX) { STATIC ptable *lt_op_map = NULL; #ifdef USE_ITHREADS + STATIC perl_mutex lt_op_map_mutex; -#endif + +#define LT_LOCK(M) MUTEX_LOCK(M) +#define LT_UNLOCK(M) MUTEX_UNLOCK(M) + +#else /* USE_ITHREADS */ + +#define LT_LOCK(M) +#define LT_UNLOCK(M) + +#endif /* !USE_ITHREADS */ typedef struct { #ifdef MULTIPLICITY @@ -392,9 +402,7 @@ STATIC void lt_map_store(pTHX_ const OP *o, SV *orig_pkg, SV *type_pkg, SV *type #define lt_map_store(O, OP, TP, TM, PP) lt_map_store(aTHX_ (O), (OP), (TP), (TM), (PP)) lt_op_info *oi; -#ifdef USE_ITHREADS - MUTEX_LOCK(<_op_map_mutex); -#endif + LT_LOCK(<_op_map_mutex); if (!(oi = ptable_fetch(lt_op_map, o))) { oi = PerlMemShared_malloc(sizeof *oi); @@ -443,17 +451,13 @@ STATIC void lt_map_store(pTHX_ const OP *o, SV *orig_pkg, SV *type_pkg, SV *type oi->old_pp_padsv = old_pp_padsv; -#ifdef USE_ITHREADS - MUTEX_UNLOCK(<_op_map_mutex); -#endif + LT_UNLOCK(<_op_map_mutex); } STATIC const lt_op_info *lt_map_fetch(const OP *o, lt_op_info *oi) { const lt_op_info *val; -#ifdef USE_ITHREADS - MUTEX_LOCK(<_op_map_mutex); -#endif + LT_LOCK(<_op_map_mutex); val = ptable_fetch(lt_op_map, o); if (val) { @@ -461,24 +465,18 @@ STATIC const lt_op_info *lt_map_fetch(const OP *o, lt_op_info *oi) { val = oi; } -#ifdef USE_ITHREADS - MUTEX_UNLOCK(<_op_map_mutex); -#endif + LT_UNLOCK(<_op_map_mutex); return val; } STATIC void lt_map_delete(pTHX_ const OP *o) { #define lt_map_delete(O) lt_map_delete(aTHX_ (O)) -#ifdef USE_ITHREADS - MUTEX_LOCK(<_op_map_mutex); -#endif + LT_LOCK(<_op_map_mutex); ptable_map_delete(lt_op_map, o); -#ifdef USE_ITHREADS - MUTEX_UNLOCK(<_op_map_mutex); -#endif + LT_UNLOCK(<_op_map_mutex); } /* --- Hooks --------------------------------------------------------------- */ @@ -562,12 +560,12 @@ STATIC OP *(*lt_old_ck_padany)(pTHX_ OP *) = 0; STATIC OP *lt_ck_padany(pTHX_ OP *o) { HV *stash; SV *code; - dMY_CXT; o = lt_old_ck_padany(aTHX_ o); stash = PL_in_my_stash; if (stash && (code = lt_hint())) { + dMY_CXT; SV *orig_pkg = newSVpvn(HvNAME_get(stash), HvNAMELEN_get(stash)); SV *orig_meth = MY_CXT.default_meth; SV *type_pkg = NULL; @@ -639,8 +637,6 @@ skip: STATIC OP *(*lt_old_ck_padsv)(pTHX_ OP *) = 0; STATIC OP *lt_ck_padsv(pTHX_ OP *o) { - dMY_CXT; - lt_map_delete(o); return lt_old_ck_padsv(aTHX_ o); @@ -678,17 +674,13 @@ LT_PEEP_REC_PROTO { switch (o->op_type) { case OP_PADSV: if (o->op_ppaddr != lt_pp_padsv && o->op_private & OPpLVAL_INTRO) { -#ifdef USE_ITHREADS - MUTEX_LOCK(<_op_map_mutex); -#endif + LT_LOCK(<_op_map_mutex); oi = ptable_fetch(lt_op_map, o); if (oi) { oi->old_pp_padsv = o->op_ppaddr; o->op_ppaddr = lt_pp_padsv; } -#ifdef USE_ITHREADS - MUTEX_UNLOCK(<_op_map_mutex); -#endif + LT_UNLOCK(<_op_map_mutex); } break; #if !LT_HAS_RPEEP @@ -749,8 +741,6 @@ STATIC void lt_peep(pTHX_ OP *o) { STATIC U32 lt_initialized = 0; STATIC void lt_teardown(pTHX_ void *root) { - dMY_CXT; - if (!lt_initialized) return; @@ -759,13 +749,16 @@ STATIC void lt_teardown(pTHX_ void *root) { return; #endif + { + dMY_CXT; #if LT_THREADSAFE - ptable_hints_free(MY_CXT.tbl); + ptable_hints_free(MY_CXT.tbl); #endif #if !LT_HAS_RPEEP - ptable_seen_free(MY_CXT.seen); + ptable_seen_free(MY_CXT.seen); #endif - SvREFCNT_dec(MY_CXT.default_meth); + SvREFCNT_dec(MY_CXT.default_meth); + } PL_check[OP_PADANY] = MEMBER_TO_FPTR(lt_old_ck_padany); lt_old_ck_padany = 0;