#endif
#ifndef dMY_CXT
-# define MY_CXT vmg_globaldata
# define dMY_CXT
+# 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
+# undef MY_CXT_CLONE
+# undef aMY_CXT
+# undef pMY_CXT
+# define VMG_THREADSAFE 0
+#else
+# define VMG_THREADSAFE 1
#endif
#ifndef PERL_MAGIC_ext
START_MY_CXT
+STATIC void vmg_cxt_init
+#if defined(pMY_CXT) && defined(aMY_CXT)
+ (pTHX_ pMY_CXT) {
+# define vmg_cxt_init() vmg_cxt_init(aTHX_ aMY_CXT)
+#else
+ (pTHX) {
+ dMY_CXT;
+# define vmg_cxt_init() vmg_cxt_init(aTHX)
+#endif
+ MY_CXT.wizz = newHV();
+#ifdef USE_ITHREADS
+ HvSHAREKEYS_off(MY_CXT.wizz);
+#endif
+ MY_CXT.count = 0;
+ return;
+}
+
/* --- Signatures ---------------------------------------------------------- */
#define SIG_MIN ((U16) (1u << 8))
STATIC SV *vmg_data_new(pTHX_ SV *ctor, SV *sv, AV *args) {
#define vmg_data_new(C, S, A) vmg_data_new(aTHX_ (C), (S), (A))
SV *nsv;
+ I32 i, alen = (args == NULL) ? 0 : av_len(args);
dSP;
int count;
SAVETMPS;
PUSHMARK(SP);
- XPUSHs(sv_2mortal(newRV_inc(sv)));
- if (args != NULL) {
- I32 i, alen = av_len(args);
- for (i = 0; i < alen; ++i) { XPUSHs(*av_fetch(args, i, 0)); }
- }
+ EXTEND(SP, alen + 1);
+ PUSHs(sv_2mortal(newRV_inc(sv)));
+ for (i = 0; i < alen; ++i)
+ PUSHs(*av_fetch(args, i, 0));
PUTBACK;
count = call_sv(ctor, G_SCALAR);
data = (w->cb_data) ? vmg_data_new(w->cb_data, sv, args) : NULL;
mg = sv_magicext(sv, data, PERL_MAGIC_ext, w->vtbl, (const char *) wiz, HEf_SVKEY);
mg->mg_private = w->sig;
- mg->mg_flags = mg->mg_flags
#if MGf_COPY
- | MGf_COPY
+ if (w->cb_copy)
+ mg->mg_flags |= MGf_COPY;
#endif /* MGf_COPY */
#if MGf_DUP
- | MGf_DUP
+ if (w->cb_dup)
+ mg->mg_flags |= MGf_DUP;
#endif /* MGf_DUP */
#if MGf_LOCAL
- | MGf_LOCAL
+ if (w->cb_local)
+ mg->mg_flags |= MGf_LOCAL;
#endif /* MGf_LOCAL */
- ;
#if VMG_UVAR
if (w->uvar && SvTYPE(sv) >= SVt_PVHV) {
{
HV *stash;
MY_CXT_INIT;
- MY_CXT.wizz = newHV();
- MY_CXT.count = 0;
+ vmg_cxt_init();
stash = gv_stashpv(__PACKAGE__, 1);
newCONSTSUB(stash, "SIG_MIN", newSVuv(SIG_MIN));
newCONSTSUB(stash, "SIG_MAX", newSVuv(SIG_MAX));
newCONSTSUB(stash, "VMG_COMPAT_SCALAR_LENGTH_NOLEN",
newSVuv(VMG_COMPAT_SCALAR_LENGTH_NOLEN));
newCONSTSUB(stash, "VMG_PERL_PATCHLEVEL", newSVuv(VMG_PERL_PATCHLEVEL));
+ newCONSTSUB(stash, "VMG_THREADSAFE", newSVuv(VMG_THREADSAFE));
}
+void
+CLONE(...)
+PROTOTYPE: DISABLE
+CODE:
+#ifdef MY_CXT_CLONE
+ MY_CXT_CLONE;
+ vmg_cxt_init();
+#endif
+
SV *_wizard(...)
PROTOTYPE: DISABLE
PREINIT:
hv_store(MY_CXT.wizz, buf, sprintf(buf, "%u", sig), sv, 0);
++MY_CXT.count;
-
+
RETVAL = newRV_noinc(sv);
OUTPUT:
RETVAL