From cf5f6d8e749f9104e0fc0648bd78d721bffd2737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= Date: Fri, 26 Jun 2015 09:09:19 +0200 Subject: [PATCH] Fix interaction with threads in perl-5.22 --- Mouse-2.4.2-Fix-test-code.patch | 39 ++++ ...read-issue-for-Perl-5.22.0-or-higher.patch | 195 ++++++++++++++++++ perl-Mouse.spec | 13 +- 3 files changed, 246 insertions(+), 1 deletion(-) create mode 100644 Mouse-2.4.2-Fix-test-code.patch create mode 100644 Mouse-2.4.2-Fix-thread-issue-for-Perl-5.22.0-or-higher.patch diff --git a/Mouse-2.4.2-Fix-test-code.patch b/Mouse-2.4.2-Fix-test-code.patch new file mode 100644 index 0000000..142aedb --- /dev/null +++ b/Mouse-2.4.2-Fix-test-code.patch @@ -0,0 +1,39 @@ +From 43bd48014c89331cc0dadad78190890199469e81 Mon Sep 17 00:00:00 2001 +From: Syohei YOSHIDA +Date: Wed, 24 Jun 2015 18:02:57 +0900 +Subject: [PATCH 2/2] Fix test code +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +In original code, mismatching plan error is occurred. + +Signed-off-by: Petr Písař +--- + t/900_mouse_bugs/017_issue29.t | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/t/900_mouse_bugs/017_issue29.t b/t/900_mouse_bugs/017_issue29.t +index 14c2900..bc93767 100644 +--- a/t/900_mouse_bugs/017_issue29.t ++++ b/t/900_mouse_bugs/017_issue29.t +@@ -3,10 +3,13 @@ + package main; + use strict; + use warnings; +-use Test::More skip_all => 'See https://github.com/gfx/p5-Mouse/issues/29'; +- +-use Test::Requires qw(threads); # XXX: ithreads is discuraged! ++use constant HAS_THREADS => eval{ require threads && require threads::shared }; ++use Test::More; + ++use if !HAS_THREADS, 'Test::More', ++ (skip_all => "This is a test for threads ($@)"); ++use if $Test::More::VERSION >= 2.00, 'Test::More', ++ (skip_all => "Test::Builder2 has bugs about threads"); + + { + package Foo; +-- +2.1.0 + diff --git a/Mouse-2.4.2-Fix-thread-issue-for-Perl-5.22.0-or-higher.patch b/Mouse-2.4.2-Fix-thread-issue-for-Perl-5.22.0-or-higher.patch new file mode 100644 index 0000000..f178e73 --- /dev/null +++ b/Mouse-2.4.2-Fix-thread-issue-for-Perl-5.22.0-or-higher.patch @@ -0,0 +1,195 @@ +From 40f345f8b69a863069b25c5f3aac22d8f677eb03 Mon Sep 17 00:00:00 2001 +From: Syohei YOSHIDA +Date: Wed, 24 Jun 2015 17:34:02 +0900 +Subject: [PATCH 1/2] Fix thread issue for Perl 5.22.0 or higher +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Petr Písař +--- + mouse.h | 8 ++++++++ + xs-src/MouseAccessor.xs | 20 ++++++++++++-------- + xs-src/MouseTypeConstraints.xs | 17 +++++++++++------ + 3 files changed, 31 insertions(+), 14 deletions(-) + +diff --git a/mouse.h b/mouse.h +index b0c53ef..48792a2 100644 +--- a/mouse.h ++++ b/mouse.h +@@ -106,6 +106,14 @@ SV* mouse_av_at_safe(pTHX_ AV* const mi, I32 const ix); + #define MOUSE_mg_slot(mg) MOUSE_mg_obj(mg) + #define MOUSE_mg_xa(mg) ((AV*)MOUSE_mg_ptr(mg)) + ++static inline MAGIC *MOUSE_get_magic(CV *cv, MGVTBL *vtbl) ++{ ++#ifndef MULTIPLICITY ++ return (MAGIC*)(CvXSUBANY(cv).any_ptr); ++#else ++ return mg_findext((SV*)cv, PERL_MAGIC_ext, vtbl); ++#endif ++} + + /* mouse_instance.xs stuff */ + SV* mouse_instance_create (pTHX_ HV* const stash); +diff --git a/xs-src/MouseAccessor.xs b/xs-src/MouseAccessor.xs +index daf9cf1..11eb630 100644 +--- a/xs-src/MouseAccessor.xs ++++ b/xs-src/MouseAccessor.xs +@@ -122,7 +122,9 @@ mouse_accessor_generate(pTHX_ SV* const attr, XSUBADDR_t const accessor_impl){ + * although we use MAGIC for gc, we also store mg to + * CvXSUBANY for efficiency (gfx) + */ ++#ifndef MULTIPLICITY + CvXSUBANY(xsub).any_ptr = (void*)mg; ++#endif + + return xsub; + } +@@ -262,7 +264,7 @@ XS(XS_Mouse_accessor) + { + dVAR; dXSARGS; + dMOUSE_self; +- MAGIC* const mg = (MAGIC*)XSANY.any_ptr; ++ MAGIC* const mg = MOUSE_get_magic(cv, &mouse_accessor_vtbl); + + SP -= items; /* PPCODE */ + PUTBACK; +@@ -285,7 +287,7 @@ XS(XS_Mouse_reader) + { + dVAR; dXSARGS; + dMOUSE_self; +- MAGIC* const mg = (MAGIC*)XSANY.any_ptr; ++ MAGIC* const mg = MOUSE_get_magic(cv, &mouse_accessor_vtbl); + + if (items != 1) { + mouse_throw_error(MOUSE_mg_attribute(mg), NULL, +@@ -303,7 +305,7 @@ XS(XS_Mouse_writer) + { + dVAR; dXSARGS; + dMOUSE_self; +- MAGIC* const mg = (MAGIC*)XSANY.any_ptr; ++ MAGIC* const mg = MOUSE_get_magic(cv, &mouse_accessor_vtbl); + + if (items != 2) { + mouse_throw_error(MOUSE_mg_attribute(mg), NULL, +@@ -351,7 +353,9 @@ mouse_simple_accessor_generate(pTHX_ + * although we use MAGIC for gc, we also store mg to CvXSUBANY + * for efficiency (gfx) + */ ++#ifndef MULTIPLICITY + CvXSUBANY(xsub).any_ptr = (void*)mg; ++#endif + + return xsub; + } +@@ -360,7 +364,7 @@ XS(XS_Mouse_simple_reader) + { + dVAR; dXSARGS; + dMOUSE_self; +- MAGIC* const mg = (MAGIC*)XSANY.any_ptr; ++ MAGIC* const mg = MOUSE_get_magic(cv, &mouse_accessor_vtbl); + SV* value; + + if (items != 1) { +@@ -389,7 +393,7 @@ XS(XS_Mouse_simple_writer) + { + dVAR; dXSARGS; + dMOUSE_self; +- SV* const slot = MOUSE_mg_slot((MAGIC*)XSANY.any_ptr); ++ SV* const slot = MOUSE_mg_slot(MOUSE_get_magic(cv, &mouse_accessor_vtbl)); + + if (items != 2) { + croak("Expected exactly two argument for a writer of %"SVf, +@@ -404,7 +408,7 @@ XS(XS_Mouse_simple_clearer) + { + dVAR; dXSARGS; + dMOUSE_self; +- SV* const slot = MOUSE_mg_slot((MAGIC*)XSANY.any_ptr); ++ SV* const slot = MOUSE_mg_slot(MOUSE_get_magic(cv, &mouse_accessor_vtbl)); + SV* value; + + if (items != 1) { +@@ -421,7 +425,7 @@ XS(XS_Mouse_simple_predicate) + { + dVAR; dXSARGS; + dMOUSE_self; +- SV* const slot = MOUSE_mg_slot((MAGIC*)XSANY.any_ptr); ++ SV* const slot = MOUSE_mg_slot(MOUSE_get_magic(cv, &mouse_accessor_vtbl)); + + if (items != 1) { + croak("Expected exactly one argument for a predicate of %"SVf, slot); +@@ -435,7 +439,7 @@ XS(XS_Mouse_simple_predicate) + XS(XS_Mouse_inheritable_class_accessor) { + dVAR; dXSARGS; + dMOUSE_self; +- SV* const slot = MOUSE_mg_slot((MAGIC*)XSANY.any_ptr); ++ SV* const slot = MOUSE_mg_slot(MOUSE_get_magic(cv, &mouse_accessor_vtbl)); + SV* value; + HV* stash; + +diff --git a/xs-src/MouseTypeConstraints.xs b/xs-src/MouseTypeConstraints.xs +index d4b57a0..6d723ee 100644 +--- a/xs-src/MouseTypeConstraints.xs ++++ b/xs-src/MouseTypeConstraints.xs +@@ -24,6 +24,8 @@ typedef int (*check_fptr_t)(pTHX_ SV* const data, SV* const sv); + static + XSPROTO(XS_Mouse_constraint_check); + ++static MGVTBL mouse_util_type_constraints_vtbl; /* not used, only for identity */ ++ + /* + NOTE: mouse_tc_check() handles GETMAGIC + */ +@@ -33,9 +35,10 @@ mouse_tc_check(pTHX_ SV* const tc_code, SV* const sv) { + assert(SvTYPE(cv) == SVt_PVCV); + + if(CvXSUB(cv) == XS_Mouse_constraint_check){ /* built-in type constraints */ +- MAGIC* const mg = (MAGIC*)CvXSUBANY(cv).any_ptr; +- ++ MAGIC* const mg = MOUSE_get_magic(cv, &mouse_util_type_constraints_vtbl); ++#ifndef MULTIPLICITY + assert(CvXSUBANY(cv).any_ptr != NULL); ++#endif + assert(mg->mg_ptr != NULL); + + SvGETMAGIC(sv); +@@ -498,14 +501,13 @@ mouse_can_methods(pTHX_ AV* const methods, SV* const instance){ + return FALSE; + } + +-static MGVTBL mouse_util_type_constraints_vtbl; /* not used, only for identity */ +- + static CV* + mouse_tc_generate(pTHX_ const char* const name, check_fptr_t const fptr, SV* const param) { + CV* xsub; ++ MAGIC* mg; + + xsub = newXS(name, XS_Mouse_constraint_check, __FILE__); +- CvXSUBANY(xsub).any_ptr = sv_magicext( ++ mg = sv_magicext( + (SV*)xsub, + param, /* mg_obj: refcnt will be increased */ + PERL_MAGIC_ext, +@@ -513,6 +515,9 @@ mouse_tc_generate(pTHX_ const char* const name, check_fptr_t const fptr, SV* con + (char*)fptr, /* mg_ptr */ + 0 /* mg_len: 0 for static data */ + ); ++#ifndef MULTIPLICITY ++ CvXSUBANY(xsub).any_ptr = (void*)mg; ++#endif + + if(!name){ + sv_2mortal((SV*)xsub); +@@ -569,7 +574,7 @@ static + XSPROTO(XS_Mouse_constraint_check) { + dVAR; + dXSARGS; +- MAGIC* const mg = (MAGIC*)XSANY.any_ptr; ++ MAGIC* const mg = MOUSE_get_magic(cv, &mouse_util_type_constraints_vtbl); + SV* sv; + + if(items < 1){ +-- +2.1.0 + diff --git a/perl-Mouse.spec b/perl-Mouse.spec index 22e13a7..47b63f5 100644 --- a/perl-Mouse.spec +++ b/perl-Mouse.spec @@ -1,7 +1,7 @@ Name: perl-Mouse Summary: Moose minus the antlers Version: 2.4.2 -Release: 4%{?dist} +Release: 5%{?dist} License: GPL+ or Artistic Group: Development/Libraries URL: http://search.cpan.org/dist/Mouse @@ -9,6 +9,12 @@ Source0: http://search.cpan.org/CPAN/authors/id/G/GF/GFUJI/Mouse-%{versio # The build of Data::Dump::Streamer fails with 5.21.x and higher # Disable the optional test to build Mouse with Perl 5.22 Patch0: Mouse-2.4.2-Disable-using-Data-Dump-Streamer.patch +# Fix interaction with threads in perl-5.22, not compatible with older perls, +# bug #1235938, +Patch1: Mouse-2.4.2-Fix-thread-issue-for-Perl-5.22.0-or-higher.patch +# Enable and correct threads test, not compatible with older perls, +# bug #1235938, +Patch2: Mouse-2.4.2-Fix-test-code.patch # Module Build BuildRequires: perl BuildRequires: perl(Devel::PPPort) >= 3.19 @@ -106,6 +112,8 @@ an experimental first release, so comments and suggestions are very welcome. %setup -q -n Mouse-%{version} %if 0%(perl -e 'print $] >= 5.022') %patch0 -p1 +%patch1 -p1 +%patch2 -p1 %endif # Fix permissions @@ -169,6 +177,9 @@ find %{buildroot} -type f -name '*.bs' -a -size 0 -exec rm -f {} ';' %{_mandir}/man3/Test::Mouse.3* %changelog +* Fri Jun 26 2015 Petr Pisar - 2.4.2-5 +- Fix interaction with threads in perl-5.22 (bug #1235938) + * Thu Jun 18 2015 Fedora Release Engineering - 2.4.2-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild