Move CPAN from ext/ to cpan/
[p5sagit/p5-mst-13.2.git] / cpan / IPC-SysV / t / sem.t
CommitLineData
8f85282b 1################################################################################
2#
503ba33a 3# $Revision: 15 $
8f85282b 4# $Author: mhx $
503ba33a 5# $Date: 2008/11/28 18:08:11 +0100 $
8f85282b 6#
7################################################################################
8#
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>.
11#
12# This program is free software; you can redistribute it and/or
13# modify it under the same terms as Perl itself.
14#
15################################################################################
16
72802890 17BEGIN {
8f85282b 18 if ($ENV{'PERL_CORE'}) {
6edcbe38 19 chdir 't' if -d 't';
8f85282b 20 @INC = '../lib' if -d '../lib' && -d '../ext';
21 }
6edcbe38 22
8f85282b 23 require Test::More; import Test::More;
24 require Config; import Config;
2b06bec1 25
8f85282b 26 if ($ENV{'PERL_CORE'} && $Config{'extensions'} !~ m[\bIPC/SysV\b]) {
27 plan(skip_all => 'IPC::SysV was not built');
28 }
1ba50a1a 29}
8f85282b 30
31if ($Config{'d_sem'} ne 'define') {
32 plan(skip_all => '$Config{d_sem} undefined');
1ba50a1a 33}
34elsif ($Config{'d_msg'} ne 'define') {
8f85282b 35 plan(skip_all => '$Config{d_msg} undefined');
72802890 36}
0ade1984 37
38use IPC::SysV qw(
39 SETALL
40 IPC_PRIVATE
41 IPC_CREAT
42 IPC_RMID
43 IPC_NOWAIT
44 IPC_STAT
45 S_IRWXU
46 S_IRWXG
47 S_IRWXO
48);
49use IPC::Semaphore;
50
8f85282b 51# FreeBSD's default limit seems to be 9
52my $nsem = 5;
53my $sem = sub {
54 my $code = shift;
55 if (exists $SIG{SYS}) {
56 local $SIG{SYS} = sub { plan(skip_all => "SIGSYS caught") };
57 return $code->();
58 }
59 return $code->();
60}->(sub { IPC::Semaphore->new(IPC_PRIVATE, $nsem, S_IRWXU | S_IRWXG | S_IRWXO | IPC_CREAT) });
61
62unless (defined $sem) {
63 my $info = "IPC::Semaphore->new failed: $!";
503ba33a 64 if ($! == &IPC::SysV::ENOSPC || $! == &IPC::SysV::ENOSYS ||
65 $! == &IPC::SysV::ENOMEM || $! == &IPC::SysV::EACCES) {
8f85282b 66 plan(skip_all => $info);
67 }
68 else {
69 die $info;
70 }
1ba50a1a 71}
0ade1984 72
8f85282b 73plan(tests => 11);
74
1ba50a1a 75pass('acquired a semaphore');
0ade1984 76
1ba50a1a 77ok(my $st = $sem->stat,'stat it');
0ade1984 78
8f85282b 79ok($sem->setall((0) x $nsem), 'set all');
0ade1984 80
81my @sem = $sem->getall;
8f85282b 82cmp_ok(join("", @sem), 'eq', "00000", 'get all');
0ade1984 83
84$sem[2] = 1;
8f85282b 85ok($sem->setall(@sem), 'set after change');
0ade1984 86
87@sem = $sem->getall;
8f85282b 88cmp_ok(join("", @sem), 'eq', "00100", 'get again');
0ade1984 89
90my $ncnt = $sem->getncnt(0);
8f85282b 91ok(!$sem->getncnt(0), 'procs waiting now');
92ok(defined($ncnt), 'prev procs waiting');
0ade1984 93
8f85282b 94ok($sem->op(2, -1, IPC_NOWAIT), 'op nowait');
0ade1984 95
8f85282b 96ok(!$sem->getncnt(0), 'no procs waiting');
0ade1984 97
cab0dcf9 98END {
8f85282b 99 ok($sem->remove, 'remove semaphore') if defined $sem;
cab0dcf9 100}