use Scalar::Util qw(reftype refaddr blessed);
-our $VERSION = '1.39';
+our $VERSION = '1.40';
my $XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
=head1 VERSION
-This document describes threads::shared version 1.39
+This document describes threads::shared version 1.40
=head1 SYNOPSIS
mentioned limitation. See F<examples/class.pl> (in the CPAN distribution of
this module) for how to create a class that supports object sharing.
-When storing shared objects in other shared structures, remove objects from
-the structure using C<delete> (for arrays and hashes) or C<pop> (for arrays)
-in order to ensure the object's destructor is called, if needed.
-
- # Add shared objects to shared hash
- my %hsh : shared;
- $hsh{'obj1'} = SharedObj->new();
- $hsh{'obj2'} = SharedObj->new();
- $hsh{'obj3'} = SharedObj->new();
-
- # Remove object from hash
- delete($hsh{'obj1'}); # First object's destructor is called
- $hsh{'obj2'} = undef; # Second object's destructor is NOT called
- %hsh = (); # Third object's destructor is NOT called
-
- # Add shared objects to shared array
- my @arr : shared;
- $arr[0] = SharedObj->new();
- $arr[1] = SharedObj->new();
- $arr[2] = SharedObj->new();
-
- # Remove object from array
- pop(@arr); # Third object's destructor is called
- $arr[1] = undef; # Second object's destructor is NOT called
- undef(@arr); # First object's destructor is NOT called
+Destructors may not be called on objects if those objects still exist at
+global destruction time. If the destructors must be called, make sure
+there are no circular references and that nothing is referencing the
+objects, before the program ends.
Does not support C<splice> on arrays. Does not support explicitly changing
array lengths via $#array -- use C<push> and C<pop> instead.
BEGIN {
$| = 1;
- print("1..121\n"); ### Number of tests that will be run ###
+ print("1..122\n"); ### Number of tests that will be run ###
};
use threads;
### Start of Testing ###
-my $ID = -1;
+my $ID :shared = -1;
my (@created, @destroyed);
{ package HashObj;
# Testing with shared array
my @shared_ary :shared;
-my $TODO = ' # TODO perl #98204';
-
# Testing with hash object
$shared_ary[0] = HashObj->new();
ok($created[$ID], 'Created hash object in shared array');
$shared_ary[0] = HashObj->new();
ok($created[$ID], 'Created hash object in shared array');
$shared_ary[0] = undef;
-ok($destroyed[$ID], 'Undef hash object in shared array' . $TODO);
+ok($destroyed[$ID], 'Undef hash object in shared array');
$shared_ary[0] = HashObj->new();
ok($created[$ID], 'Created hash object in shared array');
$shared_ary[0] = HashObj->new();
ok($created[$ID], 'Created hash object in shared array');
-ok($destroyed[$ID-1], 'Replaced hash object in shared array' . $TODO);
+ok($destroyed[$ID-1], 'Replaced hash object in shared array');
@shared_ary = ();
-ok($destroyed[$ID], 'Hash object removed from cleared shared array' . $TODO);
+ok($destroyed[$ID], 'Hash object removed from cleared shared array');
$shared_ary[0] = HashObj->new();
ok($created[$ID], 'Created hash object in shared array');
undef(@shared_ary);
-ok($destroyed[$ID], 'Hash object removed from undef shared array' . $TODO);
+ok($destroyed[$ID], 'Hash object removed from undef shared array');
# Testing with array object
$shared_ary[0] = AryObj->new();
$shared_ary[0] = AryObj->new();
ok($created[$ID], 'Created array object in shared array');
$shared_ary[0] = undef;
-ok($destroyed[$ID], 'Undef array object in shared array' . $TODO);
+ok($destroyed[$ID], 'Undef array object in shared array');
$shared_ary[0] = AryObj->new();
ok($created[$ID], 'Created array object in shared array');
$shared_ary[0] = AryObj->new();
ok($created[$ID], 'Created array object in shared array');
-ok($destroyed[$ID-1], 'Replaced array object in shared array' . $TODO);
+ok($destroyed[$ID-1], 'Replaced array object in shared array');
@shared_ary = ();
-ok($destroyed[$ID], 'Array object removed from cleared shared array' . $TODO);
+ok($destroyed[$ID], 'Array object removed from cleared shared array');
$shared_ary[0] = AryObj->new();
ok($created[$ID], 'Created array object in shared array');
undef(@shared_ary);
-ok($destroyed[$ID], 'Array object removed from undef shared array' . $TODO);
+ok($destroyed[$ID], 'Array object removed from undef shared array');
# Testing with scalar object
$shared_ary[0] = SclrObj->new();
$shared_ary[0] = SclrObj->new();
ok($created[$ID], 'Created scalar object in shared array');
$shared_ary[0] = undef;
-ok($destroyed[$ID], 'Undef scalar object in shared array' . $TODO);
+ok($destroyed[$ID], 'Undef scalar object in shared array');
$shared_ary[0] = SclrObj->new();
ok($created[$ID], 'Created scalar object in shared array');
$shared_ary[0] = SclrObj->new();
ok($created[$ID], 'Created scalar object in shared array');
-ok($destroyed[$ID-1], 'Replaced scalar object in shared array' . $TODO);
+ok($destroyed[$ID-1], 'Replaced scalar object in shared array');
@shared_ary = ();
-ok($destroyed[$ID], 'Scalar object removed from cleared shared array' . $TODO);
+ok($destroyed[$ID], 'Scalar object removed from cleared shared array');
$shared_ary[0] = SclrObj->new();
ok($created[$ID], 'Created scalar object in shared array');
undef(@shared_ary);
-ok($destroyed[$ID], 'Scalar object removed from undef shared array' . $TODO);
+ok($destroyed[$ID], 'Scalar object removed from undef shared array');
# Testing with shared hash
my %shared_hash :shared;
$shared_hash{'obj'} = HashObj->new();
ok($created[$ID], 'Created hash object in shared hash');
$shared_hash{'obj'} = undef;
-ok($destroyed[$ID], 'Undef hash object in shared hash' . $TODO);
+ok($destroyed[$ID], 'Undef hash object in shared hash');
$shared_hash{'obj'} = HashObj->new();
ok($created[$ID], 'Created hash object in shared hash');
$shared_hash{'obj'} = HashObj->new();
ok($created[$ID], 'Created hash object in shared hash');
-ok($destroyed[$ID-1], 'Replaced hash object in shared hash' . $TODO);
+ok($destroyed[$ID-1], 'Replaced hash object in shared hash');
%shared_hash = ();
-ok($destroyed[$ID], 'Hash object removed from cleared shared hash' . $TODO);
+ok($destroyed[$ID], 'Hash object removed from cleared shared hash');
$shared_hash{'obj'} = HashObj->new();
ok($created[$ID], 'Created hash object in shared hash');
undef(%shared_hash);
-ok($destroyed[$ID], 'Hash object removed from undef shared hash' . $TODO);
+ok($destroyed[$ID], 'Hash object removed from undef shared hash');
# Testing with array object
$shared_hash{'obj'} = AryObj->new();
$shared_hash{'obj'} = AryObj->new();
ok($created[$ID], 'Created array object in shared hash');
$shared_hash{'obj'} = undef;
-ok($destroyed[$ID], 'Undef array object in shared hash' . $TODO);
+ok($destroyed[$ID], 'Undef array object in shared hash');
$shared_hash{'obj'} = AryObj->new();
ok($created[$ID], 'Created array object in shared hash');
$shared_hash{'obj'} = AryObj->new();
ok($created[$ID], 'Created array object in shared hash');
-ok($destroyed[$ID-1], 'Replaced array object in shared hash' . $TODO);
+ok($destroyed[$ID-1], 'Replaced array object in shared hash');
%shared_hash = ();
-ok($destroyed[$ID], 'Array object removed from cleared shared hash' . $TODO);
+ok($destroyed[$ID], 'Array object removed from cleared shared hash');
$shared_hash{'obj'} = AryObj->new();
ok($created[$ID], 'Created array object in shared hash');
undef(%shared_hash);
-ok($destroyed[$ID], 'Array object removed from undef shared hash' . $TODO);
+ok($destroyed[$ID], 'Array object removed from undef shared hash');
# Testing with scalar object
$shared_hash{'obj'} = SclrObj->new();
$shared_hash{'obj'} = SclrObj->new();
ok($created[$ID], 'Created scalar object in shared hash');
$shared_hash{'obj'} = undef;
-ok($destroyed[$ID], 'Undef scalar object in shared hash' . $TODO);
+ok($destroyed[$ID], 'Undef scalar object in shared hash');
$shared_hash{'obj'} = SclrObj->new();
ok($created[$ID], 'Created scalar object in shared hash');
$shared_hash{'obj'} = SclrObj->new();
ok($created[$ID], 'Created scalar object in shared hash');
-ok($destroyed[$ID-1], 'Replaced scalar object in shared hash' . $TODO);
+ok($destroyed[$ID-1], 'Replaced scalar object in shared hash');
%shared_hash = ();
-ok($destroyed[$ID], 'Scalar object removed from cleared shared hash' . $TODO);
+ok($destroyed[$ID], 'Scalar object removed from cleared shared hash');
$shared_hash{'obj'} = SclrObj->new();
ok($created[$ID], 'Created scalar object in shared hash');
undef(%shared_hash);
-ok($destroyed[$ID], 'Scalar object removed from undef shared hash' . $TODO);
+ok($destroyed[$ID], 'Scalar object removed from undef shared hash');
+
+# Testing with shared scalar
+{
+ my $shared_scalar : shared;
+ # Use a separate thread to make sure we have no private SV
+ async { $shared_scalar = SclrObj->new(); }->join();
+}
+ok($destroyed[$ID], 'Scalar object removed from shared scalar');
# EOF