diff options
author | Gurusamy Sarathy <gsar@engin.umich.edu> | 1996-09-20 15:38:57 -0400 |
---|---|---|
committer | Andy Dougherty <doughera@lafcol.lafayette.edu> | 1996-09-20 15:38:57 -0400 |
commit | bf5b86ae2f8af4d8daece5777d77a067ab9cf194 (patch) | |
tree | 19e88cc9578d8701bf9ea1faefe3d1aa9fe0f435 /hv.h | |
parent | 72940dca186befa0716f5b6a09c9bdd527de5c66 (diff) | |
download | perl-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.h | 10 |
1 files changed, 6 insertions, 4 deletions
@@ -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: */ |