BEGIN { $^W = 1; $| = 1; $SIG{INT} = sub { die }; print "1..3\n"; } use strict; use Carp; use IPC::Shareable; my $t = 1; my $ok = 1; my $awake = 0; local $SIG{ALRM} = sub { $awake = 1 }; my $pid = fork; defined $pid or die "Cannot fork: $!"; if ($pid == 0) { sleep unless $awake; $awake = 0; my @av; my $ipch = tie(@av, 'IPC::Shareable', "foco", { create => 1, exclusive => 0, mode => 0666, size => 1024*512, destroy => 0, }) or undef $ok; @av = (); print $ok ? "ok $t\n" : "not ok $t\n"; for (my $i = 1; $i <= 10; $i++) { $ipch->shlock; push(@av, $i); $ipch->shunlock; } sleep unless $awake; ++$t; $ok = 1; @av and undef $ok; print $ok ? "ok $t\n" : "not ok $t\n"; exit; } else { my @av; my $ipch = tie(@av, 'IPC::Shareable', "foco", { create => 1, exclusive => 0, mode => 0666, size => 1024*512, destroy => 'yes', }); @av = (); kill ALRM => $pid; my %seen; sleep 1 until @av; while (@av) { $ipch->shlock; my $line = shift @av; if ($seen{$line}) { undef $ok; } ++$seen{$line}; $ipch->shunlock; } kill ALRM => $pid; waitpid($pid, 0); $t += 2; $ok = 1; @av and undef $ok; print $ok ? "ok $t\n" : "not ok $t\n"; } # --- Done! exit;