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..5\n";
}

use strict;
use Carp;
use IPC::Shareable;
my $t  = 1;
my $ok = 1;


my %shareOpts = (
		 create =>       'yes',
		 exclusive =>    0,
		 mode =>         0644,
		 destroy =>      'yes',
		 );

my $awake = 0;
local $SIG{ALRM} = sub { $awake = 1 };

my $pid = fork;
defined $pid or die "Cannot fork: $!";
if ($pid == 0) {
    # --- Kid
    sleep unless $awake;
    $awake = 0;
    my %hv;
    my $ipch = tie(%hv, 'IPC::Shareable', "data", {
	create    => 'yes',
	exclusive => 0,
	mode      => 0644,
	destroy   => 0,
    }) or undef $ok;
    print $ok ? "ok $t\n" : "not ok $t\n";

    for (qw(fee fie foe fum)) {
	$ipch->shlock();
	$hv{$_} = $$;
	$ipch->shunlock();
    }
    sleep unless $awake;
    $ok = 1;
    ++$t;
    for (qw(fee fie foe fum)) {
	$hv{$_} == $$ or undef $ok;
    }
    print $ok ? "ok $t\n" : "not ok $t\n";
    
    $ok = 1;
    ++$t;
    my $dad = getppid;
    $dad == 1 and die "Parent process has unexpectedly gone away";
    for (qw(eenie meenie minie moe)) {
	$hv{$_} == $dad or undef $ok;
    }
    print $ok ? "ok $t\n" : "not ok $t\n";
} else {
    # --- Parent
    my %hv;
    my $ipch = tie(%hv, 'IPC::Shareable', "data", {
	create    => 1,
	exclusive => 0,
	mode      => 0666,
	size      => 1024*512,
	destroy   => 'yes',
    });
    %hv = ();
    kill ALRM => $pid;
    sleep 1;           # Allow time for child to process the signal before next ALRM comes in
    
    for (qw(eenie meenie minie moe)) {
	$ipch->shlock();
	$hv{$_} = $$;
	$ipch->shunlock();
    }
    kill ALRM => $pid;
    waitpid($pid, 0);

    $t += 3;
    $ok = 1;
    for (qw(fee fie foe fum)) {
	$hv{$_} == $pid or undef $ok;
    }
    print $ok ? "ok $t\n" : "not ok $t\n";
    
    $ok = 1;
    ++$t;
    for (qw(eenie meenie minie moe)) {
	$hv{$_} == $$ or undef $ok;
    }
    print $ok ? "ok $t\n" : "not ok $t\n";
}

exit;