X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=sharedsv.c;h=755481e2a3b4a0c29d7cc5bd87dabc0f23e66594;hb=91af766ac8815630662ce7fde84b165de512e80f;hp=d03443c72d259fc6099a5ce1b89654fcd3d29d14;hpb=4f896ddced4dda29739348c5b97bf4f1d7cd7e11;p=p5sagit%2Fp5-mst-13.2.git diff --git a/sharedsv.c b/sharedsv.c index d03443c..755481e 100644 --- a/sharedsv.c +++ b/sharedsv.c @@ -44,8 +44,11 @@ currently only stores a pointer to the first interpreter. void Perl_sharedsv_init(pTHX) { - PL_sharedsv_space = PERL_GET_CONTEXT; - MUTEX_INIT(&PL_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); } /* @@ -65,6 +68,7 @@ Perl_sharedsv_new(pTHX) COND_INIT(&ssv->user_cond); ssv->owner = 0; ssv->locks = 0; + ssv->index = 0; return ssv; } @@ -81,8 +85,29 @@ looking at magic, or by checking if it is tied again threads::shared. 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; } @@ -161,9 +186,9 @@ Increments the threadcount of a sharedsv. void Perl_sharedsv_thrcnt_inc(pTHX_ shared_sv* ssv) { - SHAREDSvEDIT(ssv); + SHAREDSvLOCK(ssv); SvREFCNT_inc(ssv->sv); - SHAREDSvRELEASE(ssv); + SHAREDSvUNLOCK(ssv); } /* @@ -179,7 +204,7 @@ void Perl_sharedsv_thrcnt_dec(pTHX_ shared_sv* ssv) { SV* sv; - SHAREDSvEDIT(ssv); + SHAREDSvLOCK(ssv); sv = SHAREDSvGET(ssv); if (SvREFCNT(sv) == 1) { switch (SvTYPE(sv)) { @@ -193,7 +218,8 @@ Perl_sharedsv_thrcnt_dec(pTHX_ shared_sv* ssv) 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; } @@ -208,8 +234,8 @@ Perl_sharedsv_thrcnt_dec(pTHX_ shared_sv* ssv) } } } - SvREFCNT_dec(sv); - SHAREDSvRELEASE(ssv); + Perl_sv_free(PL_sharedsv_space,SHAREDSvGET(ssv)); + SHAREDSvUNLOCK(ssv); } #endif /* USE_ITHREADS */