1*b39c5158Smillertuse strict; 2*b39c5158Smillertuse warnings; 3*b39c5158Smillert 4*b39c5158SmillertBEGIN { 5*b39c5158Smillert use Config; 6*b39c5158Smillert if (! $Config{'useithreads'}) { 7*b39c5158Smillert print("1..0 # SKIP Perl not compiled with 'useithreads'\n"); 8*b39c5158Smillert exit(0); 9*b39c5158Smillert } 10*b39c5158Smillert} 11*b39c5158Smillert 12*b39c5158Smillertuse ExtUtils::testlib; 13*b39c5158Smillert 14*b39c5158Smillertsub ok { 15*b39c5158Smillert my ($id, $ok, $name) = @_; 16*b39c5158Smillert 17*b39c5158Smillert # You have to do it this way or VMS will get confused. 18*b39c5158Smillert if ($ok) { 19*b39c5158Smillert print("ok $id - $name\n"); 20*b39c5158Smillert } else { 21*b39c5158Smillert print("not ok $id - $name\n"); 22*b39c5158Smillert printf("# Failed test at line %d\n", (caller)[2]); 23*b39c5158Smillert } 24*b39c5158Smillert 25*b39c5158Smillert return ($ok); 26*b39c5158Smillert} 27*b39c5158Smillert 28*b39c5158SmillertBEGIN { 29*b39c5158Smillert $| = 1; 30*b39c5158Smillert print("1..14\n"); ### Number of tests that will be run ### 31*b39c5158Smillert}; 32*b39c5158Smillert 33*b39c5158Smillertuse threads; 34*b39c5158Smillertuse threads::shared; 35*b39c5158Smillertok(1, 1, 'Loaded'); 36*b39c5158Smillert 37*b39c5158Smillert### Start of Testing ### 38*b39c5158Smillert 39*b39c5158Smillertmy $sv; 40*b39c5158Smillertshare($sv); 41*b39c5158Smillert$sv = "hi"; 42*b39c5158Smillert 43*b39c5158Smillertmy @av; 44*b39c5158Smillertshare(@av); 45*b39c5158Smillertpush(@av, $sv); 46*b39c5158Smillert 47*b39c5158Smillertok(2, $av[0] eq "hi", 'Array holds value'); 48*b39c5158Smillert 49*b39c5158Smillertpush(@av, "foo"); 50*b39c5158Smillertok(3, $av[1] eq 'foo', 'Array holds 2nd value'); 51*b39c5158Smillert 52*b39c5158Smillertmy $av = threads->create(sub { 53*b39c5158Smillert my $av; 54*b39c5158Smillert my @av2; 55*b39c5158Smillert share($av); 56*b39c5158Smillert share(@av2); 57*b39c5158Smillert $av = \@av2; 58*b39c5158Smillert push(@$av, "bar", \@av); 59*b39c5158Smillert return ($av); 60*b39c5158Smillert})->join(); 61*b39c5158Smillert 62*b39c5158Smillertok(4,$av->[0] eq "bar", 'Thread added to array'); 63*b39c5158Smillertok(5,$av->[1]->[0] eq 'hi', 'Shared in shared'); 64*b39c5158Smillert 65*b39c5158Smillertthreads->create(sub { $av[0] = "hihi" })->join(); 66*b39c5158Smillertok(6,$av->[1]->[0] eq 'hihi', 'Replaced shared in shared'); 67*b39c5158Smillertok(7, pop(@{$av->[1]}) eq "foo", 'Pop shared array'); 68*b39c5158Smillertok(8, scalar(@{$av->[1]}) == 1, 'Array size'); 69*b39c5158Smillert 70*b39c5158Smillertthreads->create(sub { @$av = () })->join(); 71*b39c5158Smillertthreads->create(sub { ok(9, scalar @$av == 0, 'Array cleared in thread'); })->join(); 72*b39c5158Smillert 73*b39c5158Smillertthreads->create(sub { 74*b39c5158Smillert unshift(@$av, threads->create(sub { 75*b39c5158Smillert my @array; 76*b39c5158Smillert share(@array); 77*b39c5158Smillert return (\@array); 78*b39c5158Smillert })->join()); 79*b39c5158Smillert})->join(); 80*b39c5158Smillert 81*b39c5158Smillertok(10, ref($av->[0]) eq 'ARRAY', 'Array in array'); 82*b39c5158Smillert 83*b39c5158Smillertthreads->create(sub { push @{$av->[0]}, \@av })->join(); 84*b39c5158Smillertthreads->create(sub { $av[0] = 'testtest'})->join(); 85*b39c5158Smillertthreads->create(sub { ok(11, $av->[0]->[0]->[0] eq 'testtest', 'Nested'); })->join(); 86*b39c5158Smillert 87*b39c5158Smillertok(12, is_shared($sv), "Check for sharing"); 88*b39c5158Smillertok(13, is_shared(@av), "Check for sharing"); 89*b39c5158Smillert 90*b39c5158Smillertmy $x :shared; 91*b39c5158Smillertok(14, is_shared($x), "Check for sharing"); 92*b39c5158Smillert 93*b39c5158Smillertexit(0); 94*b39c5158Smillert 95*b39c5158Smillert# EOF 96