#define __PACKAGE__ "Variable::Magic"
-#define R(S) fprintf(stderr, "R(" #S ") = %d\n", SvREFCNT(S))
-
#define PERL_VERSION_GE(R, V, S) (PERL_REVISION > (R) || (PERL_REVISION == (R) && (PERL_VERSION > (V) || (PERL_VERSION == (V) && (PERL_SUBVERSION >= (S))))))
#define PERL_VERSION_LE(R, V, S) (PERL_REVISION < (R) || (PERL_REVISION == (R) && (PERL_VERSION < (V) || (PERL_VERSION == (V) && (PERL_SUBVERSION <= (S))))))
#define VMG_HAS_PERL_AND(P, R, V, S) (PERL_VERSION_GE((R), (V), (S)) && (!VMG_PERL_PATCHLEVEL || (VMG_PERL_PATCHLEVEL >= (P))))
-/* --- Compatibility ------------------------------------------------------- */
+/* --- Threads and multiplicity -------------------------------------------- */
-#ifndef Newx
-# define Newx(v, n, c) New(0, v, n, c)
+#ifndef NOOP
+# define NOOP
#endif
-#ifndef SvMAGIC_set
-# define SvMAGIC_set(sv, val) (SvMAGIC(sv) = (val))
+#ifndef dNOOP
+# define dNOOP
#endif
-#ifndef mPUSHi
-# define mPUSHi(I) PUSHs(sv_2mortal(newSViv(I)))
+#if defined(MULTIPLICITY) || defined(PERL_IMPLICIT_CONTEXT)
+# define VMG_MULTIPLICITY 1
+# ifndef tTHX
+# define tTHX PerlInterpreter*
+# endif
+#else
+# define VMG_MULTIPLICITY 0
#endif
-#ifndef dMY_CXT
-# define dMY_CXT
+#if VMG_MULTIPLICITY && defined(dMY_CXT) && defined(MY_CXT) && defined(START_MY_CXT) && defined(MY_CXT_INIT) && defined(MY_CXT_CLONE)
+# define VMG_THREADSAFE 1
+#else
+# define VMG_THREADSAFE 0
+# undef dMY_CXT
+# define dMY_CXT dNOOP
# undef MY_CXT
# define MY_CXT vmg_globaldata
# undef START_MY_CXT
# define START_MY_CXT STATIC my_cxt_t MY_CXT;
# undef MY_CXT_INIT
-# define MY_CXT_INIT
+# define MY_CXT_INIT NOOP
# undef MY_CXT_CLONE
-# undef aMY_CXT
-# undef pMY_CXT
-# define VMG_THREADSAFE 0
-#else
-# define VMG_THREADSAFE 1
+# define MY_CXT_CLONE NOOP
+#endif
+
+/* --- Compatibility ------------------------------------------------------- */
+
+#ifndef Newx
+# define Newx(v, n, c) New(0, v, n, c)
+#endif
+
+#ifndef SvMAGIC_set
+# define SvMAGIC_set(sv, val) (SvMAGIC(sv) = (val))
+#endif
+
+#ifndef mPUSHi
+# define mPUSHi(I) PUSHs(sv_2mortal(newSViv(I)))
#endif
#ifndef PERL_MAGIC_ext
MGWIZ *w;
dMY_CXT;
+ if (PL_dirty) /* during global destruction, the context is already freed */
+ return 0;
+
w = SV2MGWIZ(wiz);
if (hv_delete(MY_CXT.wizz, buf, sprintf(buf, "%u", w->sig), 0)) {
#endif /* VMG_UVAR */
sv = MGWIZ2SV(w);
- mg = sv_magicext(sv, NULL, PERL_MAGIC_ext, &vmg_wizard_vtbl, NULL, -1);
+ mg = sv_magicext(sv, NULL, PERL_MAGIC_ext, &vmg_wizard_vtbl, NULL, 0);
mg->mg_private = SIG_WIZ;
+ SvREADONLY_on(sv);
hv_store(MY_CXT.wizz, buf, sprintf(buf, "%u", sig), sv, 0);
++MY_CXT.count;