diff --git a/perl-threads-shared.spec b/perl-threads-shared.spec index 5cf7bf7..f5c7d43 100644 --- a/perl-threads-shared.spec +++ b/perl-threads-shared.spec @@ -1,17 +1,23 @@ +%global base_version 1.59 Name: perl-threads-shared -Version: 1.59 -Release: 4 +Version: 1.62 +Release: 1 Summary: Perl extension for sharing data structures between threads License: GPL+ or Artistic URL: https://metacpan.org/release/threads-shared -Source0: https://cpan.metacpan.org/authors/id/J/JD/JDHEDDEN/threads-shared-%{version}.tar.gz -BuildRequires: perl-generators perl-interpreter perl-devel gcc +Source0: https://cpan.metacpan.org/authors/id/J/JD/JDHEDDEN/threads-shared-%{base_version}.tar.gz +BuildRequires: perl-generators perl-interpreter perl-devel gcc perl(threads) >= 1.73 BuildRequires: perl(ExtUtils::MakeMaker) >= 6.76 perl(ExtUtils::testlib) perl(Test::More) Requires: perl(:MODULE_COMPAT_%(eval "`perl -V:version`"; echo $version)) Requires: perl(Carp) Requires: perl(threads) >= 1.73 Requires: perl(XSLoader) +Patch0: threads-shared-1.59-Upgrade-to-1.60.patch +Patch1: threads-shared-1.60-threads-shared-fix-leak.patch +Patch2: threads-shared-1.59-Upgrade-to-1.61.patch +Patch3: threads-shared-1.61-Upgrade-to-1.62.patch + %description By default, variables are private to each thread, and each newly created thread gets a private copy of each existing variable. This module allows @@ -30,7 +36,7 @@ requires: man The %{name}-help package contains doc files for %{name}. %prep -%autosetup -n threads-shared-%{version} +%autosetup -n threads-shared-%{base_version} -p1 %build perl Makefile.PL INSTALLDIRS=vendor NO_PACKLIST=1 OPTIMIZE="$RPM_OPT_FLAGS" @@ -53,6 +59,9 @@ make test %{_mandir}/man3/* %changelog +* Fri Dec 31 2021 yuanxin - 1.62-1 +- update version to 1.62 + * Wed Jun 23 2021 wuchaochao - 1.59-4 - add buildrequires: gcc diff --git a/threads-shared-1.59-Upgrade-to-1.60.patch b/threads-shared-1.59-Upgrade-to-1.60.patch new file mode 100644 index 0000000..0445c3a --- /dev/null +++ b/threads-shared-1.59-Upgrade-to-1.60.patch @@ -0,0 +1,109 @@ +From 2ec58402d05eb12d0b9387963941f1e445d9aa5b Mon Sep 17 00:00:00 2001 +From: Jitka Plesnikova +Date: Fri, 26 Apr 2019 15:00:30 +0200 +Subject: [PATCH] Upgrade to 1.60 + +--- + lib/threads/shared.pm | 4 ++-- + shared.xs | 39 +++++++++++++++++++++++++++++++++++++++ + 2 files changed, 41 insertions(+), 2 deletions(-) + +diff --git a/lib/threads/shared.pm b/lib/threads/shared.pm +index f7e5ff8..45ad154 100644 +--- a/lib/threads/shared.pm ++++ b/lib/threads/shared.pm +@@ -8,7 +8,7 @@ use Config; + + use Scalar::Util qw(reftype refaddr blessed); + +-our $VERSION = '1.59'; # Please update the pod, too. ++our $VERSION = '1.60'; # Please update the pod, too. + my $XS_VERSION = $VERSION; + $VERSION = eval $VERSION; + +@@ -196,7 +196,7 @@ threads::shared - Perl extension for sharing data structures between threads + + =head1 VERSION + +-This document describes threads::shared version 1.59 ++This document describes threads::shared version 1.60 + + =head1 SYNOPSIS + +diff --git a/shared.xs b/shared.xs +index d0f7d1e..6cdf094 100644 +--- a/shared.xs ++++ b/shared.xs +@@ -115,6 +115,17 @@ + * without the prefix (e.g., sv, tmp or obj). + */ + ++/* this is lower overhead than warn() and less likely to interfere ++ with other parts of perl (like with the debugger.) ++*/ ++#ifdef SHARED_TRACE_LOCKS ++# define TRACE_LOCK(x) DEBUG_U(x) ++# define TRACE_LOCKv(x) DEBUG_Uv(x) ++#else ++# define TRACE_LOCK(x) ++# define TRACE_LOCKv(x) ++#endif ++ + #define PERL_NO_GET_CONTEXT + #include "EXTERN.h" + #include "perl.h" +@@ -211,8 +222,24 @@ recursive_lock_release(pTHX_ recursive_lock_t *lock) + if (--lock->locks == 0) { + lock->owner = NULL; + COND_SIGNAL(&lock->cond); ++ TRACE_LOCK( ++ PerlIO_printf(Perl_debug_log, "shared lock released %p for %p at %s:%d\n", ++ lock, aTHX, CopFILE(PL_curcop), CopLINE(PL_curcop)) ++ ); ++ } ++ else { ++ TRACE_LOCKv( ++ PerlIO_printf(Perl_debug_log, "shared lock unbump %p for %p at %s:%d\n", ++ lock, aTHX, CopFILE(PL_curcop), CopLINE(PL_curcop)) ++ ); + } + } ++ else { ++ TRACE_LOCK( ++ PerlIO_printf(Perl_debug_log, "bad shared lock release %p for %p (owned by %p) at %s:%d\n", ++ lock, aTHX, lock->owner, CopFILE(PL_curcop), CopLINE(PL_curcop)) ++ ); ++ } + MUTEX_UNLOCK(&lock->mutex); + } + +@@ -224,8 +251,16 @@ recursive_lock_acquire(pTHX_ recursive_lock_t *lock, const char *file, int line) + assert(aTHX); + MUTEX_LOCK(&lock->mutex); + if (lock->owner == aTHX) { ++ TRACE_LOCKv( ++ PerlIO_printf(Perl_debug_log, "shared lock bump %p (%p) at %s:%d\n", ++ lock, lock->owner, CopFILE(PL_curcop), CopLINE(PL_curcop)) ++ ); + lock->locks++; + } else { ++ TRACE_LOCK( ++ PerlIO_printf(Perl_debug_log, "shared lock try %p for %p (owned by %p) at %s:%d\n", ++ lock, aTHX, lock->owner, CopFILE(PL_curcop), CopLINE(PL_curcop)) ++ ); + while (lock->owner) { + #ifdef DEBUG_LOCKS + Perl_warn(aTHX_ " %p waiting - owned by %p %s:%d\n", +@@ -233,6 +268,10 @@ recursive_lock_acquire(pTHX_ recursive_lock_t *lock, const char *file, int line) + #endif + COND_WAIT(&lock->cond,&lock->mutex); + } ++ TRACE_LOCK( ++ PerlIO_printf(Perl_debug_log, "shared lock got %p at %s:%d\n", ++ lock, CopFILE(PL_curcop), CopLINE(PL_curcop)) ++ ); + lock->locks = 1; + lock->owner = aTHX; + #ifdef DEBUG_LOCKS +-- +2.20.1 \ No newline at end of file diff --git a/threads-shared-1.59-Upgrade-to-1.61.patch b/threads-shared-1.59-Upgrade-to-1.61.patch new file mode 100644 index 0000000..bb1ee98 --- /dev/null +++ b/threads-shared-1.59-Upgrade-to-1.61.patch @@ -0,0 +1,56 @@ +From c48ee9c79eb7c4a36b7758fc4c3209ca0e5d759b Mon Sep 17 00:00:00 2001 +From: Jitka Plesnikova +Date: Tue, 21 Apr 2020 12:52:31 +0200 +Subject: [PATCH] Upgrade to 1.61 + +--- + lib/threads/shared.pm | 4 ++-- + t/stress.t | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/lib/threads/shared.pm b/lib/threads/shared.pm +index 45ad154..bd0e437 100644 +--- a/lib/threads/shared.pm ++++ b/lib/threads/shared.pm +@@ -8,7 +8,7 @@ use Config; + + use Scalar::Util qw(reftype refaddr blessed); + +-our $VERSION = '1.60'; # Please update the pod, too. ++our $VERSION = '1.61'; # Please update the pod, too. + my $XS_VERSION = $VERSION; + $VERSION = eval $VERSION; + +@@ -196,7 +196,7 @@ threads::shared - Perl extension for sharing data structures between threads + + =head1 VERSION + +-This document describes threads::shared version 1.60 ++This document describes threads::shared version 1.61 + + =head1 SYNOPSIS + +diff --git a/t/stress.t b/t/stress.t +index 1dd95e3..ccdeb0e 100644 +--- a/t/stress.t ++++ b/t/stress.t +@@ -12,7 +12,7 @@ BEGIN { + exit(0); + } + +- # http://lists.alioth.debian.org/pipermail/perl-maintainers/2011-June/002285.html ++ # https://lists.alioth.debian.org/pipermail/perl-maintainers/2011-June/002285.html + # There _is_ TLS support on m68k, but this stress test is overwhelming + # for the hardware + if ($^O eq 'linux' && $Config{archname} =~ /^m68k/) { +@@ -179,7 +179,7 @@ use threads::shared; + } elsif ($timeouts) { + # Frequently fails under MSWin32 due to deadlocking bug in Windows + # hence test is TODO under MSWin32 +- # http://rt.perl.org/rt3/Public/Bug/Display.html?id=41574 ++ # https://rt.perl.org/rt3/Public/Bug/Display.html?id=41574 + # http://support.microsoft.com/kb/175332 + if ($^O eq 'MSWin32') { + print("not ok 1 # TODO - not reliable under MSWin32\n") +-- +2.21.1 \ No newline at end of file diff --git a/threads-shared-1.60-threads-shared-fix-leak.patch b/threads-shared-1.60-threads-shared-fix-leak.patch new file mode 100644 index 0000000..92c5dea --- /dev/null +++ b/threads-shared-1.60-threads-shared-fix-leak.patch @@ -0,0 +1,56 @@ +From b52cdd7a8525325deba04554d8a00a578c397d56 Mon Sep 17 00:00:00 2001 +From: David Mitchell +Date: Thu, 11 Jul 2019 15:17:48 +0100 +Subject: [PATCH] threads::shared: fix leak +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When assigning a shared reference value to a variable containing a +shared string, the PV buffer in the shared space was leaked. For +example: + + my $s :shared = "foo"; + my $t :shared = shared_clone(\"bar"); + $s = $t; # "foo" in shared space leaked + +This was showing up as failed smokes under ASan. + +Petr Písař: Ported to 1.60 from perl commit +59c73bd3d62c5096a6f9b2e3cbe05e1ab4c158cf. + +Signed-off-by: Petr Písař +--- + shared.xs | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +diff --git a/shared.xs b/shared.xs +index 6cdf094..858c6d6 100644 +--- a/shared.xs ++++ b/shared.xs +@@ -818,12 +818,19 @@ sharedsv_scalar_store(pTHX_ SV *sv, SV *ssv) + SV *obj = SvRV(sv); + SV *sobj = Perl_sharedsv_find(aTHX_ obj); + if (sobj) { ++ SV* tmpref; + SHARED_CONTEXT; +- (void)SvUPGRADE(ssv, SVt_RV); +- sv_setsv_nomg(ssv, &PL_sv_undef); ++ /* Creating a tmp ref to sobj then assigning it to ssv ensures ++ * that any previous contents of ssv are correctly freed ++ * by sv_setsv(). Not sure if there is a better, API-legal way ++ * to achieve this */ ++ tmpref = newSV_type(SVt_RV); ++ SvRV_set(tmpref, sobj); ++ SvROK_on(tmpref); ++ SvREFCNT_inc_simple_NN(sobj); ++ sv_setsv_nomg(ssv, tmpref); ++ SvREFCNT_dec_NN(tmpref); + +- SvRV_set(ssv, SvREFCNT_inc(sobj)); +- SvROK_on(ssv); + if (SvOBJECT(sobj)) { + /* Remove any old blessing */ + SvREFCNT_dec(SvSTASH(sobj)); +-- +2.20.1 \ No newline at end of file diff --git a/threads-shared-1.61-Upgrade-to-1.62.patch b/threads-shared-1.61-Upgrade-to-1.62.patch new file mode 100644 index 0000000..2955d9f --- /dev/null +++ b/threads-shared-1.61-Upgrade-to-1.62.patch @@ -0,0 +1,47 @@ +From 25d469721e26fbc7afd670776ae9523013e9fdf5 Mon Sep 17 00:00:00 2001 +From: Jitka Plesnikova +Date: Thu, 6 May 2021 10:38:30 +0200 +Subject: [PATCH] Upgrade to 1.62 + +--- + lib/threads/shared.pm | 4 ++-- + shared.xs | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/lib/threads/shared.pm b/lib/threads/shared.pm +index bd0e437..3674d83 100644 +--- a/lib/threads/shared.pm ++++ b/lib/threads/shared.pm +@@ -8,7 +8,7 @@ use Config; + + use Scalar::Util qw(reftype refaddr blessed); + +-our $VERSION = '1.61'; # Please update the pod, too. ++our $VERSION = '1.62'; # Please update the pod, too. + my $XS_VERSION = $VERSION; + $VERSION = eval $VERSION; + +@@ -196,7 +196,7 @@ threads::shared - Perl extension for sharing data structures between threads + + =head1 VERSION + +-This document describes threads::shared version 1.61 ++This document describes threads::shared version 1.62 + + =head1 SYNOPSIS + +diff --git a/shared.xs b/shared.xs +index 858c6d6..4931a61 100644 +--- a/shared.xs ++++ b/shared.xs +@@ -1183,7 +1183,7 @@ sharedsv_array_mg_free(pTHX_ SV *sv, MAGIC *mg) + * This is called when perl is about to access an element of + * the array - + */ +-#if PERL_VERSION >= 11 ++#if PERL_VERSION_GE(5,11,0) + static int + sharedsv_array_mg_copy(pTHX_ SV *sv, MAGIC* mg, + SV *nsv, const char *name, I32 namlen) +-- +2.30.2 \ No newline at end of file