|
53 | 53 | # ifndef SV_COWBUF_THRESHOLD
|
54 | 54 | # define SV_COWBUF_THRESHOLD 1250 /* min string length for cow */
|
55 | 55 | # 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 |
56 | 62 | #endif
|
57 | 63 | /* void Gconvert: on Linux at least, gcvt (which Gconvert gets deffed to),
|
58 | 64 | * 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)
|
4028 | 4034 | /* Work around compiler warnings about unsigned >= THRESHOLD when thres-
|
4029 | 4035 | hold is 0. */
|
4030 | 4036 | #if SV_COW_THRESHOLD
|
4031 |
| -# define GE_COW_THRESHOLD(len) ((len) >= SV_COW_THRESHOLD) |
| 4037 | +# define GE_COW_THRESHOLD(cur) ((cur) >= SV_COW_THRESHOLD) |
4032 | 4038 | #else
|
4033 |
| -# define GE_COW_THRESHOLD(len) 1 |
| 4039 | +# define GE_COW_THRESHOLD(cur) 1 |
4034 | 4040 | #endif
|
4035 | 4041 | #if SV_COWBUF_THRESHOLD
|
4036 |
| -# define GE_COWBUF_THRESHOLD(len) ((len) >= SV_COWBUF_THRESHOLD) |
| 4042 | +# define GE_COWBUF_THRESHOLD(cur) ((cur) >= SV_COWBUF_THRESHOLD) |
4037 | 4043 | #else
|
4038 |
| -# define GE_COWBUF_THRESHOLD(len) 1 |
| 4044 | +# define GE_COWBUF_THRESHOLD(cur) 1 |
4039 | 4045 | #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 | + |
4040 | 4061 |
|
4041 | 4062 | #ifdef PERL_DEBUG_READONLY_COW
|
4042 | 4063 | # include <sys/mman.h>
|
@@ -4404,7 +4425,7 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, SV* sstr, const I32 flags)
|
4404 | 4425 | || ((sflags & (SVs_PADTMP|SVf_READONLY|SVf_IsCOW))
|
4405 | 4426 | == SVs_PADTMP
|
4406 | 4427 | /* whose buffer is worth stealing */
|
4407 |
| - && GE_COWBUF_THRESHOLD(cur) |
| 4428 | + && CHECK_COWBUF_THRESHOLD(cur,len) |
4408 | 4429 | )
|
4409 | 4430 | ) &&
|
4410 | 4431 | !(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)
|
4438 | 4459 | #elif defined(PERL_NEW_COPY_ON_WRITE)
|
4439 | 4460 | (sflags & SVf_IsCOW
|
4440 | 4461 | ? (!len ||
|
4441 |
| - ( (GE_COWBUF_THRESHOLD(cur) || SvLEN(dstr) < cur+1) |
| 4462 | + ( (CHECK_COWBUF_THRESHOLD(cur,len) || SvLEN(dstr) < cur+1) |
4442 | 4463 | /* If this is a regular (non-hek) COW, only so
|
4443 | 4464 | many COW "copies" are possible. */
|
4444 | 4465 | && CowREFCNT(sstr) != SV_COW_REFCNT_MAX ))
|
4445 | 4466 | : ( (sflags & CAN_COW_MASK) == CAN_COW_FLAGS
|
4446 | 4467 | && !(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) |
4449 | 4470 | ))
|
4450 | 4471 | #else
|
4451 | 4472 | sflags & SVf_IsCOW
|
|
0 commit comments