The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
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;