develooper Front page | perl.perl5.porters | Postings from June 2001

[PATCH] CLONE && weakrefs

Thread Next
From:
Artur Bergman
Date:
June 29, 2001 08:02
Subject:
[PATCH] CLONE && weakrefs
Message ID:
B7626508.1CA0%artur@contiller.se
I finally came around trying these things again for threads::shared.

This fixes the refcount of the referant but not the weakref. Somehow the
refcount of the weakref gets incremented by one too many. I suspect the
backref magic is misfiring somehow but I haven't been able to spot it more
closely. Will come in with a second patch that fixes the reference counting
in the other direction.

Artur

--- sv.c.old    Thu Jun 28 13:39:56 2001
+++ sv.c    Fri Jun 29 16:53:52 2001
@@ -8714,7 +8714,7 @@
     break;
     case SVt_RV:
     SvANY(dstr)    = new_XRV();
-    SvRV(dstr)    = SvRV(sstr) && SvWEAKREF(SvRV(sstr))
+    SvRV(dstr)    = SvRV(sstr) && SvWEAKREF(sstr)
             ? sv_dup(SvRV(sstr), param)
             : sv_dup_inc(SvRV(sstr), param);
     break;
@@ -8723,7 +8723,7 @@
     SvCUR(dstr)    = SvCUR(sstr);
     SvLEN(dstr)    = SvLEN(sstr);
     if (SvROK(sstr))
-        SvRV(dstr)    = SvWEAKREF(SvRV(sstr))
+        SvRV(dstr)    = SvWEAKREF(sstr)
             ? sv_dup(SvRV(sstr), param)
             : sv_dup_inc(SvRV(sstr), param);
     else if (SvPVX(sstr) && SvLEN(sstr))
@@ -8737,7 +8737,7 @@
     SvLEN(dstr)    = SvLEN(sstr);
     SvIVX(dstr)    = SvIVX(sstr);
     if (SvROK(sstr))
-        SvRV(dstr)    = SvWEAKREF(SvRV(sstr))
+        SvRV(dstr)    = SvWEAKREF(sstr)
             ? sv_dup(SvRV(sstr), param)
             : sv_dup_inc(SvRV(sstr), param);
     else if (SvPVX(sstr) && SvLEN(sstr))
@@ -8752,7 +8752,7 @@
     SvIVX(dstr)    = SvIVX(sstr);
     SvNVX(dstr)    = SvNVX(sstr);
     if (SvROK(sstr))
-        SvRV(dstr)    = SvWEAKREF(SvRV(sstr))
+        SvRV(dstr)    = SvWEAKREF(sstr)
             ? sv_dup(SvRV(sstr), param)
             : sv_dup_inc(SvRV(sstr), param);
     else if (SvPVX(sstr) && SvLEN(sstr))
@@ -8769,7 +8769,7 @@
     SvMAGIC(dstr)    = mg_dup(SvMAGIC(sstr), param);
     SvSTASH(dstr)    = hv_dup_inc(SvSTASH(sstr), param);
     if (SvROK(sstr))
-        SvRV(dstr)    = SvWEAKREF(SvRV(sstr))
+        SvRV(dstr)    = SvWEAKREF(sstr)
             ? sv_dup(SvRV(sstr), param)
             : sv_dup_inc(SvRV(sstr), param);
     else if (SvPVX(sstr) && SvLEN(sstr))
@@ -8786,7 +8786,7 @@
     SvMAGIC(dstr)    = mg_dup(SvMAGIC(sstr), param);
     SvSTASH(dstr)    = hv_dup_inc(SvSTASH(sstr), param);
     if (SvROK(sstr))
-        SvRV(dstr)    = SvWEAKREF(SvRV(sstr))
+        SvRV(dstr)    = SvWEAKREF(sstr)
             ? sv_dup(SvRV(sstr), param)
             : sv_dup_inc(SvRV(sstr), param);
     else if (SvPVX(sstr) && SvLEN(sstr))
@@ -8806,7 +8806,7 @@
     SvMAGIC(dstr)    = mg_dup(SvMAGIC(sstr), param);
     SvSTASH(dstr)    = hv_dup_inc(SvSTASH(sstr), param);
     if (SvROK(sstr))
-        SvRV(dstr)    = SvWEAKREF(SvRV(sstr))
+        SvRV(dstr)    = SvWEAKREF(sstr)
             ? sv_dup(SvRV(sstr), param)
             : sv_dup_inc(SvRV(sstr), param);
     else if (SvPVX(sstr) && SvLEN(sstr))
@@ -8839,7 +8839,7 @@
     SvMAGIC(dstr)    = mg_dup(SvMAGIC(sstr), param);
     SvSTASH(dstr)    = hv_dup_inc(SvSTASH(sstr), param);
     if (SvROK(sstr))
-        SvRV(dstr)    = SvWEAKREF(SvRV(sstr))
+        SvRV(dstr)    = SvWEAKREF(sstr)
             ? sv_dup(SvRV(sstr), param)
             : sv_dup_inc(SvRV(sstr), param);
     else if (SvPVX(sstr) && SvLEN(sstr))
@@ -8862,7 +8862,7 @@
     SvMAGIC(dstr)    = mg_dup(SvMAGIC(sstr), param);
     SvSTASH(dstr)    = hv_dup_inc(SvSTASH(sstr), param);
     if (SvROK(sstr))
-        SvRV(dstr)    = SvWEAKREF(SvRV(sstr))
+        SvRV(dstr)    = SvWEAKREF(sstr)
             ? sv_dup(SvRV(sstr), param)
             : sv_dup_inc(SvRV(sstr), param);
     else if (SvPVX(sstr) && SvLEN(sstr))


Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About