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..37\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 ($hobj, $aobj, $sobj) : shared; 40*b39c5158Smillert 41*b39c5158Smillert$hobj = &share({}); 42*b39c5158Smillert$aobj = &share([]); 43*b39c5158Smillertmy $sref = \do{ my $x }; 44*b39c5158Smillertshare($sref); 45*b39c5158Smillert$sobj = $sref; 46*b39c5158Smillert 47*b39c5158Smillertthreads->create(sub { 48*b39c5158Smillert # Bless objects 49*b39c5158Smillert bless $hobj, 'foo'; 50*b39c5158Smillert bless $aobj, 'bar'; 51*b39c5158Smillert bless $sobj, 'baz'; 52*b39c5158Smillert 53*b39c5158Smillert # Add data to objects 54*b39c5158Smillert $$aobj[0] = bless(&share({}), 'yin'); 55*b39c5158Smillert $$aobj[1] = bless(&share([]), 'yang'); 56*b39c5158Smillert $$aobj[2] = $sobj; 57*b39c5158Smillert 58*b39c5158Smillert $$hobj{'hash'} = bless(&share({}), 'yin'); 59*b39c5158Smillert $$hobj{'array'} = bless(&share([]), 'yang'); 60*b39c5158Smillert $$hobj{'scalar'} = $sobj; 61*b39c5158Smillert 62*b39c5158Smillert $$sobj = 3; 63*b39c5158Smillert 64*b39c5158Smillert # Test objects in child thread 65*b39c5158Smillert ok(2, ref($hobj) eq 'foo', "hash blessing does work"); 66*b39c5158Smillert ok(3, ref($aobj) eq 'bar', "array blessing does work"); 67*b39c5158Smillert ok(4, ref($sobj) eq 'baz', "scalar blessing does work"); 68*b39c5158Smillert ok(5, $$sobj eq '3', "scalar contents okay"); 69*b39c5158Smillert 70*b39c5158Smillert ok(6, ref($$aobj[0]) eq 'yin', "blessed hash in array"); 71*b39c5158Smillert ok(7, ref($$aobj[1]) eq 'yang', "blessed array in array"); 72*b39c5158Smillert ok(8, ref($$aobj[2]) eq 'baz', "blessed scalar in array"); 73*b39c5158Smillert ok(9, ${$$aobj[2]} eq '3', "blessed scalar in array contents"); 74*b39c5158Smillert 75*b39c5158Smillert ok(10, ref($$hobj{'hash'}) eq 'yin', "blessed hash in hash"); 76*b39c5158Smillert ok(11, ref($$hobj{'array'}) eq 'yang', "blessed array in hash"); 77*b39c5158Smillert ok(12, ref($$hobj{'scalar'}) eq 'baz', "blessed scalar in hash"); 78*b39c5158Smillert ok(13, ${$$hobj{'scalar'}} eq '3', "blessed scalar in hash contents"); 79*b39c5158Smillert 80*b39c5158Smillert })->join; 81*b39c5158Smillert 82*b39c5158Smillert# Test objects in parent thread 83*b39c5158Smillertok(14, ref($hobj) eq 'foo', "hash blessing does work"); 84*b39c5158Smillertok(15, ref($aobj) eq 'bar', "array blessing does work"); 85*b39c5158Smillertok(16, ref($sobj) eq 'baz', "scalar blessing does work"); 86*b39c5158Smillertok(17, $$sobj eq '3', "scalar contents okay"); 87*b39c5158Smillert 88*b39c5158Smillertok(18, ref($$aobj[0]) eq 'yin', "blessed hash in array"); 89*b39c5158Smillertok(19, ref($$aobj[1]) eq 'yang', "blessed array in array"); 90*b39c5158Smillertok(20, ref($$aobj[2]) eq 'baz', "blessed scalar in array"); 91*b39c5158Smillertok(21, ${$$aobj[2]} eq '3', "blessed scalar in array contents"); 92*b39c5158Smillert 93*b39c5158Smillertok(22, ref($$hobj{'hash'}) eq 'yin', "blessed hash in hash"); 94*b39c5158Smillertok(23, ref($$hobj{'array'}) eq 'yang', "blessed array in hash"); 95*b39c5158Smillertok(24, ref($$hobj{'scalar'}) eq 'baz', "blessed scalar in hash"); 96*b39c5158Smillertok(25, ${$$hobj{'scalar'}} eq '3', "blessed scalar in hash contents"); 97*b39c5158Smillert 98*b39c5158Smillertthreads->create(sub { 99*b39c5158Smillert # Rebless objects 100*b39c5158Smillert bless $hobj, 'oof'; 101*b39c5158Smillert bless $aobj, 'rab'; 102*b39c5158Smillert bless $sobj, 'zab'; 103*b39c5158Smillert 104*b39c5158Smillert my $data = $$aobj[0]; 105*b39c5158Smillert bless $data, 'niy'; 106*b39c5158Smillert $$aobj[0] = $data; 107*b39c5158Smillert $data = $$aobj[1]; 108*b39c5158Smillert bless $data, 'gnay'; 109*b39c5158Smillert $$aobj[1] = $data; 110*b39c5158Smillert 111*b39c5158Smillert $data = $$hobj{'hash'}; 112*b39c5158Smillert bless $data, 'niy'; 113*b39c5158Smillert $$hobj{'hash'} = $data; 114*b39c5158Smillert $data = $$hobj{'array'}; 115*b39c5158Smillert bless $data, 'gnay'; 116*b39c5158Smillert $$hobj{'array'} = $data; 117*b39c5158Smillert 118*b39c5158Smillert $$sobj = 'test'; 119*b39c5158Smillert })->join(); 120*b39c5158Smillert 121*b39c5158Smillert# Test reblessing 122*b39c5158Smillertok(26, ref($hobj) eq 'oof', "hash reblessing does work"); 123*b39c5158Smillertok(27, ref($aobj) eq 'rab', "array reblessing does work"); 124*b39c5158Smillertok(28, ref($sobj) eq 'zab', "scalar reblessing does work"); 125*b39c5158Smillertok(29, $$sobj eq 'test', "scalar contents okay"); 126*b39c5158Smillert 127*b39c5158Smillertok(30, ref($$aobj[0]) eq 'niy', "reblessed hash in array"); 128*b39c5158Smillertok(31, ref($$aobj[1]) eq 'gnay', "reblessed array in array"); 129*b39c5158Smillertok(32, ref($$aobj[2]) eq 'zab', "reblessed scalar in array"); 130*b39c5158Smillertok(33, ${$$aobj[2]} eq 'test', "reblessed scalar in array contents"); 131*b39c5158Smillert 132*b39c5158Smillertok(34, ref($$hobj{'hash'}) eq 'niy', "reblessed hash in hash"); 133*b39c5158Smillertok(35, ref($$hobj{'array'}) eq 'gnay', "reblessed array in hash"); 134*b39c5158Smillertok(36, ref($$hobj{'scalar'}) eq 'zab', "reblessed scalar in hash"); 135*b39c5158Smillertok(37, ${$$hobj{'scalar'}} eq 'test', "reblessed scalar in hash contents"); 136*b39c5158Smillert 137*b39c5158Smillertexit(0); 138*b39c5158Smillert 139*b39c5158Smillert# EOF 140