commit
84f910a5d5
@ -0,0 +1 @@
|
|||||||
|
SOURCES/threads-2.21.tar.gz
|
@ -0,0 +1 @@
|
|||||||
|
bb9641a3e581315e718c05e572984c4ab470b0f9 SOURCES/threads-2.21.tar.gz
|
@ -0,0 +1,956 @@
|
|||||||
|
From eccb4c8b9d51bca62104bf80839572c2b5a31caa Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jitka Plesnikova <jplesnik@redhat.com>
|
||||||
|
Date: Fri, 3 May 2024 12:09:37 +0200
|
||||||
|
Subject: [PATCH] Upgrade to 2.40
|
||||||
|
|
||||||
|
---
|
||||||
|
lib/threads.pm | 53 +-
|
||||||
|
t/libc.t | 3 +
|
||||||
|
t/pod.t | 87 ---
|
||||||
|
t/stack.t | 82 ++-
|
||||||
|
t/stack_env.t | 46 +-
|
||||||
|
t/test.pl | 1749 ---------------------------------------------
|
||||||
|
t/thread.t | 4 +-
|
||||||
|
t/version.t | 31 +
|
||||||
|
threads.h | 31 -
|
||||||
|
threads.xs | 142 ++--
|
||||||
|
29 files changed, 265 insertions(+), 214 deletions(-)
|
||||||
|
delete mode 100755 t/pod.t
|
||||||
|
create mode 100644 t/version.t
|
||||||
|
|
||||||
|
diff --git a/lib/threads.pm b/lib/threads.pm
|
||||||
|
index 2eb926a..471ceec 100644
|
||||||
|
--- a/lib/threads.pm
|
||||||
|
+++ b/lib/threads.pm
|
||||||
|
@@ -5,9 +5,9 @@ use 5.008;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
-our $VERSION = '2.21'; # remember to update version in POD!
|
||||||
|
+our $VERSION = '2.40'; # remember to update version in POD!
|
||||||
|
my $XS_VERSION = $VERSION;
|
||||||
|
-$VERSION = eval $VERSION;
|
||||||
|
+#$VERSION = eval $VERSION;
|
||||||
|
|
||||||
|
# Verify this Perl supports threads
|
||||||
|
require Config;
|
||||||
|
@@ -134,13 +134,13 @@ threads - Perl interpreter-based threads
|
||||||
|
|
||||||
|
=head1 VERSION
|
||||||
|
|
||||||
|
-This document describes threads version 2.21
|
||||||
|
+This document describes threads version 2.40
|
||||||
|
|
||||||
|
=head1 WARNING
|
||||||
|
|
||||||
|
The "interpreter-based threads" provided by Perl are not the fast, lightweight
|
||||||
|
system for multitasking that one might expect or hope for. Threads are
|
||||||
|
-implemented in a way that make them easy to misuse. Few people know how to
|
||||||
|
+implemented in a way that makes them easy to misuse. Few people know how to
|
||||||
|
use them correctly or will be able to provide help.
|
||||||
|
|
||||||
|
The use of interpreter-based threads in perl is officially
|
||||||
|
@@ -914,7 +914,7 @@ C<-E<gt>import()>) after any threads are started, and in such a way that no
|
||||||
|
other threads are started afterwards.
|
||||||
|
|
||||||
|
If the above does not work, or is not adequate for your application, then file
|
||||||
|
-a bug report on L<http://rt.cpan.org/Public/> against the problematic module.
|
||||||
|
+a bug report on L<https://rt.cpan.org/Public/> against the problematic module.
|
||||||
|
|
||||||
|
=item Memory consumption
|
||||||
|
|
||||||
|
@@ -937,6 +937,33 @@ C<chdir()>) will affect all the threads in the application.
|
||||||
|
On MSWin32, each thread maintains its own the current working directory
|
||||||
|
setting.
|
||||||
|
|
||||||
|
+=item Locales
|
||||||
|
+
|
||||||
|
+Prior to Perl 5.28, locales could not be used with threads, due to various
|
||||||
|
+race conditions. Starting in that release, on systems that implement
|
||||||
|
+thread-safe locale functions, threads can be used, with some caveats.
|
||||||
|
+This includes Windows starting with Visual Studio 2005, and systems compatible
|
||||||
|
+with POSIX 2008. See L<perllocale/Multi-threaded operation>.
|
||||||
|
+
|
||||||
|
+Each thread (except the main thread) is started using the C locale. The main
|
||||||
|
+thread is started like all other Perl programs; see L<perllocale/ENVIRONMENT>.
|
||||||
|
+You can switch locales in any thread as often as you like.
|
||||||
|
+
|
||||||
|
+If you want to inherit the parent thread's locale, you can, in the parent, set
|
||||||
|
+a variable like so:
|
||||||
|
+
|
||||||
|
+ $foo = POSIX::setlocale(LC_ALL, NULL);
|
||||||
|
+
|
||||||
|
+and then pass to threads->create() a sub that closes over C<$foo>. Then, in
|
||||||
|
+the child, you say
|
||||||
|
+
|
||||||
|
+ POSIX::setlocale(LC_ALL, $foo);
|
||||||
|
+
|
||||||
|
+Or you can use the facilities in L<threads::shared> to pass C<$foo>;
|
||||||
|
+or if the environment hasn't changed, in the child, do
|
||||||
|
+
|
||||||
|
+ POSIX::setlocale(LC_ALL, "");
|
||||||
|
+
|
||||||
|
=item Environment variables
|
||||||
|
|
||||||
|
Currently, on all platforms except MSWin32, all I<system> calls (e.g., using
|
||||||
|
@@ -999,7 +1026,7 @@ signalling behavior is only in effect in the following situations:
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
-=item * Perl has been built with C<PERL_OLD_SIGNALS> (see C<perl -V>).
|
||||||
|
+=item * Perl has been built with C<PERL_OLD_SIGNALS> (see S<C<perl -V>>).
|
||||||
|
|
||||||
|
=item * The environment variable C<PERL_SIGNALS> is set to C<unsafe>
|
||||||
|
(see L<perlrun/"PERL_SIGNALS">).
|
||||||
|
@@ -1063,7 +1090,7 @@ determine whether your system supports it.
|
||||||
|
|
||||||
|
In prior perl versions, spawning threads with open directory handles would
|
||||||
|
crash the interpreter.
|
||||||
|
-L<[perl #75154]|http://rt.perl.org/rt3/Public/Bug/Display.html?id=75154>
|
||||||
|
+L<[perl #75154]|https://rt.perl.org/rt3/Public/Bug/Display.html?id=75154>
|
||||||
|
|
||||||
|
=item Detached threads and global destruction
|
||||||
|
|
||||||
|
@@ -1091,8 +1118,8 @@ unreferenced scalars. However, such warnings are harmless, and may safely be
|
||||||
|
ignored.
|
||||||
|
|
||||||
|
You can search for L<threads> related bug reports at
|
||||||
|
-L<http://rt.cpan.org/Public/>. If needed submit any new bugs, problems,
|
||||||
|
-patches, etc. to: L<http://rt.cpan.org/Public/Dist/Display.html?Name=threads>
|
||||||
|
+L<https://rt.cpan.org/Public/>. If needed submit any new bugs, problems,
|
||||||
|
+patches, etc. to: L<https://rt.cpan.org/Public/Dist/Display.html?Name=threads>
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
@@ -1110,14 +1137,14 @@ L<https://github.com/Dual-Life/threads>
|
||||||
|
|
||||||
|
L<threads::shared>, L<perlthrtut>
|
||||||
|
|
||||||
|
-L<http://www.perl.com/pub/a/2002/06/11/threads.html> and
|
||||||
|
-L<http://www.perl.com/pub/a/2002/09/04/threads.html>
|
||||||
|
+L<https://www.perl.com/pub/a/2002/06/11/threads.html> and
|
||||||
|
+L<https://www.perl.com/pub/a/2002/09/04/threads.html>
|
||||||
|
|
||||||
|
Perl threads mailing list:
|
||||||
|
-L<http://lists.perl.org/list/ithreads.html>
|
||||||
|
+L<https://lists.perl.org/list/ithreads.html>
|
||||||
|
|
||||||
|
Stack size discussion:
|
||||||
|
-L<http://www.perlmonks.org/?node_id=532956>
|
||||||
|
+L<https://www.perlmonks.org/?node_id=532956>
|
||||||
|
|
||||||
|
Sample code in the I<examples> directory of this distribution on CPAN.
|
||||||
|
|
||||||
|
diff --git a/t/libc.t b/t/libc.t
|
||||||
|
index 4f6f6ed..592b8d3
|
||||||
|
--- a/t/libc.t
|
||||||
|
+++ b/t/libc.t
|
||||||
|
@@ -9,6 +9,9 @@ BEGIN {
|
||||||
|
skip_all(q/Perl not compiled with 'useithreads'/);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ # Guard against bugs that result in deadlock
|
||||||
|
+ watchdog(1 * 60);
|
||||||
|
+
|
||||||
|
plan(11);
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/t/pod.t b/t/pod.t
|
||||||
|
deleted file mode 100755
|
||||||
|
index 390f7e2..0000000
|
||||||
|
--- a/t/pod.t
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,87 +0,0 @@
|
||||||
|
-use strict;
|
||||||
|
-use warnings;
|
||||||
|
-
|
||||||
|
-use Test::More;
|
||||||
|
-if ($ENV{RUN_MAINTAINER_TESTS}) {
|
||||||
|
- plan 'tests' => 3;
|
||||||
|
-} else {
|
||||||
|
- plan 'skip_all' => 'Module maintainer tests';
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-SKIP: {
|
||||||
|
- if (! eval 'use Test::Pod 1.26; 1') {
|
||||||
|
- skip('Test::Pod 1.26 required for testing POD', 1);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- pod_file_ok('lib/threads.pm');
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-SKIP: {
|
||||||
|
- if (! eval 'use Test::Pod::Coverage 1.08; 1') {
|
||||||
|
- skip('Test::Pod::Coverage 1.08 required for testing POD coverage', 1);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- pod_coverage_ok('threads',
|
||||||
|
- {
|
||||||
|
- 'trustme' => [
|
||||||
|
- qr/^new$/,
|
||||||
|
- qr/^exit$/,
|
||||||
|
- qr/^async$/,
|
||||||
|
- qr/^\(/,
|
||||||
|
- qr/^(all|running|joinable)$/,
|
||||||
|
- ],
|
||||||
|
- 'private' => [
|
||||||
|
- qr/^import$/,
|
||||||
|
- qr/^DESTROY$/,
|
||||||
|
- qr/^bootstrap$/,
|
||||||
|
- ]
|
||||||
|
- }
|
||||||
|
- );
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-SKIP: {
|
||||||
|
- if (! eval 'use Test::Spelling; 1') {
|
||||||
|
- skip('Test::Spelling required for testing POD spelling', 1);
|
||||||
|
- }
|
||||||
|
- if (system('aspell help >/dev/null 2>&1')) {
|
||||||
|
- skip(q/'aspell' required for testing POD spelling/, 1);
|
||||||
|
- }
|
||||||
|
- set_spell_cmd('aspell list --lang=en');
|
||||||
|
- add_stopwords(<DATA>);
|
||||||
|
- pod_file_spelling_ok('lib/threads.pm', 'thread.pm spelling');
|
||||||
|
- unlink("/home/$ENV{'USER'}/en.prepl", "/home/$ENV{'USER'}/en.pws");
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-exit(0);
|
||||||
|
-
|
||||||
|
-__DATA__
|
||||||
|
-
|
||||||
|
-API
|
||||||
|
-async
|
||||||
|
-cpan
|
||||||
|
-MSWin32
|
||||||
|
-pthreads
|
||||||
|
-SIGTERM
|
||||||
|
-TID
|
||||||
|
-Config.pm
|
||||||
|
-
|
||||||
|
-Hedden
|
||||||
|
-Artur
|
||||||
|
-Soderberg
|
||||||
|
-crystalflame
|
||||||
|
-brecon
|
||||||
|
-netrus
|
||||||
|
-Rocco
|
||||||
|
-Caputo
|
||||||
|
-netrus
|
||||||
|
-vipul
|
||||||
|
-Ved
|
||||||
|
-Prakash
|
||||||
|
-presicient
|
||||||
|
-
|
||||||
|
-okay
|
||||||
|
-unjoinable
|
||||||
|
-incrementing
|
||||||
|
-
|
||||||
|
-MetaCPAN
|
||||||
|
-__END__
|
||||||
|
diff --git a/t/stack.t b/t/stack.t
|
||||||
|
index cfd6cf7..0dcc947
|
||||||
|
--- a/t/stack.t
|
||||||
|
+++ b/t/stack.t
|
||||||
|
@@ -9,6 +9,20 @@ BEGIN {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+my $frame_size;
|
||||||
|
+my $frames;
|
||||||
|
+my $size;
|
||||||
|
+
|
||||||
|
+BEGIN {
|
||||||
|
+ # XXX Note that if the default stack size happens to be the same as these
|
||||||
|
+ # numbers, that test 2 would return success just out of happenstance.
|
||||||
|
+ # This possibility could be lessened by choosing $frames to be something
|
||||||
|
+ # less likely than a power of 2
|
||||||
|
+ $frame_size = 4096;
|
||||||
|
+ $frames = 128;
|
||||||
|
+ $size = $frames * $frame_size;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
use ExtUtils::testlib;
|
||||||
|
|
||||||
|
sub ok {
|
||||||
|
@@ -25,77 +39,101 @@ sub ok {
|
||||||
|
return ($ok);
|
||||||
|
}
|
||||||
|
|
||||||
|
+sub is {
|
||||||
|
+ my ($id, $got, $expected, $name) = @_;
|
||||||
|
+
|
||||||
|
+ my $ok = ok($id, $got == $expected, $name);
|
||||||
|
+ if (! $ok) {
|
||||||
|
+ print(" GOT: $got\n");
|
||||||
|
+ print("EXPECTED: $expected\n");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return ($ok);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
BEGIN {
|
||||||
|
$| = 1;
|
||||||
|
print("1..18\n"); ### Number of tests that will be run ###
|
||||||
|
};
|
||||||
|
|
||||||
|
-use threads ('stack_size' => 128*4096);
|
||||||
|
+use threads ('stack_size' => $size);
|
||||||
|
ok(1, 1, 'Loaded');
|
||||||
|
|
||||||
|
### Start of Testing ###
|
||||||
|
|
||||||
|
-ok(2, threads->get_stack_size() == 128*4096,
|
||||||
|
- 'Stack size set in import');
|
||||||
|
-ok(3, threads->set_stack_size(160*4096) == 128*4096,
|
||||||
|
+my $actual_size = threads->get_stack_size();
|
||||||
|
+
|
||||||
|
+{
|
||||||
|
+ if ($actual_size > $size) {
|
||||||
|
+ print("ok 2 # skip because system needs larger minimum stack size\n");
|
||||||
|
+ $size = $actual_size;
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ is(2, $actual_size, $size, 'Stack size set in import');
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+my $size_plus_quarter = $size * 1.25; # 128 frames map to 160
|
||||||
|
+is(3, threads->set_stack_size($size_plus_quarter), $size,
|
||||||
|
'Set returns previous value');
|
||||||
|
-ok(4, threads->get_stack_size() == 160*4096,
|
||||||
|
+is(4, threads->get_stack_size(), $size_plus_quarter,
|
||||||
|
'Get stack size');
|
||||||
|
|
||||||
|
threads->create(
|
||||||
|
sub {
|
||||||
|
- ok(5, threads->get_stack_size() == 160*4096,
|
||||||
|
+ is(5, threads->get_stack_size(), $size_plus_quarter,
|
||||||
|
'Get stack size in thread');
|
||||||
|
- ok(6, threads->self()->get_stack_size() == 160*4096,
|
||||||
|
+ is(6, threads->self()->get_stack_size(), $size_plus_quarter,
|
||||||
|
'Thread gets own stack size');
|
||||||
|
- ok(7, threads->set_stack_size(128*4096) == 160*4096,
|
||||||
|
+ is(7, threads->set_stack_size($size), $size_plus_quarter,
|
||||||
|
'Thread changes stack size');
|
||||||
|
- ok(8, threads->get_stack_size() == 128*4096,
|
||||||
|
+ is(8, threads->get_stack_size(), $size,
|
||||||
|
'Get stack size in thread');
|
||||||
|
- ok(9, threads->self()->get_stack_size() == 160*4096,
|
||||||
|
+ is(9, threads->self()->get_stack_size(), $size_plus_quarter,
|
||||||
|
'Thread stack size unchanged');
|
||||||
|
}
|
||||||
|
)->join();
|
||||||
|
|
||||||
|
-ok(10, threads->get_stack_size() == 128*4096,
|
||||||
|
+is(10, threads->get_stack_size(), $size,
|
||||||
|
'Default thread sized changed in thread');
|
||||||
|
|
||||||
|
threads->create(
|
||||||
|
- { 'stack' => 160*4096 },
|
||||||
|
+ { 'stack' => $size_plus_quarter },
|
||||||
|
sub {
|
||||||
|
- ok(11, threads->get_stack_size() == 128*4096,
|
||||||
|
+ is(11, threads->get_stack_size(), $size,
|
||||||
|
'Get stack size in thread');
|
||||||
|
- ok(12, threads->self()->get_stack_size() == 160*4096,
|
||||||
|
+ is(12, threads->self()->get_stack_size(), $size_plus_quarter,
|
||||||
|
'Thread gets own stack size');
|
||||||
|
}
|
||||||
|
)->join();
|
||||||
|
|
||||||
|
-my $thr = threads->create( { 'stack' => 160*4096 }, sub { } );
|
||||||
|
+my $thr = threads->create( { 'stack' => $size_plus_quarter }, sub { } );
|
||||||
|
|
||||||
|
$thr->create(
|
||||||
|
sub {
|
||||||
|
- ok(13, threads->get_stack_size() == 128*4096,
|
||||||
|
+ is(13, threads->get_stack_size(), $size,
|
||||||
|
'Get stack size in thread');
|
||||||
|
- ok(14, threads->self()->get_stack_size() == 160*4096,
|
||||||
|
+ is(14, threads->self()->get_stack_size(), $size_plus_quarter,
|
||||||
|
'Thread gets own stack size');
|
||||||
|
}
|
||||||
|
)->join();
|
||||||
|
|
||||||
|
+my $size_plus_eighth = $size * 1.125; # 128 frames map to 144
|
||||||
|
$thr->create(
|
||||||
|
- { 'stack' => 144*4096 },
|
||||||
|
+ { 'stack' => $size_plus_eighth },
|
||||||
|
sub {
|
||||||
|
- ok(15, threads->get_stack_size() == 128*4096,
|
||||||
|
+ is(15, threads->get_stack_size(), $size,
|
||||||
|
'Get stack size in thread');
|
||||||
|
- ok(16, threads->self()->get_stack_size() == 144*4096,
|
||||||
|
+ is(16, threads->self()->get_stack_size(), $size_plus_eighth,
|
||||||
|
'Thread gets own stack size');
|
||||||
|
- ok(17, threads->set_stack_size(160*4096) == 128*4096,
|
||||||
|
+ is(17, threads->set_stack_size($size_plus_quarter), $size,
|
||||||
|
'Thread changes stack size');
|
||||||
|
}
|
||||||
|
)->join();
|
||||||
|
|
||||||
|
$thr->join();
|
||||||
|
|
||||||
|
-ok(18, threads->get_stack_size() == 160*4096,
|
||||||
|
+is(18, threads->get_stack_size(), $size_plus_quarter,
|
||||||
|
'Default thread sized changed in thread');
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
diff --git a/t/stack_env.t b/t/stack_env.t
|
||||||
|
index e36812f..fdb38cc
|
||||||
|
--- a/t/stack_env.t
|
||||||
|
+++ b/t/stack_env.t
|
||||||
|
@@ -25,11 +25,36 @@ sub ok {
|
||||||
|
return ($ok);
|
||||||
|
}
|
||||||
|
|
||||||
|
+sub is {
|
||||||
|
+ my ($id, $got, $expected, $name) = @_;
|
||||||
|
+
|
||||||
|
+ my $ok = ok($id, $got == $expected, $name);
|
||||||
|
+ if (! $ok) {
|
||||||
|
+ print(" GOT: $got\n");
|
||||||
|
+ print("EXPECTED: $expected\n");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return ($ok);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+my $frame_size;
|
||||||
|
+my $frames;
|
||||||
|
+my $size;
|
||||||
|
+
|
||||||
|
BEGIN {
|
||||||
|
$| = 1;
|
||||||
|
print("1..4\n"); ### Number of tests that will be run ###
|
||||||
|
|
||||||
|
- $ENV{'PERL5_ITHREADS_STACK_SIZE'} = 128*4096;
|
||||||
|
+ # XXX Note that if the default stack size happens to be the same as these
|
||||||
|
+ # numbers, that test 2 would return success just out of happenstance.
|
||||||
|
+ # This possibility could be lessened by choosing $frames to be something
|
||||||
|
+ # less likely than a power of 2
|
||||||
|
+
|
||||||
|
+ $frame_size = 4096;
|
||||||
|
+ $frames = 128;
|
||||||
|
+ $size = $frames * $frame_size;
|
||||||
|
+
|
||||||
|
+ $ENV{'PERL5_ITHREADS_STACK_SIZE'} = $size;
|
||||||
|
};
|
||||||
|
|
||||||
|
use threads;
|
||||||
|
@@ -37,11 +62,22 @@ ok(1, 1, 'Loaded');
|
||||||
|
|
||||||
|
### Start of Testing ###
|
||||||
|
|
||||||
|
-ok(2, threads->get_stack_size() == 128*4096,
|
||||||
|
- '$ENV{PERL5_ITHREADS_STACK_SIZE}');
|
||||||
|
-ok(3, threads->set_stack_size(144*4096) == 128*4096,
|
||||||
|
+my $actual_size = threads->get_stack_size();
|
||||||
|
+
|
||||||
|
+{
|
||||||
|
+ if ($actual_size > $size) {
|
||||||
|
+ print("ok 2 # skip because system needs larger minimum stack size\n");
|
||||||
|
+ $size = $actual_size;
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ is(2, $actual_size, $size, '$ENV{PERL5_ITHREADS_STACK_SIZE}');
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+my $size_plus_eighth = $size * 1.125; # 128 frames map to 144
|
||||||
|
+is(3, threads->set_stack_size($size_plus_eighth), $size,
|
||||||
|
'Set returns previous value');
|
||||||
|
-ok(4, threads->get_stack_size() == 144*4096,
|
||||||
|
+is(4, threads->get_stack_size(), $size_plus_eighth,
|
||||||
|
'Get stack size');
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
diff --git a/t/thread.t b/t/thread.t
|
||||||
|
index 4dc1a29..8a56bb6
|
||||||
|
--- a/t/thread.t
|
||||||
|
+++ b/t/thread.t
|
||||||
|
@@ -11,6 +11,7 @@ BEGIN {
|
||||||
|
}
|
||||||
|
|
||||||
|
use ExtUtils::testlib;
|
||||||
|
+use Data::Dumper;
|
||||||
|
|
||||||
|
use threads;
|
||||||
|
|
||||||
|
@@ -156,7 +157,8 @@ package main;
|
||||||
|
rand(10);
|
||||||
|
threads->create( sub { $rand{int(rand(10000000000))}++ } ) foreach 1..25;
|
||||||
|
$_->join foreach threads->list;
|
||||||
|
- ok((keys %rand >= 23), "Check that rand() is randomized in new threads");
|
||||||
|
+ ok((keys %rand >= 23), "Check that rand() is randomized in new threads")
|
||||||
|
+ or diag Dumper(\%rand);
|
||||||
|
}
|
||||||
|
|
||||||
|
# bugid #24165
|
||||||
|
diff --git a/t/version.t b/t/version.t
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..fb91309
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/t/version.t
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+use strict;
|
||||||
|
+use warnings;
|
||||||
|
+use Test::More;
|
||||||
|
+
|
||||||
|
+BEGIN {
|
||||||
|
+ use Config;
|
||||||
|
+ if (! $Config{'useithreads'}) {
|
||||||
|
+ print("1..0 # SKIP Perl not compiled with 'useithreads'\n");
|
||||||
|
+ exit(0);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+use threads;
|
||||||
|
+
|
||||||
|
+# test that the version documented in threads.pm pod matches
|
||||||
|
+# that of the code.
|
||||||
|
+
|
||||||
|
+open my $fh, "<", $INC{"threads.pm"}
|
||||||
|
+ or die qq(Failed to open '$INC{"threads.pm"}': $!);
|
||||||
|
+my $file= do { local $/; <$fh> };
|
||||||
|
+close $fh;
|
||||||
|
+my $pod_version = 0;
|
||||||
|
+if ($file=~/This document describes threads version (\d.\d+)/) {
|
||||||
|
+ $pod_version = $1;
|
||||||
|
+}
|
||||||
|
+is($pod_version, $threads::VERSION,
|
||||||
|
+ "Check that pod and \$threads::VERSION match");
|
||||||
|
+done_testing();
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
diff --git a/threads.h b/threads.h
|
||||||
|
index bdfab49..e69de29 100644
|
||||||
|
--- a/threads.h
|
||||||
|
+++ b/threads.h
|
||||||
|
@@ -1,31 +0,0 @@
|
||||||
|
-#ifndef _THREADS_H_
|
||||||
|
-#define _THREADS_H_
|
||||||
|
-
|
||||||
|
-/* Needed for 5.8.0 */
|
||||||
|
-#ifndef CLONEf_JOIN_IN
|
||||||
|
-# define CLONEf_JOIN_IN 8
|
||||||
|
-#endif
|
||||||
|
-#ifndef SAVEBOOL
|
||||||
|
-# define SAVEBOOL(a)
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
-/* Added in 5.11.x */
|
||||||
|
-#ifndef G_WANT
|
||||||
|
-# define G_WANT (128|1)
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
-/* Added in 5.24.x */
|
||||||
|
-#ifndef PERL_TSA_RELEASE
|
||||||
|
-# define PERL_TSA_RELEASE(x)
|
||||||
|
-#endif
|
||||||
|
-#ifndef PERL_TSA_EXCLUDES
|
||||||
|
-# define PERL_TSA_EXCLUDES(x)
|
||||||
|
-#endif
|
||||||
|
-#ifndef CLANG_DIAG_IGNORE
|
||||||
|
-# define CLANG_DIAG_IGNORE(x)
|
||||||
|
-#endif
|
||||||
|
-#ifndef CLANG_DIAG_RESTORE
|
||||||
|
-# define CLANG_DIAG_RESTORE
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
-#endif
|
||||||
|
diff --git a/threads.xs b/threads.xs
|
||||||
|
index 4e9e31f..b128f53 100644
|
||||||
|
--- a/threads.xs
|
||||||
|
+++ b/threads.xs
|
||||||
|
@@ -1,32 +1,22 @@
|
||||||
|
#define PERL_NO_GET_CONTEXT
|
||||||
|
-/* Workaround for mingw 32-bit compiler by mingw-w64.sf.net - has to come before any #include.
|
||||||
|
- * It also defines USE_NO_MINGW_SETJMP_TWO_ARGS for the mingw.org 32-bit compilers ... but
|
||||||
|
- * that's ok as that compiler makes no use of that symbol anyway */
|
||||||
|
-#if defined(WIN32) && defined(__MINGW32__) && !defined(__MINGW64__)
|
||||||
|
-# define USE_NO_MINGW_SETJMP_TWO_ARGS 1
|
||||||
|
-#endif
|
||||||
|
+/* Tell XSUB.h not to redefine common functions. Its setjmp() override has a
|
||||||
|
+ * circular definition in Perls < 5.40. */
|
||||||
|
+#define NO_XSLOCKS
|
||||||
|
+
|
||||||
|
#include "EXTERN.h"
|
||||||
|
#include "perl.h"
|
||||||
|
#include "XSUB.h"
|
||||||
|
-/* Workaround for XSUB.h bug under WIN32 */
|
||||||
|
-#ifdef WIN32
|
||||||
|
-# undef setjmp
|
||||||
|
-# if defined(USE_NO_MINGW_SETJMP_TWO_ARGS) || (!defined(__BORLANDC__) && !defined(__MINGW64__))
|
||||||
|
-# define setjmp(x) _setjmp(x)
|
||||||
|
-# endif
|
||||||
|
-# if defined(__MINGW64__)
|
||||||
|
-# define setjmp(x) _setjmpex((x), mingw_getsp())
|
||||||
|
-# endif
|
||||||
|
-#endif
|
||||||
|
-#ifdef HAS_PPPORT_H
|
||||||
|
-# define NEED_PL_signals
|
||||||
|
-# define NEED_sv_2pv_flags
|
||||||
|
-# include "ppport.h"
|
||||||
|
-# include "threads.h"
|
||||||
|
-#endif
|
||||||
|
+
|
||||||
|
+#define NEED_PL_signals
|
||||||
|
+#define NEED_sv_2pv_flags
|
||||||
|
+#include "ppport.h"
|
||||||
|
+#include "threads.h"
|
||||||
|
#ifndef sv_dup_inc
|
||||||
|
# define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
|
||||||
|
#endif
|
||||||
|
+#ifndef SvREFCNT_dec_NN
|
||||||
|
+# define SvREFCNT_dec_NN(x) SvREFCNT_dec(x)
|
||||||
|
+#endif
|
||||||
|
#ifndef PERL_UNUSED_RESULT
|
||||||
|
# if defined(__GNUC__) && defined(HASATTRIBUTE_WARN_UNUSED_RESULT)
|
||||||
|
# define PERL_UNUSED_RESULT(v) STMT_START { __typeof__(v) z = (v); (void)sizeof(z); } STMT_END
|
||||||
|
@@ -91,8 +81,8 @@ typedef perl_os_thread pthread_t;
|
||||||
|
typedef struct _ithread {
|
||||||
|
struct _ithread *next; /* Next thread in the list */
|
||||||
|
struct _ithread *prev; /* Prev thread in the list */
|
||||||
|
- PerlInterpreter *interp; /* The threads interpreter */
|
||||||
|
- UV tid; /* Threads module's thread id */
|
||||||
|
+ PerlInterpreter *interp; /* The thread's interpreter */
|
||||||
|
+ UV tid; /* Thread's module's thread id */
|
||||||
|
perl_mutex mutex; /* Mutex for updating things in this struct */
|
||||||
|
int count; /* Reference count. See S_ithread_create. */
|
||||||
|
int state; /* Detached, joined, finished, etc. */
|
||||||
|
@@ -241,18 +231,31 @@ S_ithread_clear(pTHX_ ithread *thread)
|
||||||
|
S_block_most_signals(&origmask);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#if PERL_VERSION_GE(5, 37, 5)
|
||||||
|
+ int save_veto = PL_veto_switch_non_tTHX_context;
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
interp = thread->interp;
|
||||||
|
if (interp) {
|
||||||
|
dTHXa(interp);
|
||||||
|
|
||||||
|
+ /* We will pretend to be a thread that we are not by switching tTHX,
|
||||||
|
+ * which doesn't work with things that don't rely on tTHX during
|
||||||
|
+ * tear-down, as they will tend to rely on a mapping from the tTHX
|
||||||
|
+ * structure, and that structure is being destroyed. */
|
||||||
|
+#if PERL_VERSION_GE(5, 37, 5)
|
||||||
|
+ PL_veto_switch_non_tTHX_context = true;
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
PERL_SET_CONTEXT(interp);
|
||||||
|
+
|
||||||
|
S_ithread_set(aTHX_ thread);
|
||||||
|
|
||||||
|
SvREFCNT_dec(thread->params);
|
||||||
|
thread->params = NULL;
|
||||||
|
|
||||||
|
if (thread->err) {
|
||||||
|
- SvREFCNT_dec(thread->err);
|
||||||
|
+ SvREFCNT_dec_NN(thread->err);
|
||||||
|
thread->err = Nullsv;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -262,6 +265,10 @@ S_ithread_clear(pTHX_ ithread *thread)
|
||||||
|
}
|
||||||
|
|
||||||
|
PERL_SET_CONTEXT(aTHX);
|
||||||
|
+#if PERL_VERSION_GE(5, 37, 5)
|
||||||
|
+ PL_veto_switch_non_tTHX_context = save_veto;
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#ifdef THREAD_SIGNAL_BLOCKING
|
||||||
|
S_set_sigmask(&origmask);
|
||||||
|
#endif
|
||||||
|
@@ -421,7 +428,7 @@ STATIC const MGVTBL ithread_vtbl = {
|
||||||
|
ithread_mg_free, /* free */
|
||||||
|
0, /* copy */
|
||||||
|
ithread_mg_dup, /* dup */
|
||||||
|
-#if (PERL_VERSION > 8) || (PERL_VERSION == 8 && PERL_SUBVERSION > 8)
|
||||||
|
+#if PERL_VERSION_GT(5,8,8)
|
||||||
|
0 /* local */
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
@@ -525,11 +532,11 @@ S_jmpenv_run(pTHX_ int action, ithread *thread,
|
||||||
|
return jmp_rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
-
|
||||||
|
/* Starts executing the thread.
|
||||||
|
* Passed as the C level function to run in the new thread.
|
||||||
|
*/
|
||||||
|
#ifdef WIN32
|
||||||
|
+PERL_STACK_REALIGN
|
||||||
|
STATIC THREAD_RET_TYPE
|
||||||
|
S_ithread_run(LPVOID arg)
|
||||||
|
#else
|
||||||
|
@@ -580,6 +587,8 @@ S_ithread_run(void * arg)
|
||||||
|
S_set_sigmask(&thread->initial_sigmask);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+ thread_locale_init();
|
||||||
|
+
|
||||||
|
PL_perl_destruct_level = 2;
|
||||||
|
|
||||||
|
{
|
||||||
|
@@ -588,16 +597,26 @@ S_ithread_run(void * arg)
|
||||||
|
int ii;
|
||||||
|
int jmp_rc;
|
||||||
|
|
||||||
|
- dSP;
|
||||||
|
+#ifdef PERL_RC_STACK
|
||||||
|
+ assert(rpp_stack_is_rc());
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
ENTER;
|
||||||
|
SAVETMPS;
|
||||||
|
|
||||||
|
/* Put args on the stack */
|
||||||
|
- PUSHMARK(SP);
|
||||||
|
+ PUSHMARK(PL_stack_sp);
|
||||||
|
for (ii=0; ii < len; ii++) {
|
||||||
|
- XPUSHs(av_shift(params));
|
||||||
|
+ SV *sv = av_shift(params);
|
||||||
|
+#ifdef PERL_RC_STACK
|
||||||
|
+ rpp_xpush_1(sv);
|
||||||
|
+#else
|
||||||
|
+ /* temporary workaround until rpp_* are in ppport.h */
|
||||||
|
+ dSP;
|
||||||
|
+ XPUSHs(sv);
|
||||||
|
+ PUTBACK;
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
- PUTBACK;
|
||||||
|
|
||||||
|
jmp_rc = S_jmpenv_run(aTHX_ 0, thread, &len, &exit_app, &exit_code);
|
||||||
|
|
||||||
|
@@ -610,12 +629,17 @@ S_ithread_run(void * arg)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Remove args from stack and put back in params array */
|
||||||
|
- SPAGAIN;
|
||||||
|
for (ii=len-1; ii >= 0; ii--) {
|
||||||
|
- SV *sv = POPs;
|
||||||
|
+ SV *sv = *PL_stack_sp;
|
||||||
|
if (jmp_rc == 0 && (thread->gimme & G_WANT) != G_VOID) {
|
||||||
|
av_store(params, ii, SvREFCNT_inc(sv));
|
||||||
|
}
|
||||||
|
+#ifdef PERL_RC_STACK
|
||||||
|
+ rpp_popfree_1();
|
||||||
|
+#else
|
||||||
|
+ /* temporary workaround until rpp_* are in ppport.h */
|
||||||
|
+ PL_stack_sp--;
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
FREETMPS;
|
||||||
|
@@ -665,6 +689,8 @@ S_ithread_run(void * arg)
|
||||||
|
MUTEX_UNLOCK(&thread->mutex);
|
||||||
|
MUTEX_UNLOCK(&MY_POOL.create_destruct_mutex);
|
||||||
|
|
||||||
|
+ thread_locale_term();
|
||||||
|
+
|
||||||
|
/* Exit application if required */
|
||||||
|
if (exit_app) {
|
||||||
|
(void)S_jmpenv_run(aTHX_ 2, thread, NULL, &exit_app, &exit_code);
|
||||||
|
@@ -672,7 +698,7 @@ S_ithread_run(void * arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* At this point, the interpreter may have been freed, so call
|
||||||
|
- * free in the the context of of the 'main' interpreter which
|
||||||
|
+ * free in the context of the 'main' interpreter which
|
||||||
|
* can't have been freed due to the veto_cleanup mechanism.
|
||||||
|
*/
|
||||||
|
aTHX = MY_POOL.main_thread.interp;
|
||||||
|
@@ -747,7 +773,7 @@ S_ithread_create(
|
||||||
|
AV *params;
|
||||||
|
SV **array;
|
||||||
|
|
||||||
|
-#if PERL_VERSION <= 8 && PERL_SUBVERSION <= 7
|
||||||
|
+#if PERL_VERSION_LE(5,8,7)
|
||||||
|
SV **tmps_tmp = PL_tmps_stack;
|
||||||
|
IV tmps_ix = PL_tmps_ix;
|
||||||
|
#endif
|
||||||
|
@@ -770,7 +796,8 @@ S_ithread_create(
|
||||||
|
int fd = PerlIO_fileno(Perl_error_log);
|
||||||
|
if (fd >= 0) {
|
||||||
|
/* If there's no error_log, we cannot scream about it missing. */
|
||||||
|
- PERL_UNUSED_RESULT(PerlLIO_write(fd, PL_no_mem, strlen(PL_no_mem)));
|
||||||
|
+ static const char oomp[] = "Out of memory in perl:threads:ithread_create\n";
|
||||||
|
+ PERL_UNUSED_RESULT(PerlLIO_write(fd, oomp, sizeof oomp - 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
my_exit(1);
|
||||||
|
@@ -803,6 +830,7 @@ S_ithread_create(
|
||||||
|
thread->gimme = gimme;
|
||||||
|
thread->state = exit_opt;
|
||||||
|
|
||||||
|
+
|
||||||
|
/* "Clone" our interpreter into the thread's interpreter.
|
||||||
|
* This gives thread access to "static data" and code.
|
||||||
|
*/
|
||||||
|
@@ -845,7 +873,7 @@ S_ithread_create(
|
||||||
|
* context for the duration of our work for new interpreter.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
-#if (PERL_VERSION > 13) || (PERL_VERSION == 13 && PERL_SUBVERSION > 1)
|
||||||
|
+#if PERL_VERSION_GE(5,13,2)
|
||||||
|
CLONE_PARAMS *clone_param = Perl_clone_params_new(aTHX, thread->interp);
|
||||||
|
#else
|
||||||
|
CLONE_PARAMS clone_param_s;
|
||||||
|
@@ -855,7 +883,7 @@ S_ithread_create(
|
||||||
|
|
||||||
|
MY_CXT_CLONE;
|
||||||
|
|
||||||
|
-#if (PERL_VERSION < 13) || (PERL_VERSION == 13 && PERL_SUBVERSION <= 1)
|
||||||
|
+#if PERL_VERSION_LT(5,13,2)
|
||||||
|
clone_param->flags = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@@ -882,7 +910,7 @@ S_ithread_create(
|
||||||
|
perl_clone() and sv_dup_inc(). Hence copy the parameters
|
||||||
|
somewhere under our control first, before duplicating. */
|
||||||
|
if (num_params) {
|
||||||
|
-#if (PERL_VERSION > 8)
|
||||||
|
+#if PERL_VERSION_GE(5,9,0)
|
||||||
|
Copy(parent_perl->Istack_base + params_start, array, num_params, SV *);
|
||||||
|
#else
|
||||||
|
Copy(parent_perl->Tstack_base + params_start, array, num_params, SV *);
|
||||||
|
@@ -893,11 +921,11 @@ S_ithread_create(
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-#if (PERL_VERSION > 13) || (PERL_VERSION == 13 && PERL_SUBVERSION > 1)
|
||||||
|
+#if PERL_VERSION_GE(5,13,2)
|
||||||
|
Perl_clone_params_del(clone_param);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-#if PERL_VERSION <= 8 && PERL_SUBVERSION <= 7
|
||||||
|
+#if PERL_VERSION_LT(5,8,8)
|
||||||
|
/* The code below checks that anything living on the tmps stack and
|
||||||
|
* has been cloned (so it lives in the ptr_table) has a refcount
|
||||||
|
* higher than 0.
|
||||||
|
@@ -1030,10 +1058,10 @@ S_ithread_create(
|
||||||
|
MUTEX_UNLOCK(&my_pool->create_destruct_mutex);
|
||||||
|
return (thread);
|
||||||
|
|
||||||
|
- CLANG_DIAG_IGNORE_STMT(-Wthread-safety);
|
||||||
|
+ CLANG_DIAG_IGNORE(-Wthread-safety)
|
||||||
|
/* warning: mutex 'thread->mutex' is not held on every path through here [-Wthread-safety-analysis] */
|
||||||
|
}
|
||||||
|
-CLANG_DIAG_RESTORE_DECL;
|
||||||
|
+CLANG_DIAG_RESTORE
|
||||||
|
|
||||||
|
#endif /* USE_ITHREADS */
|
||||||
|
|
||||||
|
@@ -1111,7 +1139,7 @@ ithread_create(...)
|
||||||
|
case 'A':
|
||||||
|
case 'l':
|
||||||
|
case 'L':
|
||||||
|
- context = G_ARRAY;
|
||||||
|
+ context = G_LIST;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
case 'S':
|
||||||
|
@@ -1126,11 +1154,11 @@ ithread_create(...)
|
||||||
|
}
|
||||||
|
} else if ((svp = hv_fetchs(specs, "array", 0))) {
|
||||||
|
if (SvTRUE(*svp)) {
|
||||||
|
- context = G_ARRAY;
|
||||||
|
+ context = G_LIST;
|
||||||
|
}
|
||||||
|
} else if ((svp = hv_fetchs(specs, "list", 0))) {
|
||||||
|
if (SvTRUE(*svp)) {
|
||||||
|
- context = G_ARRAY;
|
||||||
|
+ context = G_LIST;
|
||||||
|
}
|
||||||
|
} else if ((svp = hv_fetchs(specs, "scalar", 0))) {
|
||||||
|
if (SvTRUE(*svp)) {
|
||||||
|
@@ -1152,7 +1180,7 @@ ithread_create(...)
|
||||||
|
if (context == -1) {
|
||||||
|
context = GIMME_V; /* Implicit context */
|
||||||
|
} else {
|
||||||
|
- context |= (GIMME_V & (~(G_ARRAY|G_SCALAR|G_VOID)));
|
||||||
|
+ context |= (GIMME_V & (~(G_LIST|G_SCALAR|G_VOID)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create thread */
|
||||||
|
@@ -1167,6 +1195,7 @@ ithread_create(...)
|
||||||
|
if (! thread) {
|
||||||
|
XSRETURN_UNDEF; /* Mutex already unlocked */
|
||||||
|
}
|
||||||
|
+ PERL_SRAND_OVERRIDE_NEXT_PARENT();
|
||||||
|
ST(0) = sv_2mortal(S_ithread_to_SV(aTHX_ Nullsv, thread, classname, FALSE));
|
||||||
|
|
||||||
|
/* Let thread run. */
|
||||||
|
@@ -1175,7 +1204,6 @@ ithread_create(...)
|
||||||
|
/* warning: releasing mutex 'thread->mutex' that was not held [-Wthread-safety-analysis] */
|
||||||
|
MUTEX_UNLOCK(&thread->mutex);
|
||||||
|
CLANG_DIAG_RESTORE_STMT;
|
||||||
|
-
|
||||||
|
/* XSRETURN(1); - implied */
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1197,7 +1225,7 @@ ithread_list(...)
|
||||||
|
classname = (char *)SvPV_nolen(ST(0));
|
||||||
|
|
||||||
|
/* Calling context */
|
||||||
|
- list_context = (GIMME_V == G_ARRAY);
|
||||||
|
+ list_context = (GIMME_V == G_LIST);
|
||||||
|
|
||||||
|
/* Running or joinable parameter */
|
||||||
|
if (items > 1) {
|
||||||
|
@@ -1335,7 +1363,7 @@ ithread_join(...)
|
||||||
|
/* Get the return value from the call_sv */
|
||||||
|
/* Objects do not survive this process - FIXME */
|
||||||
|
if ((thread->gimme & G_WANT) != G_VOID) {
|
||||||
|
-#if (PERL_VERSION < 13) || (PERL_VERSION == 13 && PERL_SUBVERSION <= 1)
|
||||||
|
+#if PERL_VERSION_LT(5,13,2)
|
||||||
|
AV *params_copy;
|
||||||
|
PerlInterpreter *other_perl;
|
||||||
|
CLONE_PARAMS clone_params;
|
||||||
|
@@ -1562,11 +1590,15 @@ ithread_object(...)
|
||||||
|
}
|
||||||
|
classname = (char *)SvPV_nolen(ST(0));
|
||||||
|
|
||||||
|
+ if (items < 2) {
|
||||||
|
+ XSRETURN_UNDEF;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Turn $tid from PVLV to SV if needed (bug #73330) */
|
||||||
|
arg = ST(1);
|
||||||
|
SvGETMAGIC(arg);
|
||||||
|
|
||||||
|
- if ((items < 2) || ! SvOK(arg)) {
|
||||||
|
+ if (! SvOK(arg)) {
|
||||||
|
XSRETURN_UNDEF;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1722,9 +1754,9 @@ ithread_wantarray(...)
|
||||||
|
CODE:
|
||||||
|
PERL_UNUSED_VAR(items);
|
||||||
|
thread = S_SV_to_ithread(aTHX_ ST(0));
|
||||||
|
- ST(0) = ((thread->gimme & G_WANT) == G_ARRAY) ? &PL_sv_yes :
|
||||||
|
- ((thread->gimme & G_WANT) == G_VOID) ? &PL_sv_undef
|
||||||
|
- /* G_SCALAR */ : &PL_sv_no;
|
||||||
|
+ ST(0) = ((thread->gimme & G_WANT) == G_LIST) ? &PL_sv_yes :
|
||||||
|
+ ((thread->gimme & G_WANT) == G_VOID) ? &PL_sv_undef
|
||||||
|
+ /* G_SCALAR */ : &PL_sv_no;
|
||||||
|
/* XSRETURN(1); - implied */
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1762,7 +1794,7 @@ ithread_error(...)
|
||||||
|
|
||||||
|
/* If thread died, then clone the error into the calling thread */
|
||||||
|
if (thread->state & PERL_ITHR_DIED) {
|
||||||
|
-#if (PERL_VERSION < 13) || (PERL_VERSION == 13 && PERL_SUBVERSION <= 1)
|
||||||
|
+#if PERL_VERSION_LT(5,13,2)
|
||||||
|
PerlInterpreter *other_perl;
|
||||||
|
CLONE_PARAMS clone_params;
|
||||||
|
ithread *current_thread;
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,378 @@
|
|||||||
|
%global base_version 2.21
|
||||||
|
Name: perl-threads
|
||||||
|
Epoch: 1
|
||||||
|
Version: 2.40
|
||||||
|
Release: 510%{?dist}
|
||||||
|
Summary: Perl interpreter-based threads
|
||||||
|
License: GPL-1.0-or-later OR Artistic-1.0-Perl
|
||||||
|
URL: https://metacpan.org/release/threads
|
||||||
|
Source0: https://cpan.metacpan.org/authors/id/J/JD/JDHEDDEN/threads-%{base_version}.tar.gz
|
||||||
|
# Unbundled from perl 5.40.0-RC1
|
||||||
|
Patch0: threads-2.21-Upgrade-to-2.40.patch
|
||||||
|
BuildRequires: coreutils
|
||||||
|
BuildRequires: findutils
|
||||||
|
BuildRequires: gcc
|
||||||
|
BuildRequires: make
|
||||||
|
BuildRequires: perl-devel
|
||||||
|
BuildRequires: perl-generators
|
||||||
|
BuildRequires: perl-interpreter
|
||||||
|
BuildRequires: perl(Config)
|
||||||
|
BuildRequires: perl(Devel::PPPort)
|
||||||
|
BuildRequires: perl(ExtUtils::MakeMaker) >= 6.76
|
||||||
|
BuildRequires: perl(File::Spec)
|
||||||
|
BuildRequires: perl(strict)
|
||||||
|
BuildRequires: perl(warnings)
|
||||||
|
# Run-time:
|
||||||
|
BuildRequires: perl(Carp)
|
||||||
|
BuildRequires: perl(overload)
|
||||||
|
BuildRequires: perl(XSLoader)
|
||||||
|
# Tests only:
|
||||||
|
BuildRequires: perl(blib)
|
||||||
|
BuildRequires: perl(Cwd)
|
||||||
|
BuildRequires: perl(Data::Dumper)
|
||||||
|
BuildRequires: perl(ExtUtils::testlib)
|
||||||
|
BuildRequires: perl(File::Path)
|
||||||
|
BuildRequires: perl(Hash::Util)
|
||||||
|
BuildRequires: perl(IO::File)
|
||||||
|
BuildRequires: perl(Test::More)
|
||||||
|
# Optional tests:
|
||||||
|
BuildRequires: procps-ng
|
||||||
|
BuildRequires: perl(Thread::Queue)
|
||||||
|
BuildRequires: perl(Thread::Semaphore)
|
||||||
|
BuildRequires: perl(threads::shared)
|
||||||
|
Requires: perl(Carp)
|
||||||
|
|
||||||
|
%{?perl_default_filter}
|
||||||
|
|
||||||
|
%description
|
||||||
|
Since Perl 5.8, thread programming has been available using a model called
|
||||||
|
interpreter threads which provides a new Perl interpreter for each thread,
|
||||||
|
and, by default, results in no data or state information being shared
|
||||||
|
between threads.
|
||||||
|
|
||||||
|
(Prior to Perl 5.8, 5005threads was available through the "Thread.pm" API.
|
||||||
|
This threading model has been deprecated, and was removed as of Perl 5.10.0.)
|
||||||
|
|
||||||
|
%package tests
|
||||||
|
Summary: Tests for %{name}
|
||||||
|
Requires: %{name} = %{?epoch:%{epoch}:}%{version}-%{release}
|
||||||
|
Requires: perl-Test-Harness
|
||||||
|
# Optional tests:
|
||||||
|
Requires: procps-ng
|
||||||
|
Requires: perl(Thread::Queue)
|
||||||
|
Requires: perl(Thread::Semaphore)
|
||||||
|
Requires: perl(threads::shared)
|
||||||
|
|
||||||
|
%description tests
|
||||||
|
Tests from %{name}. Execute them
|
||||||
|
with "%{_libexecdir}/%{name}/test".
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%setup -q -n threads-%{base_version}
|
||||||
|
%patch -P0 -p1
|
||||||
|
chmod -x examples/*
|
||||||
|
|
||||||
|
# Generate ppport.h
|
||||||
|
perl -MDevel::PPPort \
|
||||||
|
-e "Devel::PPPort::WriteFile() or die 'Could not generate ppport.h: $!'"
|
||||||
|
|
||||||
|
# Help generators to recognize Perl scripts
|
||||||
|
for F in t/*.t; do
|
||||||
|
perl -i -MConfig -ple 'print $Config{startperl} if $. == 1 && !s{\A#!.*perl\b}{$Config{startperl}}' "$F"
|
||||||
|
chmod +x "$F"
|
||||||
|
done
|
||||||
|
|
||||||
|
%build
|
||||||
|
perl Makefile.PL INSTALLDIRS=vendor NO_PACKLIST=1 NO_PERLLOCAL=1 OPTIMIZE="%{optflags}"
|
||||||
|
%{make_build}
|
||||||
|
|
||||||
|
%install
|
||||||
|
%{make_install}
|
||||||
|
find %{buildroot} -type f -name '*.bs' -size 0 -delete
|
||||||
|
%{_fixperms} %{buildroot}/*
|
||||||
|
|
||||||
|
# Install tests
|
||||||
|
mkdir -p %{buildroot}%{_libexecdir}/%{name}
|
||||||
|
cp -a t %{buildroot}%{_libexecdir}/%{name}
|
||||||
|
perl -i -ple "s{ '-Mblib' }{}" %{buildroot}%{_libexecdir}/%{name}/t/exit.t
|
||||||
|
perl -i -ple "s{ '-Mblib' }{}" %{buildroot}%{_libexecdir}/%{name}/t/thread.t
|
||||||
|
cat > %{buildroot}%{_libexecdir}/%{name}/test << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
# Some tests write into temporary files/directories.
|
||||||
|
DIR=$(mktemp -d)
|
||||||
|
pushd "$DIR"
|
||||||
|
cp -a %{_libexecdir}/%{name}/* ./
|
||||||
|
unset GIT_DIR PERL_BUILD_PACKAGING PERL_CORE PERL_RUNPERL_DEBUG \
|
||||||
|
PERL5_ITHREADS_STACK_SIZE RUN_MAINTAINER_TESTS
|
||||||
|
prove -I . -j "$(getconf _NPROCESSORS_ONLN)"
|
||||||
|
popd
|
||||||
|
rm -rf "$DIR"
|
||||||
|
EOF
|
||||||
|
chmod +x %{buildroot}%{_libexecdir}/%{name}/test
|
||||||
|
|
||||||
|
%check
|
||||||
|
unset GIT_DIR PERL_BUILD_PACKAGING PERL_CORE PERL_RUNPERL_DEBUG \
|
||||||
|
PERL5_ITHREADS_STACK_SIZE RUN_MAINTAINER_TESTS
|
||||||
|
export HARNESS_OPTIONS=j$(perl -e 'if ($ARGV[0] =~ /.*-j([0-9][0-9]*).*/) {print $1} else {print 1}' -- '%{?_smp_mflags}')
|
||||||
|
make test
|
||||||
|
|
||||||
|
%files
|
||||||
|
%doc Changes examples README
|
||||||
|
%{perl_vendorarch}/auto/threads*
|
||||||
|
%{perl_vendorarch}/threads*
|
||||||
|
%{_mandir}/man3/threads*
|
||||||
|
|
||||||
|
%files tests
|
||||||
|
%{_libexecdir}/%{name}
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
* Thu Jul 18 2024 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.40-510
|
||||||
|
- Increase release to favour standalone package
|
||||||
|
|
||||||
|
* Thu Jul 18 2024 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.40-504
|
||||||
|
- Upgrade to 2.40 as provided in perl-5.40.0-RC1
|
||||||
|
|
||||||
|
* Mon Jun 24 2024 Troy Dawson <tdawson@redhat.com> - 1:2.36-504
|
||||||
|
- Bump release for June 2024 mass rebuild
|
||||||
|
|
||||||
|
* Thu Feb 01 2024 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.36-503
|
||||||
|
- Package tests
|
||||||
|
|
||||||
|
* Thu Jan 25 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.36-502
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||||
|
|
||||||
|
* Sun Jan 21 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.36-501
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||||
|
|
||||||
|
* Fri Jul 21 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.36-500
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu May 18 2023 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.36-499
|
||||||
|
- Upgrade to 2.36 as provided in perl-5.37.11
|
||||||
|
|
||||||
|
* Fri Jan 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.27-490
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
|
||||||
|
|
||||||
|
* Fri Jul 22 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.27-489
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
|
||||||
|
|
||||||
|
* Mon May 30 2022 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.27-488
|
||||||
|
- Upgrade to 2.27 as provided in perl-5.35.11
|
||||||
|
|
||||||
|
* Fri Jan 21 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.26-449
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
|
||||||
|
|
||||||
|
* Tue Jul 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.26-448
|
||||||
|
- Second attempt - Rebuilt for
|
||||||
|
https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
|
||||||
|
|
||||||
|
* Fri May 21 2021 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.26-477
|
||||||
|
- Upgrade to 2.26 as provided in perl-5.34.0
|
||||||
|
|
||||||
|
* Wed Jan 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.25-458
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
|
||||||
|
|
||||||
|
* Tue Jul 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.25-457
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
|
||||||
|
|
||||||
|
* Mon Jun 22 2020 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.25-456
|
||||||
|
- Upgrade to 2.25 as provided in perl-5.32.0
|
||||||
|
|
||||||
|
* Thu Feb 06 2020 Petr Pisar <ppisar@redhat.com> - 1:2.22-442
|
||||||
|
- Specify all dependencies
|
||||||
|
|
||||||
|
* Thu Feb 06 2020 Tom Stellard <tstellar@redhat.com> - 1:2.22-441
|
||||||
|
- Spec file cleanups: Use make_build and make_install macros
|
||||||
|
- https://docs.fedoraproject.org/en-US/packaging-guidelines/#_parallel_make
|
||||||
|
- https://fedoraproject.org/wiki/Perl/Tips#ExtUtils::MakeMake
|
||||||
|
|
||||||
|
* Thu Jan 30 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.22-440
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
|
||||||
|
|
||||||
|
* Fri Jul 26 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.22-439
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu May 30 2019 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.22-438
|
||||||
|
- Increase release to favour standalone package
|
||||||
|
|
||||||
|
* Sat Feb 02 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.22-418
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
|
||||||
|
|
||||||
|
* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.22-417
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
|
||||||
|
|
||||||
|
* Wed Jun 27 2018 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.22-416
|
||||||
|
- Upgrade to 2.22 as provided in perl-5.28.0
|
||||||
|
- Perl 5.28 rebuild
|
||||||
|
|
||||||
|
* Fri Feb 09 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.21-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
|
||||||
|
|
||||||
|
* Wed Jan 24 2018 Petr Pisar <ppisar@redhat.com> - 1:2.21-1
|
||||||
|
- 2.21 bump
|
||||||
|
|
||||||
|
* Thu Aug 03 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.16-4
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Jul 27 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.16-3
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
|
||||||
|
|
||||||
|
* Wed Jun 07 2017 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.16-2
|
||||||
|
- Perl 5.26 re-rebuild of bootstrapped packages
|
||||||
|
|
||||||
|
* Mon Jun 05 2017 Petr Pisar <ppisar@redhat.com> - 1:2.16-1
|
||||||
|
- 2.16 bump
|
||||||
|
|
||||||
|
* Sat Jun 03 2017 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.15-393
|
||||||
|
- Perl 5.26 rebuild
|
||||||
|
|
||||||
|
* Mon Feb 27 2017 Petr Pisar <ppisar@redhat.com> - 1:2.15-1
|
||||||
|
- 2.15 bump
|
||||||
|
|
||||||
|
* Sat Feb 11 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.12-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
|
||||||
|
|
||||||
|
* Mon Jan 02 2017 Petr Pisar <ppisar@redhat.com> - 1:2.12-1
|
||||||
|
- 2.12 bump
|
||||||
|
|
||||||
|
* Mon May 23 2016 Petr Pisar <ppisar@redhat.com> - 1:2.09-1
|
||||||
|
- 2.09 bump
|
||||||
|
|
||||||
|
* Wed May 18 2016 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.08-3
|
||||||
|
- Perl 5.24 rebuild
|
||||||
|
|
||||||
|
* Wed May 18 2016 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.08-2
|
||||||
|
- Perl 5.24 rebuild
|
||||||
|
|
||||||
|
* Tue May 17 2016 Petr Pisar <ppisar@redhat.com> - 1:2.08-1
|
||||||
|
- 2.08 bump
|
||||||
|
|
||||||
|
* Sat May 14 2016 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.07-365
|
||||||
|
- Increase release to favour standalone package
|
||||||
|
|
||||||
|
* Mon May 02 2016 Petr Pisar <ppisar@redhat.com> - 1:2.07-1
|
||||||
|
- 2.07 bump
|
||||||
|
|
||||||
|
* Thu Feb 04 2016 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.02-3
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Jun 18 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:2.02-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
|
||||||
|
|
||||||
|
* Mon Jun 15 2015 Petr Pisar <ppisar@redhat.com> - 1:2.02-1
|
||||||
|
- 2.02 bump
|
||||||
|
|
||||||
|
* Thu Jun 04 2015 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.01-345
|
||||||
|
- Increase release to favour standalone package
|
||||||
|
|
||||||
|
* Wed Jun 03 2015 Jitka Plesnikova <jplesnik@redhat.com> - 1:2.01-2
|
||||||
|
- Perl 5.22 rebuild
|
||||||
|
|
||||||
|
* Fri Mar 13 2015 Petr Pisar <ppisar@redhat.com> - 1:2.01-1
|
||||||
|
- 2.01 bump
|
||||||
|
|
||||||
|
* Mon Mar 09 2015 Petr Pisar <ppisar@redhat.com> - 1:1.99-1
|
||||||
|
- 1.99 bump
|
||||||
|
|
||||||
|
* Fri Mar 06 2015 Petr Pisar <ppisar@redhat.com> - 1:1.98-1
|
||||||
|
- 1.98 bump
|
||||||
|
|
||||||
|
* Thu Mar 05 2015 Petr Pisar <ppisar@redhat.com> - 1:1.97-1
|
||||||
|
- 1.97 bump
|
||||||
|
|
||||||
|
* Wed Sep 10 2014 Petr Pisar <ppisar@redhat.com> - 1:1.96-1
|
||||||
|
- 1.96 bump
|
||||||
|
|
||||||
|
* Wed Aug 27 2014 Jitka Plesnikova <jplesnik@redhat.com> - 1:1.92-4
|
||||||
|
- Perl 5.20 rebuild
|
||||||
|
|
||||||
|
* Sun Aug 17 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:1.92-3
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
|
||||||
|
|
||||||
|
* Sat Jun 07 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:1.92-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
|
||||||
|
|
||||||
|
* Wed Feb 05 2014 Petr Pisar <ppisar@redhat.com> - 1:1.92-1
|
||||||
|
- 1.92 bump
|
||||||
|
|
||||||
|
* Wed Oct 02 2013 Petr Pisar <ppisar@redhat.com> - 1:1.89-1
|
||||||
|
- 1.89 bump
|
||||||
|
|
||||||
|
* Tue Sep 24 2013 Jitka Plesnikova <jplesnik@redhat.com> - 1:1.87-6
|
||||||
|
- Update dependencies
|
||||||
|
|
||||||
|
* Sun Aug 04 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:1.87-5
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
|
||||||
|
|
||||||
|
* Fri Jul 12 2013 Petr Pisar <ppisar@redhat.com> - 1:1.87-4
|
||||||
|
- Link minimal build-root packages against libperl.so explicitly
|
||||||
|
|
||||||
|
* Fri Jul 12 2013 Petr Pisar <ppisar@redhat.com> - 1:1.87-3
|
||||||
|
- Perl 5.18 rebuild
|
||||||
|
|
||||||
|
* Fri Jul 12 2013 Petr Pisar <ppisar@redhat.com> - 1:1.87-2
|
||||||
|
- Perl 5.18 rebuild
|
||||||
|
|
||||||
|
* Fri Jul 12 2013 Petr Pisar <ppisar@redhat.com> - 1:1.87-1
|
||||||
|
- Increase epoch to compete with perl.spec
|
||||||
|
|
||||||
|
* Mon Jul 01 2013 Petr Pisar <ppisar@redhat.com> - 1.87-2
|
||||||
|
- Specify all dependencies
|
||||||
|
|
||||||
|
* Thu May 30 2013 Petr Pisar <ppisar@redhat.com> - 1.87-1
|
||||||
|
- 1.87 bump
|
||||||
|
|
||||||
|
* Tue Apr 30 2013 Petr Pisar <ppisar@redhat.com> - 1.86-243
|
||||||
|
- Increase release number to supersede perl sub-package (bug #957931)
|
||||||
|
|
||||||
|
* Thu Feb 14 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.86-242
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Nov 01 2012 Jitka Plesnikova <jplesnik@redhat.com> - 1.86-241
|
||||||
|
- Update dependencies.
|
||||||
|
- Use DESTDIR rather than PERL_INSTALL_ROOT
|
||||||
|
|
||||||
|
* Mon Aug 13 2012 Marcela Mašláňová <mmaslano@redhat.com> - 1.86-240
|
||||||
|
- bump release to override sub-package from perl.spec
|
||||||
|
|
||||||
|
* Fri Jul 20 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.86-4
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
|
||||||
|
|
||||||
|
* Wed Jun 06 2012 Petr Pisar <ppisar@redhat.com> - 1.86-3
|
||||||
|
- Perl 5.16 rebuild
|
||||||
|
|
||||||
|
* Sat Jan 14 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.86-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Dec 15 2011 Petr Pisar <ppisar@redhat.com> - 1.86-1
|
||||||
|
- 1.86 bump
|
||||||
|
|
||||||
|
* Tue Sep 06 2011 Petr Pisar <ppisar@redhat.com> - 1.85-1
|
||||||
|
- 1.85 bump
|
||||||
|
|
||||||
|
* Tue Aug 16 2011 Marcela Mašláňová <mmaslano@redhat.com> - 1.83-4
|
||||||
|
- change path on vendor, so our debuginfo are not conflicting with
|
||||||
|
perl core debuginfos
|
||||||
|
|
||||||
|
* Fri Jun 17 2011 Marcela Mašláňová <mmaslano@redhat.com> - 1.83-3
|
||||||
|
- Perl mass rebuild
|
||||||
|
|
||||||
|
* Thu Jun 09 2011 Marcela Mašláňová <mmaslano@redhat.com> - 1.83-2
|
||||||
|
- Perl 5.14 mass rebuild
|
||||||
|
|
||||||
|
* Tue Apr 26 2011 Petr Pisar <ppisar@redhat.com> - 1.83-1
|
||||||
|
- 1.83 bump
|
||||||
|
|
||||||
|
* Wed Feb 09 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.82-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
|
||||||
|
|
||||||
|
* Mon Jan 03 2011 Petr Pisar <ppisar@redhat.com> - 1.82-1
|
||||||
|
- 1.82 bump
|
||||||
|
|
||||||
|
* Wed Oct 06 2010 Petr Pisar <ppisar@redhat.com> - 1.81-1
|
||||||
|
- 1.81 bump
|
||||||
|
|
||||||
|
* Fri Oct 01 2010 Petr Pisar <ppisar@redhat.com> 1.79-1
|
||||||
|
- Specfile autogenerated by cpanspec 1.78.
|
||||||
|
- Remove BuildRoot stuff
|
Loading…
Reference in new issue