X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=sharedsv.c;h=e4b6e0ff36c0961905b751b673a57a050ae740ed;hb=7607c2656ded0887feae5b11099e95289f89b6a8;hp=0deabb23ab756f4f5fc543f329c8584874bc3b49;hpb=b050c948e7b63d3513ca9c148115d3ea439bf57f;p=p5sagit%2Fp5-mst-13.2.git diff --git a/sharedsv.c b/sharedsv.c index 0deabb2..e4b6e0f 100644 --- a/sharedsv.c +++ b/sharedsv.c @@ -68,6 +68,7 @@ Perl_sharedsv_new(pTHX) COND_INIT(&ssv->user_cond); ssv->owner = 0; ssv->locks = 0; + ssv->index = 0; return ssv; } @@ -88,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; } @@ -102,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 @@ -205,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; }