You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by pg...@sweng.stortek.com on 1999/12/22 02:57:22 UTC
[PATCH] mkshadow.sh accelerator
On OS/390 the overhead for fork and exec is extremely high.
this make "configure" painfully slow. Most of the time is
consumed by "mkshadow.sh", which executes 2 or 3 "sed"s and
an "ln -s" for each symbolic link created. This patch replaces
mkshadow.sh (except for a few comments). Much of the filtering
by "sed" is replaced by predicates in the "find". An "awk"
script then batches the commands so a single "ln -s" is issued
for each directory. This roughly halves the time taken by
"configure" on OS/390, and slightly improves performance on
Solaris.
Furthermore, this fixes a bug that was manifest when the
path to the shadow directory contains a rootward segment ("/../").
Directory levels were counted incorrectly, causing creation
of invalid symbolic links.
Tested in builds on OS/390 and Solaris, and unit tested (no build)
on MkLinux.
-- gil
--
StorageTek
INFORMATION made POWERFUL
========================================================================
diff -bru orig/apache-1.3/configure apache-1.3/configure
--- orig/apache-1.3/configure Wed Dec 8 15:04:15 1999
+++ apache-1.3/configure Wed Dec 8 13:10:54 1999
@@ -534,7 +534,8 @@
echo " + creating external package shadow tree ($shadow)"
fi
rm -rf $shadow 2>/dev/null
- $aux/mkshadow.sh . $shadow
+ ( export SHELL AWK
+ $aux/mkshadow.sh . $shadow )
for file in $mkf $sedsubst $addconf $tplconf $pldconf $configstatus; do
rm -f $shadow/$file 2>/dev/null
done
@@ -580,7 +581,8 @@
echo " + creating internal platform shadow tree ($shadowsrc)"
fi
rm -rf $shadowsrc
- $aux/mkshadow.sh $src $shadowsrc
+ ( export SHELL AWK
+ $aux/mkshadow.sh $src $shadowsrc )
# delegate us to the shadow paths
mkf=$shadowmkf
src=$shadowsrc
diff -bru orig/apache-1.3/src/helpers/mkshadow.sh apache-1.3/src/helpers/mkshadow.sh
--- orig/apache-1.3/src/helpers/mkshadow.sh Tue Jun 29 13:12:58 1999
+++ apache-1.3/src/helpers/mkshadow.sh Wed Dec 8 15:02:14 1999
@@ -6,24 +6,27 @@
## for the shadow tree generation option (--shadow) of
## Apache's Autoconf-style Interface (APACI)
##
+# Heavily modified by Paul Gilmartin <pg...@sweng.stortek.com>
+# for OS/390 performance and for correct operation when
+# $src or $dst contains "/../" or involve symbolic links.
#
# This script falls under the Apache License.
# See http://www.apache.org/docs/LICENSE
-# default IFS
-DIFS='
-'
-
# source and destination directory
-src=`echo $1 | sed -e 's:/$::'`
-dst=`echo $2 | sed -e 's:/$::'`
+src="$1"
+dst="$2"
+: ${SHELL=/bin/sh}
# check whether source exists
-if [ ! -d $src ]; then
+SOURCE=`cd $src && unset PWD && $SHELL -c pwd` || {
echo "mkshadow.sh:Error: source directory not found" 1>&2
exit 1
-fi
+ }
+
+SHADOW=`mkdir -p $dst && cd $dst &&
+ unset PWD && $SHELL -c pwd` || exit $?
# determine if one of the paths is an absolute path,
# because then we have to use an absolute symlink
@@ -35,76 +38,61 @@
/* ) oneisabs=1 ;;
esac
-# determine reverse directory for destination directory
-dstrevdir=''
-if [ "x$oneisabs" = "x0" ]; then
- # (inlined fp2rp)
- OIFS2="$IFS"; IFS='/'
- for pe in $dst; do
- dstrevdir="../$dstrevdir"
- done
- IFS="$OIFS2"
-else
- src="`cd $src; pwd`";
-fi
-
-# create directory tree at destination
-if [ ! -d $dst ]; then
- mkdir $dst
-fi
-DIRS="`cd $src; \
- find . -type d -print |\
- sed -e '/\/CVS/d' \
- -e '/^\.$/d' \
- -e 's:^\./::'`"
-OIFS="$IFS" IFS="$DIFS"
-for dir in $DIRS; do
- mkdir $dst/$dir
-done
-IFS="$OIFS"
-
-# fill directory tree with symlinks to files
-FILES="`cd $src; \
- find . -depth -print |\
- sed -e '/\.o$/d' \
- -e '/\.a$/d' \
- -e '/\.so$/d' \
- -e '/\.so-o$/d' \
- -e '/\.cvsignore$/d' \
- -e '/\/CVS/d' \
- -e '/\.indent\.pro$/d' \
- -e '/\.apaci.*/d' \
- -e '/Makefile$/d' \
- -e '/\/\.#/d' \
- -e '/\.orig$/d' \
- -e 's/^\.\///'`"
-OIFS="$IFS" IFS="$DIFS"
-for file in $FILES; do
- # don't use `-type f' above for find because of symlinks
- if [ -d "$src/$file" ]; then
- continue
- fi
- basename=`echo $file | sed -e 's:^.*/::'`
- dir=`echo $file | sed -e 's:[^/]*$::' -e 's:/$::' -e 's:$:/:' -e 's:^/$::'`
- from="$src/$file"
- to="$dst/$dir$basename"
- if [ "x$oneisabs" = "x0" ]; then
- if [ "x$dir" != "x" ]; then
- subdir=`echo $dir | sed -e 's:/$::'`
- # (inlined fp2rp)
- revdir=''
- OIFS2="$IFS"; IFS='/'
- for pe in $subdir; do
- revdir="../$revdir"
- done
- IFS="$OIFS2"
- # finalize from
- from="$revdir$from"
- fi
- from="$dstrevdir$from"
- fi
- echo " $to"
- ln -s $from $to
-done
-IFS="$OIFS"
-
+( cd $src && find . -name CVS -prune \
+ -o ! -name '*.o' \
+ ! -name '*.so' \
+ ! -name '*.so-o' \
+ ! -name '*.cvsignore' \
+ ! -name '*.indent.pro' \
+ ! -name '*.apaci*' \
+ ! -name '*Makefile' \
+ ! -name '.#*' \
+ ! -name '*.orig' \
+ ! -name '*.rej' \
+ ! -name '*~' \
+ ! -type d \
+ -print ) |
+ "${AWK-awk}" \
+ ' BEGIN{ }
+ { if ( ! Back ) {
+ Relative = ( ! oneisabs )
+ nSrc = split( SOURCE, Src, "/" )
+ nShd = split( SHADOW, Shd, "/" )
+ nSame = 0;
+ if ( Relative ) for ( I = 1; I <= nSrc; I++ ) {
+ if ( Src[ I ] != Shd [ I ] ) break
+ nSame = I }
+
+ Back = ""
+ if ( Relative )
+ for ( I = nSame + 1; I<=nShd; I++ ) Back = "../"Back
+ else Back = ""
+ for ( I = nSame + 1; I<=nSrc; I++ ) Back = Back Src[ I ]"/"
+ print( "# Back: " Back "\n" ) }
+
+ match( $0, "[^/]*$" )
+ Base = substr( $0, RSTART )
+ Dir = substr( $0, 1, RSTART-2 )"/"
+ sub( "^\\.//*", "", Dir )
+ Levels = split( Dir, Junk, "/" )
+
+ Dots = Back
+ if ( Relative )
+ for ( I = 1; I < Levels; I++ ) Dots = "../"Dots
+ XDir = SHADOW"//"Dir
+ ln[ XDir ] = ln[ XDir ] " "Dots""Dir""Base" \\\n"
+ rm[ XDir ] = rm[ XDir ] " "Base" \\\n"
+ ## lv[ XDir ] = " Levels: " Levels " Dots: " Dots " Dir: " Dir
+ }
+ END{
+ for ( Dir in ln ) {
+ print( "echo \"\n: ========= Creating links in:\n: "Dir"\"" )
+ printf( "mkdir -p %s//. || exit $?\n", Dir )
+ printf( "( cd "Dir" && rm -f \\\n%s%s", rm[ Dir ], ")\n" )
+ print( "set -v" )
+ printf( "ln -s \\\n%s%s", ln[ Dir ], " "Dir"//.\n" )
+ print( "set +v\n" )
+ }
+ }' "SOURCE=$SOURCE" "SHADOW=$SHADOW" "oneisabs=$oneisabs" |
+## cat; exit $?
+"$SHELL"