From: Nicholas Clark Date: Sun, 24 Jun 2007 13:32:42 +0000 (+0000) Subject: Also get copy on write working with ithreads. It hadn't been working X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=cb23d5b19261a41b403a114d55551ddac48af175;p=p5sagit%2Fp5-mst-13.2.git Also get copy on write working with ithreads. It hadn't been working since change 26684 (which uses sv_setsv_flags to copy a value from an SV in one interpreter context to an SV in another), despite what change 31120 thought. ext/Compress/Raw/Zlib/t/07bufsize.t still fails. p4raw-id: //depot/perl@31454 --- diff --git a/sv.c b/sv.c index a620c12..1b5d8e8 100644 --- a/sv.c +++ b/sv.c @@ -3623,9 +3623,11 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags) /* and won't be needed again, potentially */ !(PL_op && PL_op->op_type == OP_AASSIGN)) #ifdef PERL_OLD_COPY_ON_WRITE - && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS - && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS - && SvTYPE(sstr) >= SVt_PVIV) + && ((flags & SV_COW_SHARED_HASH_KEYS) + ? (!((sflags & CAN_COW_MASK) == CAN_COW_FLAGS + && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS + && SvTYPE(sstr) >= SVt_PVIV)) + : 1) #endif ) { /* Failed the swipe test, and it's not a shared hash key either. diff --git a/sv.h b/sv.h index 54f319d..8ad522d 100644 --- a/sv.h +++ b/sv.h @@ -1839,13 +1839,15 @@ Like C but doesn't process magic. #define SV_SMAGIC 128 #define SV_HAS_TRAILING_NUL 256 #define SV_COW_SHARED_HASH_KEYS 512 +/* This one is only enabled for PERL_OLD_COPY_ON_WRITE */ +#define SV_COW_OTHER_PVS 1024 /* The core is safe for this COW optimisation. XS code on CPAN may not be. So only default to doing the COW setup if we're in the core. */ #ifdef PERL_CORE # ifndef SV_DO_COW_SVSETSV -# define SV_DO_COW_SVSETSV SV_COW_SHARED_HASH_KEYS +# define SV_DO_COW_SVSETSV SV_COW_SHARED_HASH_KEYS|SV_COW_OTHER_PVS # endif #endif