Skip to content

Commit 94992f5

Browse files
committed
check_cow_threshold
1 parent ff6e449 commit 94992f5

File tree

1 file changed

+29
-8
lines changed

1 file changed

+29
-8
lines changed

sv.c

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@
5353
# ifndef SV_COWBUF_THRESHOLD
5454
# define SV_COWBUF_THRESHOLD 1250 /* min string length for cow */
5555
# endif /* over existing buffer */
56+
# ifndef SV_COW_WASTE_THRESHOLD
57+
# define SV_COW_WASTE_THRESHOLD 1024
58+
# endif
59+
# ifndef SV_COWBUF_WASTE_THRESHOLD
60+
# define SV_COWBUF_WASTE_THRESHOLD 1024
61+
# endif
5662
#endif
5763
/* void Gconvert: on Linux at least, gcvt (which Gconvert gets deffed to),
5864
* has a mandatory return value, even though that value is just the same
@@ -4028,15 +4034,30 @@ S_glob_assign_ref(pTHX_ SV *const dstr, SV *const sstr)
40284034
/* Work around compiler warnings about unsigned >= THRESHOLD when thres-
40294035
hold is 0. */
40304036
#if SV_COW_THRESHOLD
4031-
# define GE_COW_THRESHOLD(len) ((len) >= SV_COW_THRESHOLD)
4037+
# define GE_COW_THRESHOLD(cur) ((cur) >= SV_COW_THRESHOLD)
40324038
#else
4033-
# define GE_COW_THRESHOLD(len) 1
4039+
# define GE_COW_THRESHOLD(cur) 1
40344040
#endif
40354041
#if SV_COWBUF_THRESHOLD
4036-
# define GE_COWBUF_THRESHOLD(len) ((len) >= SV_COWBUF_THRESHOLD)
4042+
# define GE_COWBUF_THRESHOLD(cur) ((cur) >= SV_COWBUF_THRESHOLD)
40374043
#else
4038-
# define GE_COWBUF_THRESHOLD(len) 1
4044+
# define GE_COWBUF_THRESHOLD(cur) 1
40394045
#endif
4046+
#if SV_COW_WASTE_THRESHOLD
4047+
# define GE_COW_WASTE_THRESHOLD(cur,len) (((len)-(cur)) < SV_COW_WASTE_THRESHOLD)
4048+
#else
4049+
# define GE_COW_WASTE_THRESHOLD(cur,len) 1
4050+
#endif
4051+
#if SV_COWBUF_WASTE_THRESHOLD
4052+
# define GE_COWBUF_WASTE_THRESHOLD(cur,len) (((len)-(cur)) < SV_COWBUF_WASTE_THRESHOLD)
4053+
#else
4054+
# define GE_COWBUF_WASTE_THRESHOLD(cur,len) 1
4055+
#endif
4056+
4057+
#define CHECK_COW_THRESHOLD(cur,len) (GE_COW_THRESHOLD((cur)) && GE_COW_WASTE_THRESHOLD((cur),(len)))
4058+
#define CHECK_COWBUF_THRESHOLD(cur,len) (GE_COWBUF_THRESHOLD((cur)) && GE_COWBUF_WASTE_THRESHOLD((cur),(len)))
4059+
4060+
40404061

40414062
#ifdef PERL_DEBUG_READONLY_COW
40424063
# include <sys/mman.h>
@@ -4404,7 +4425,7 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, SV* sstr, const I32 flags)
44044425
|| ((sflags & (SVs_PADTMP|SVf_READONLY|SVf_IsCOW))
44054426
== SVs_PADTMP
44064427
/* whose buffer is worth stealing */
4407-
&& GE_COWBUF_THRESHOLD(cur)
4428+
&& CHECK_COWBUF_THRESHOLD(cur,len)
44084429
)
44094430
) &&
44104431
!(sflags & SVf_OOK) && /* and not involved in OOK hack? */
@@ -4438,14 +4459,14 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, SV* sstr, const I32 flags)
44384459
#elif defined(PERL_NEW_COPY_ON_WRITE)
44394460
(sflags & SVf_IsCOW
44404461
? (!len ||
4441-
( (GE_COWBUF_THRESHOLD(cur) || SvLEN(dstr) < cur+1)
4462+
( (CHECK_COWBUF_THRESHOLD(cur,len) || SvLEN(dstr) < cur+1)
44424463
/* If this is a regular (non-hek) COW, only so
44434464
many COW "copies" are possible. */
44444465
&& CowREFCNT(sstr) != SV_COW_REFCNT_MAX ))
44454466
: ( (sflags & CAN_COW_MASK) == CAN_COW_FLAGS
44464467
&& !(SvFLAGS(dstr) & SVf_BREAK)
4447-
&& GE_COW_THRESHOLD(cur) && cur+1 < len
4448-
&& (GE_COWBUF_THRESHOLD(cur) || SvLEN(dstr) < cur+1)
4468+
&& CHECK_COW_THRESHOLD(cur,len) && cur+1 < len
4469+
&& (CHECK_COWBUF_THRESHOLD(cur,len) || SvLEN(dstr) < cur+1)
44494470
))
44504471
#else
44514472
sflags & SVf_IsCOW

0 commit comments

Comments
 (0)