#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);
}
/*
COND_INIT(&ssv->user_cond);
ssv->owner = 0;
ssv->locks = 0;
+ ssv->index = 0;
return ssv;
}
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:
+ case SVt_PVAV:
+ case SVt_PVHV: {
+ MAGIC* mg = mg_find(sv, PERL_MAGIC_ext);
+ if(mg) {
+ if(strcmp(mg->mg_ptr,"threads::shared"))
+ break;
+ ssv = INT2PTR(shared_sv *, SvIV(mg->mg_obj));
+ break;
+ }
+
+ mg = mg_find(sv,PERL_MAGIC_tied);
+ if(mg) {
+ SV* obj = SvTIED_obj(sv,mg);
+ if(sv_derived_from(obj, "threads::shared"))
+ ssv = INT2PTR(shared_sv *, SvIV(SvRV(obj)));
+ break;
+ }
+ }
+ }
return ssv;
}
=for apidoc sharedsv_lock
Recursive locks on a sharedsv.
-Locks are dynamicly scoped at the level of the first lock.
+Locks are dynamically scoped at the level of the first lock.
=cut
*/
void
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)) {
while (items-- > 0) {
if(SvTYPE(*src_ary))
- Perl_sharedsv_thrcnt_dec(aTHX_ INT2PTR(shared_sv *, SvIV(*src_ary++)));
+ Perl_sharedsv_thrcnt_dec(aTHX_ INT2PTR(shared_sv *, SvIV(*src_ary)));
+ src_ary++;
}
break;
}
}
}
}
- SvREFCNT_dec(sv);
- SHAREDSvRELEASE(ssv);
+ Perl_sv_free(PL_sharedsv_space,SHAREDSvGET(ssv));
+ SHAREDSvUNLOCK(ssv);
}
#endif /* USE_ITHREADS */