-DL and PERL_DEBUG_MSTATS unravelled
[p5sagit/p5-mst-13.2.git] / t / op / ipcsem.t
1 #!./perl
2
3 BEGIN {
4     chdir 't' if -d 't';
5     @INC = '../lib';
6 }
7
8 my @define;
9
10 BEGIN {
11     @define = qw(
12         GETALL
13         SETALL
14         IPC_PRIVATE
15         IPC_CREAT
16         IPC_RMID
17         IPC_STAT
18         S_IRWXU
19         S_IRWXG
20         S_IRWXO
21     );
22 }
23
24 use Config;
25 use vars map { '$' . $_ } @define;
26
27 BEGIN {
28     unless($Config{'d_semget'} eq 'define' &&
29            $Config{'d_semctl'} eq 'define') {
30         print "1..0\n";
31         exit;
32     }
33
34     use strict;
35
36     my @incpath = (split(/\s+/, $Config{usrinc}), split(/\s+/ ,$Config{locincpth}));
37     my %done = ();
38     my %define = ();
39
40     sub process_file {
41         my($file,$level) = @_;
42
43         return unless defined $file;
44
45         my $path = undef;
46         my $dir;
47         foreach $dir (@incpath) {
48             my $tmp = $dir . "/" . $file;
49             next unless -r $tmp;
50             $path = $tmp;
51             last;
52         }
53
54         return if exists $done{$path};
55         $done{$path} = 1;
56
57         if(not defined $path and $level == 0) {
58             warn "Cannot find '$file'";
59             return;
60         }
61
62         local(*F);
63         open(F,$path) or return;
64         $level = 1 unless defined $level;
65         my $indent = " " x $level;
66         print "#$indent open $path\n";
67         while(<F>) {
68             s#/\*.*(\*/|$)##;
69
70             if ( /^#\s*include\s*[<"]([^>"]+)[>"]/ ) {
71                 print "#${indent} include $1\n";
72                 process_file($1,$level+1);
73                 print "#${indent} done include $1\n";
74                 print "#${indent} back in $path\n";
75             }
76
77             s/(?:\([^)]*\)\s*)//;
78
79             if ( /^#\s*define\s+(\w+)\s+(\w+)/ ) {
80                 print "#${indent} define $1 $2\n";
81                 $define{$1} = $2;
82             }
83        }
84        close(F);
85        print "#$indent close $path\n";
86     }
87
88     process_file("sys/sem.h");
89     process_file("sys/ipc.h");
90     process_file("sys/stat.h");
91
92     foreach my $d (@define) {
93         while(defined($define{$d}) && $define{$d} !~ /^(0x)?\d+$/) {
94             $define{$d} = exists $define{$define{$d}}
95                     ? $define{$define{$d}} : undef;
96         }
97         unless(defined $define{$d}) {
98             print "# $d undefined\n";
99             print "1..0\n";
100             exit;
101         }
102         {
103             no strict 'refs';
104             ${ $d } = eval $define{$d};
105         }
106     }
107 }
108
109 use strict;
110
111 # This test doesn't seem to work properly yet so skip it for _65
112 print "1..0\n";
113 exit;
114
115
116 print "1..10\n";
117
118 my $sem = semget($IPC_PRIVATE, 10, $S_IRWXU | $S_IRWXG | $S_IRWXO | $IPC_CREAT);
119 # Very first time called after machine is booted value may be 0 
120 die "semget: $!\n" unless defined($sem) && $sem >= 0;
121
122 print "ok 1\n";
123
124 my $data;
125 semctl($sem,0,$IPC_STAT,$data) or print "not ";
126 print "ok 2\n";
127
128 print "not " unless length($data);
129 print "ok 3\n";
130
131 semctl($sem,0,$SETALL,pack("s*",(0) x 10)) or print "not ";
132 print "ok 4\n";
133
134 $data = "";
135 semctl($sem,0,$GETALL,$data) or print "not ";
136 print "ok 5\n";
137
138 print "not " unless length($data);
139 print "ok 6\n";
140
141 my @data = unpack("s*",$data);
142
143 print "not " unless join("",@data) eq "0000000000";
144 print "ok 7\n";
145
146 $data[2] = 1;
147 semctl($sem,0,$SETALL,pack("s*",@data)) or print "not ";
148 print "ok 8\n";
149
150 $data = "";
151 semctl($sem,0,$GETALL,$data) or print "not ";
152 print "ok 9\n";
153
154 @data = unpack("s*",$data);
155
156 print "not " unless join("",@data) eq "0010000000";
157 print "ok 10\n";
158
159 semctl($sem,0,$IPC_RMID,undef);
160