X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=sharedsv.c;h=e4b6e0ff36c0961905b751b673a57a050ae740ed;hb=23fb6509afc63cde7930e13c21f5617c860fa149;hp=dde115329069d588f2cc26f108455eef1231bb22;hpb=55fc11ad574fdface3f93a0c10965511fdcfd69b;p=p5sagit%2Fp5-mst-13.2.git diff --git a/sharedsv.c b/sharedsv.c index dde1153..e4b6e0f 100644 --- a/sharedsv.c +++ b/sharedsv.c @@ -89,12 +89,24 @@ Perl_sharedsv_find(pTHX_ SV* sv) 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); - } + 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; } @@ -103,7 +115,7 @@ Perl_sharedsv_find(pTHX_ SV* sv) =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 @@ -206,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; }