X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2Findirect.git;a=blobdiff_plain;f=indirect.xs;h=a38186e3968ed110bc388fb075bf9437337c22e8;hp=53cff20b16bddf792a5d0245cd10e7ab317fb807;hb=7724326af5714845b7de9dd6ded67536f96ac2fc;hpb=d237f88f7fb8be8d6836157872d5bf2b9ba02beb diff --git a/indirect.xs b/indirect.xs index 53cff20..a38186e 100644 --- a/indirect.xs +++ b/indirect.xs @@ -59,6 +59,14 @@ # define HvNAMELEN_get(H) strlen(HvNAME_get(H)) #endif +#ifndef ENTER_with_name +# define ENTER_with_name(N) ENTER +#endif + +#ifndef LEAVE_with_name +# define LEAVE_with_name(N) LEAVE +#endif + #define I_HAS_PERL(R, V, S) (PERL_REVISION > (R) || (PERL_REVISION == (R) && (PERL_VERSION > (V) || (PERL_VERSION == (V) && (PERL_SUBVERSION >= (S)))))) #if I_HAS_PERL(5, 10, 0) || defined(PL_parser) @@ -95,6 +103,11 @@ /* ... Thread safety and multiplicity ...................................... */ +/* Safe unless stated otherwise in Makefile.PL */ +#ifndef I_FORKSAFE +# define I_FORKSAFE 1 +#endif + #ifndef I_MULTIPLICITY # if defined(MULTIPLICITY) || defined(PERL_IMPLICIT_CONTEXT) # define I_MULTIPLICITY 1 @@ -136,8 +149,8 @@ #if I_WORKAROUND_REQUIRE_PROPAGATION typedef struct { - SV *code; - I32 requires; + SV *code; + IV cxreq; } indirect_hint_t; #define I_HINT_STRUCT 1 @@ -251,11 +264,11 @@ STATIC void indirect_ptable_clone(pTHX_ ptable_ent *ent, void *ud_) { #if I_HINT_STRUCT - h2 = PerlMemShared_malloc(sizeof *h2); - h2->code = indirect_clone(h1->code, ud->owner); + h2 = PerlMemShared_malloc(sizeof *h2); + h2->code = indirect_clone(h1->code, ud->owner); SvREFCNT_inc(h2->code); #if I_WORKAROUND_REQUIRE_PROPAGATION - h2->requires = h1->requires; + h2->cxreq = h1->cxreq; #endif #else /* I_HINT_STRUCT */ @@ -288,6 +301,26 @@ STATIC void indirect_thread_cleanup(pTHX_ void *ud) { #endif /* I_THREADSAFE */ +#if I_WORKAROUND_REQUIRE_PROPAGATION +STATIC IV indirect_require_tag(pTHX) { +#define indirect_require_tag() indirect_require_tag(aTHX) + const PERL_SI *si; + + for (si = PL_curstackinfo; si; si = si->si_prev) { + I32 cxix; + + for (cxix = si->si_cxix; cxix >= 0; --cxix) { + const PERL_CONTEXT *cx = si->si_cxstack + cxix; + + if (CxTYPE(cx) == CXt_EVAL && cx->blk_eval.old_op_type == OP_REQUIRE) + return PTR2IV(cx); + } + } + + return PTR2IV(NULL); +} +#endif /* I_WORKAROUND_REQUIRE_PROPAGATION */ + STATIC SV *indirect_tag(pTHX_ SV *value) { #define indirect_tag(V) indirect_tag(aTHX_ (V)) indirect_hint_t *h; @@ -304,28 +337,10 @@ STATIC SV *indirect_tag(pTHX_ SV *value) { #if I_HINT_STRUCT h = PerlMemShared_malloc(sizeof *h); - h->code = code; - -#if I_WORKAROUND_REQUIRE_PROPAGATION - { - const PERL_SI *si; - I32 requires = 0; - - for (si = PL_curstackinfo; si; si = si->si_prev) { - I32 cxix; - - for (cxix = si->si_cxix; cxix >= 0; --cxix) { - const PERL_CONTEXT *cx = si->si_cxstack + cxix; - - if (CxTYPE(cx) == CXt_EVAL && cx->blk_eval.old_op_type == OP_REQUIRE) - ++requires; - } - } - - h->requires = requires; - } -#endif /* I_WORKAROUND_REQUIRE_PROPAGATION */ - + h->code = code; +# if I_WORKAROUND_REQUIRE_PROPAGATION + h->cxreq = indirect_require_tag(); +# endif /* I_WORKAROUND_REQUIRE_PROPAGATION */ #else /* I_HINT_STRUCT */ h = code; #endif /* !I_HINT_STRUCT */ @@ -354,22 +369,8 @@ STATIC SV *indirect_detag(pTHX_ const SV *hint) { #endif /* I_THREADSAFE */ #if I_WORKAROUND_REQUIRE_PROPAGATION - { - const PERL_SI *si; - I32 requires = 0; - - for (si = PL_curstackinfo; si; si = si->si_prev) { - I32 cxix; - - for (cxix = si->si_cxix; cxix >= 0; --cxix) { - const PERL_CONTEXT *cx = si->si_cxstack + cxix; - - if (CxTYPE(cx) == CXt_EVAL && cx->blk_eval.old_op_type == OP_REQUIRE - && ++requires > h->requires) - return NULL; - } - } - } + if (indirect_require_tag() != h->cxreq) + return NULL; #endif /* I_WORKAROUND_REQUIRE_PROPAGATION */ return I_HINT_CODE(h); @@ -768,7 +769,6 @@ done: STATIC U32 indirect_initialized = 0; STATIC void indirect_teardown(pTHX_ void *root) { -#define indirect_teardown() indirect_teardown(aTHX) dMY_CXT; if (!indirect_initialized) @@ -858,6 +858,7 @@ BOOT: stash = gv_stashpvn(__PACKAGE__, __PACKAGE_LEN__, 1); newCONSTSUB(stash, "I_THREADSAFE", newSVuv(I_THREADSAFE)); + newCONSTSUB(stash, "I_FORKSAFE", newSVuv(I_FORKSAFE)); } indirect_setup(); @@ -889,9 +890,9 @@ CODE: { level = PerlMemShared_malloc(sizeof *level); *level = 1; - LEAVE; + LEAVE_with_name("sub"); SAVEDESTRUCTOR_X(indirect_thread_cleanup, level); - ENTER; + ENTER_with_name("sub"); } #endif