X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Magic.xs;h=e9d9debe0c20c2d17b671d64682ef46be9d52aac;hb=refs%2Ftags%2Fv0.32;hp=1fa63548e2a8bf86143010a61241fa57f3b57dfe;hpb=bc19b982e9997eb17ddf75dc235c0c6ac52d07bf;p=perl%2Fmodules%2FVariable-Magic.git diff --git a/Magic.xs b/Magic.xs index 1fa6354..e9d9deb 100644 --- a/Magic.xs +++ b/Magic.xs @@ -89,10 +89,6 @@ STATIC SV *vmg_clone(pTHX_ SV *sv, tTHX owner) { # define Newx(v, n, c) New(0, v, n, c) #endif -#ifndef NewOp -# define NewOp(m, var, c, type) Newz(m, var, c, type) -#endif - #ifndef SvMAGIC_set # define SvMAGIC_set(sv, val) (SvMAGIC(sv) = (val)) #endif @@ -627,6 +623,10 @@ STATIC UV vmg_dispell(pTHX_ SV *sv, U16 sig) { #define VMG_OP_INFO_NAME 1 #define VMG_OP_INFO_OBJECT 2 +#if VMG_THREADSAFE +STATIC perl_mutex vmg_op_name_init_mutex; +#endif + STATIC U32 vmg_op_name_init = 0; STATIC unsigned char vmg_op_name_len[MAXO] = { 0 }; @@ -634,12 +634,18 @@ STATIC void vmg_op_info_init(pTHX_ unsigned int opinfo) { #define vmg_op_info_init(W) vmg_op_info_init(aTHX_ (W)) switch (opinfo) { case VMG_OP_INFO_NAME: +#if VMG_THREADSAFE + MUTEX_LOCK(&vmg_op_name_init_mutex); +#endif if (!vmg_op_name_init) { OPCODE t; for (t = 0; t < OP_max; ++t) vmg_op_name_len[t] = strlen(PL_op_name[t]); vmg_op_name_init = 1; } +#if VMG_THREADSAFE + MUTEX_UNLOCK(&vmg_op_name_init_mutex); +#endif break; case VMG_OP_INFO_OBJECT: { dMY_CXT; @@ -1095,7 +1101,7 @@ STATIC U16 vmg_wizard_sig(pTHX_ SV *wiz) { { dMY_CXT; - if (!hv_fetch(MY_CXT.wizards, buf, sprintf(buf, "%u", sig), 0)) + if (!hv_exists(MY_CXT.wizards, buf, sprintf(buf, "%u", sig))) croak(vmg_invalid_wiz); } @@ -1203,6 +1209,10 @@ BOOT: MY_CXT.wizards = newHV(); hv_iterinit(MY_CXT.wizards); /* Allocate iterator */ MY_CXT.b__op_stashes[0] = NULL; +#if VMG_THREADSAFE + MUTEX_INIT(&vmg_op_name_init_mutex); +#endif + stash = gv_stashpv(__PACKAGE__, 1); newCONSTSUB(stash, "SIG_MIN", newSVuv(SIG_MIN)); newCONSTSUB(stash, "SIG_MAX", newSVuv(SIG_MAX));