1 ################################################################################
5 # $Date: 2008/11/28 18:08:11 +0100 $
7 ################################################################################
9 # Version 2.x, Copyright (C) 2007, Marcus Holland-Moritz <mhx@cpan.org>.
10 # Version 1.x, Copyright (C) 1999, Graham Barr <gbarr@pobox.com>.
12 # This program is free software; you can redistribute it and/or
13 # modify it under the same terms as Perl itself.
15 ################################################################################
18 if ($ENV{'PERL_CORE'}) {
20 @INC = '../lib' if -d '../lib' && -d '../ext';
23 require Test::More; import Test::More;
24 require Config; import Config;
26 if ($ENV{'PERL_CORE'} && $Config{'extensions'} !~ m[\bIPC/SysV\b]) {
27 plan(skip_all => 'IPC::SysV was not built');
31 if ($Config{'d_sem'} ne 'define') {
32 plan(skip_all => '$Config{d_sem} undefined');
34 elsif ($Config{'d_msg'} ne 'define') {
35 plan(skip_all => '$Config{d_msg} undefined');
51 # FreeBSD's default limit seems to be 9
55 if (exists $SIG{SYS}) {
56 local $SIG{SYS} = sub { plan(skip_all => "SIGSYS caught") };
60 }->(sub { IPC::Semaphore->new(IPC_PRIVATE, $nsem, S_IRWXU | S_IRWXG | S_IRWXO | IPC_CREAT) });
62 unless (defined $sem) {
63 my $info = "IPC::Semaphore->new failed: $!";
64 if ($! == &IPC::SysV::ENOSPC || $! == &IPC::SysV::ENOSYS ||
65 $! == &IPC::SysV::ENOMEM || $! == &IPC::SysV::EACCES) {
66 plan(skip_all => $info);
75 pass('acquired a semaphore');
77 ok(my $st = $sem->stat,'stat it');
79 ok($sem->setall((0) x $nsem), 'set all');
81 my @sem = $sem->getall;
82 cmp_ok(join("", @sem), 'eq', "00000", 'get all');
85 ok($sem->setall(@sem), 'set after change');
88 cmp_ok(join("", @sem), 'eq', "00100", 'get again');
90 my $ncnt = $sem->getncnt(0);
91 ok(!$sem->getncnt(0), 'procs waiting now');
92 ok(defined($ncnt), 'prev procs waiting');
94 ok($sem->op(2, -1, IPC_NOWAIT), 'op nowait');
96 ok(!$sem->getncnt(0), 'no procs waiting');
99 ok($sem->remove, 'remove semaphore') if defined $sem;