summaryrefslogtreecommitdiff
path: root/hv.h
diff options
context:
space:
mode:
authorGurusamy Sarathy <gsar@engin.umich.edu>1996-09-20 15:38:57 -0400
committerAndy Dougherty <doughera@lafcol.lafayette.edu>1996-09-20 15:38:57 -0400
commitbf5b86ae2f8af4d8daece5777d77a067ab9cf194 (patch)
tree19e88cc9578d8701bf9ea1faefe3d1aa9fe0f435 /hv.h
parent72940dca186befa0716f5b6a09c9bdd527de5c66 (diff)
downloadperl-bf5b86ae2f8af4d8daece5777d77a067ab9cf194.tar.gz
Re: "Attempt to free non-existent shared string"? (with patch)
I found a subtle problem with the lazydelete mechanism (which is used to postpone the delete of a entry that may be getting iterated over). I was using the HeKLEN slot to hold the hint, but the real HeKLEN is needed later to call unsharepvn(). This means that only magical hash entries can use the HeKLEN slot to hold flags. Here's a tested patch against 5.00305 that fixes the problem. The patch simply moves the LAZYDEL hint to become a SV-level private flag.
Diffstat (limited to 'hv.h')
-rw-r--r--hv.h10
1 files changed, 6 insertions, 4 deletions
diff --git a/hv.h b/hv.h
index a9de8caef1..5c41309f00 100644
--- a/hv.h
+++ b/hv.h
@@ -43,10 +43,8 @@ struct xpvhv {
} STMT_END
-/* these hash entry flags ride on hent_klen */
-
-#define HEf_LAZYDEL -1 /* entry must be deleted during next iter step */
-#define HEf_SVKEY -2 /* hent_key is a SV* (only for magic/tied HVs) */
+/* these hash entry flags ride on hent_klen (for use only in magic/tied HVs) */
+#define HEf_SVKEY -2 /* hent_key is a SV* */
#define Nullhv Null(HV*)
@@ -63,6 +61,10 @@ struct xpvhv {
#define HvSHAREKEYS_on(hv) (SvFLAGS(hv) |= SVphv_SHAREKEYS)
#define HvSHAREKEYS_off(hv) (SvFLAGS(hv) &= ~SVphv_SHAREKEYS)
+#define HvLAZYDEL(hv) (SvFLAGS(hv) & SVphv_LAZYDEL)
+#define HvLAZYDEL_on(hv) (SvFLAGS(hv) |= SVphv_LAZYDEL)
+#define HvLAZYDEL_off(hv) (SvFLAGS(hv) &= ~SVphv_LAZYDEL)
+
#ifdef OVERLOAD
/* Maybe amagical: */