#ifdef USE_ITHREADS
-PerlInterpreter* sharedsv_space;
-perl_mutex sharedsv_space_mutex;
+
/*
Shared SV
void
Perl_sharedsv_init(pTHX)
{
- sharedsv_space = PERL_GET_CONTEXT;
- MUTEX_INIT(&sharedsv_space_mutex);
+ PerlInterpreter* old_context = PERL_GET_CONTEXT;
+ PL_sharedsv_space = perl_alloc();
+ perl_construct(PL_sharedsv_space);
+ PERL_SET_CONTEXT(old_context);
+ MUTEX_INIT(&PL_sharedsv_space_mutex);
}
/*
shared_sv *
Perl_sharedsv_find(pTHX_ SV* sv)
{
- /* does all it can to find a shared_sv struct, returns NULL otherwise */
- shared_sv* ssv = NULL;
+ /* does all it can to find a shared_sv struct, returns NULL otherwise */
+ shared_sv* ssv = NULL;
+ switch (SvTYPE(sv)) {
+ case SVt_PVMG:
+ {MAGIC* mg = mg_find(sv, PERL_MAGIC_ext);
+
+ if(strcmp(mg->mg_ptr,"threads::shared"))
+ break;
+ ssv = (shared_sv*) SvIV(mg->mg_obj);
+ }
+ }
return ssv;
}
void
Perl_sharedsv_thrcnt_inc(pTHX_ shared_sv* ssv)
{
- SHAREDSvEDIT(ssv);
+ SHAREDSvLOCK(ssv);
SvREFCNT_inc(ssv->sv);
- SHAREDSvRELEASE(ssv);
+ SHAREDSvUNLOCK(ssv);
}
/*
Perl_sharedsv_thrcnt_dec(pTHX_ shared_sv* ssv)
{
SV* sv;
- SHAREDSvEDIT(ssv);
+ SHAREDSvLOCK(ssv);
sv = SHAREDSvGET(ssv);
if (SvREFCNT(sv) == 1) {
switch (SvTYPE(sv)) {
}
}
}
- SvREFCNT_dec(sv);
- SHAREDSvRELEASE(ssv);
+ Perl_sv_free(PL_sharedsv_space,SHAREDSvGET(ssv));
+ SHAREDSvUNLOCK(ssv);
}
#endif /* USE_ITHREADS */