]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/misc/tst.include.ksh
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / cddl / contrib / opensolaris / cmd / dtrace / test / tst / common / misc / tst.include.ksh
1 #
2 # CDDL HEADER START
3 #
4 # The contents of this file are subject to the terms of the
5 # Common Development and Distribution License (the "License").
6 # You may not use this file except in compliance with the License.
7 #
8 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 # or http://www.opensolaris.org/os/licensing.
10 # See the License for the specific language governing permissions
11 # and limitations under the License.
12 #
13 # When distributing Covered Code, include this CDDL HEADER in each
14 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 # If applicable, add the following below this CDDL HEADER, with the
16 # fields enclosed by brackets "[]" replaced with your own identifying
17 # information: Portions Copyright [yyyy] [name of copyright owner]
18 #
19 # CDDL HEADER END
20 #
21
22 #
23 # Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24 # Use is subject to license terms.
25 #
26 # ident "%Z%%M% %I%     %E% SMI"
27
28 if [ $# != 1 ]; then
29         echo expected one argument: '<'dtrace-path'>'
30         exit 2
31 fi
32
33 dtrace=$1
34 CC=/usr/bin/gcc
35 CFLAGS=
36
37 doit()
38 {
39         file=$1
40         ofile=$2
41         errfile=$3
42         cfile=${TMPDIR:-/tmp}/inc.$$.$file.c
43         cofile=${TMPDIR:-/tmp}/inc.$$.$file
44         cat > $cfile <<EOF
45 #include <sys/$file>
46 void
47 main()
48 {}
49 EOF
50         if $CC $CFLAGS -o $cofile $cfile >/dev/null 2>&1; then
51                 $dtrace -xerrtags -C -s /dev/stdin \
52                     >/dev/null 2>$errfile <<EOF
53 #include <sys/$file>
54 BEGIN
55 {
56         exit(0);
57 }
58 EOF
59                 if [ $? -ne 0 ]; then
60                         echo $inc failed: `cat $errfile | head -1` > $ofile
61                 else
62                         echo $inc succeeded > $ofile
63                 fi
64                 rm -f $errfile
65         fi
66
67         rm -f $cofile $cfile 2>/dev/null
68 }
69
70 if [ ! -x $CC ]; then
71         echo "$0: bad compiler: $CC" >& 2
72         exit 1
73 fi
74
75 concurrency=`psrinfo | wc -l`
76 let concurrency=concurrency*4
77 let i=0
78
79 files=/usr/include/sys/*.h
80
81 #
82 # There are a few files in /usr/include/sys that are known to be bad -- usually
83 # because they include static globals (!) or function bodies (!!) in the header
84 # file.  Hopefully these remain sufficiently few that the O(#files * #badfiles)
85 # algorithm, below, doesn't become a problem.  (And yes, writing scripts in
86 # something other than ksh1888 would probably be a good idea.)  If this script
87 # becomes a problem, kindly fix it by reducing the number of bad files!  (That
88 # is, fix it by fixing the broken file, not the broken script.)
89 #
90 badfiles="ctype.h eri_msg.h ser_sync.h sbpro.h neti.h hook_event.h \
91     bootconf.h bootstat.h dtrace.h dumphdr.h exacct_impl.h fasttrap.h \
92     kobj.h kobj_impl.h ksyms.h lockstat.h smedia.h stat.h utsname.h"
93
94 for inc in $files; do
95         file=`basename $inc`
96         for bad in $badfiles; do
97                 if [ "$file" = "$bad" ]; then
98                         continue 2 
99                 fi
100         done
101
102         ofile=${TMPDIR:-/tmp}/inc.$file.$$.out
103         errfile=${TMPDIR:-/tmp}/inc.$file.$$.err
104         doit $file $ofile $errfile &
105         let i=i+1
106
107         if [ $i -eq $concurrency ]; then
108                 #
109                 # This isn't optimal -- it creates a highly fluctuating load
110                 # as we wait for all work to complete -- but it's an easy
111                 # way of parallelizing work.
112                 #
113                 wait
114                 let i=0
115         fi
116 done
117
118 wait
119
120 bigofile=${TMPDIR:-/tmp}/inc.$$.out
121
122 for inc in $files; do
123         file=`basename $inc`
124         ofile=${TMPDIR:-/tmp}/inc.$file.$$.out
125
126         if [ -f $ofile ]; then
127                 cat $ofile >> $bigofile
128                 rm $ofile
129         fi
130 done
131
132 status=$(grep "failed:" $bigofile | wc -l)
133 cat $bigofile
134 rm -f $bigofile
135 exit $status