diff options
| author | Ulrich Drepper <drepper@redhat.com> | 1998-07-17 12:36:43 +0000 |
|---|---|---|
| committer | Ulrich Drepper <drepper@redhat.com> | 1998-07-17 12:36:43 +0000 |
| commit | 07435eb48c6acb0313a8957257af4771e9e55030 (patch) | |
| tree | 18150741adde33705ec19becfb988a8053cf9ca0 | |
| parent | af553418323e7afc30e5e1333d1a82592cd3888b (diff) | |
| download | glibc-07435eb48c6acb0313a8957257af4771e9e55030.tar.xz glibc-07435eb48c6acb0313a8957257af4771e9e55030.zip | |
Update.
1998-07-17 Ulrich Drepper <drepper@cygnus.com>
* debug/catchsegv.sh: Fix several stupid bugs.
* shlib-versions: Define version for libSegFault.
* debug/Makefile: Replace shared lib version number while rewriting.
1998-07-17 Mark Kettenis <kettenis@phys.uva.nl>
* sysdeps/mach/hurd/dl-sysdep.c (__mmap): Add sanity check.
Suggested by Roland McGrath.
1998-07-15 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* timezone/Makefile: Remove '-L (leapseconds)' for testdata
generation to control environment.
1998-07-17 09:21 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/sysv/sysv4/solaris2/bits/signum.h: Define SIG_HOLD.
Patch by John Tobey <jtobey@banta-im.com>.
* manual/llio.texi: Document readv/writev and mmap functions.
Patch by Michael Deutschmann <michael@talamasca.wkpowerlink.com>.
1998-07-16 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* manual/Makefile (texis): Depend on texis.awk.
(nonexamples): Filter out add-on chapters.
(chapters.% top-menu.%): Depend on libc-texinfo.sh.
(stamp-summary): Depend on $(texis) except summary.texi.
($(inst_infodir)/libc.info): Simplify command.
* manual/libc-texinfo.sh: Cleaned up to use less temporary files.
Fix the generation of the detailed node listing to make it
complete again.
* manual/math.texi: Fix signature of lgamma_r.
| -rw-r--r-- | ChangeLog | 37 | ||||
| -rw-r--r-- | debug/Makefile | 3 | ||||
| -rwxr-xr-x | debug/catchsegv.sh | 16 | ||||
| -rw-r--r-- | manual/.cvsignore | 2 | ||||
| -rw-r--r-- | manual/Makefile | 35 | ||||
| -rw-r--r-- | manual/libc-texinfo.sh | 147 | ||||
| -rw-r--r-- | manual/llio.texi | 429 | ||||
| -rw-r--r-- | manual/math.texi | 6 | ||||
| -rw-r--r-- | manual/top-menu.texi | 671 | ||||
| -rw-r--r-- | shlib-versions | 3 | ||||
| -rw-r--r-- | sysdeps/generic/abort.c | 2 | ||||
| -rw-r--r-- | sysdeps/mach/hurd/dl-sysdep.c | 3 | ||||
| -rw-r--r-- | sysdeps/unix/sysv/sysv4/solaris2/bits/signum.h | 5 | ||||
| -rw-r--r-- | timezone/Makefile | 4 |
14 files changed, 1224 insertions, 139 deletions
@@ -1,3 +1,40 @@ +1998-07-17 Ulrich Drepper <drepper@cygnus.com> + + * debug/catchsegv.sh: Fix several stupid bugs. + + * shlib-versions: Define version for libSegFault. + * debug/Makefile: Replace shared lib version number while rewriting. + +1998-07-17 Mark Kettenis <kettenis@phys.uva.nl> + + * sysdeps/mach/hurd/dl-sysdep.c (__mmap): Add sanity check. + Suggested by Roland McGrath. + +1998-07-15 Andreas Jaeger <aj@arthur.rhein-neckar.de> + + * timezone/Makefile: Remove '-L (leapseconds)' for testdata + generation to control environment. + +1998-07-17 09:21 Ulrich Drepper <drepper@cygnus.com> + + * sysdeps/unix/sysv/sysv4/solaris2/bits/signum.h: Define SIG_HOLD. + Patch by John Tobey <jtobey@banta-im.com>. + + * manual/llio.texi: Document readv/writev and mmap functions. + Patch by Michael Deutschmann <michael@talamasca.wkpowerlink.com>. + +1998-07-16 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * manual/Makefile (texis): Depend on texis.awk. + (nonexamples): Filter out add-on chapters. + (chapters.% top-menu.%): Depend on libc-texinfo.sh. + (stamp-summary): Depend on $(texis) except summary.texi. + ($(inst_infodir)/libc.info): Simplify command. + * manual/libc-texinfo.sh: Cleaned up to use less temporary files. + Fix the generation of the detailed node listing to make it + complete again. + * manual/math.texi: Fix signature of lgamma_r. + 1998-07-16 23:06 Ulrich Drepper <drepper@cygnus.com> * debug/Makefile (distribute): Add sigcontextinfo.h. diff --git a/debug/Makefile b/debug/Makefile index 0826b9983a..ada992eb2c 100644 --- a/debug/Makefile +++ b/debug/Makefile @@ -44,7 +44,8 @@ include ../Rules $(objpfx)catchsegv: catchsegv.sh $(common-objpfx)soversions.mk \ $(common-objpfx)config.make - sed 's/@VERSION@/$(version)/;s/@SLIB@/$(slibdir)/' $< > $@.new + sed -e 's|@VERSION@|$(version)|' -e 's|@SLIB@|$(slibdir)|' \ + -e 's|@SOVER@|$(libSegFault.so-version)|' $< > $@.new chmod 555 $@.new mv -f $@.new $@ diff --git a/debug/catchsegv.sh b/debug/catchsegv.sh index 765242ecf8..26407a7ae6 100755 --- a/debug/catchsegv.sh +++ b/debug/catchsegv.sh @@ -24,7 +24,7 @@ shift args="$*" if test $# -eq 0; then - case "$args" in + case "$prog" in --h | --he | --hel | --help) echo 'Usage: catchsegv PROGRAM ARGS...' echo ' --help print this help, then exit' @@ -45,18 +45,18 @@ Written by Ulrich Drepper.' esac fi -LD_PRELOAD="${LD_PRELOAD:+${LD_PRELOAD}:}@SLIB@/libSegFault.so" +LD_PRELOAD="${LD_PRELOAD:+${LD_PRELOAD}:}@SLIB@/libSegFault.so@SOVER@" export LD_PRELOAD SEGFAULT_USE_ALTSTACK=1 export SEGFAULT_USE_ALTSTACK -SEGFAULT_OUTPUT_NAME="$prog.segv.$$" +SEGFAULT_OUTPUT_NAME="${TMPDIR:-/tmp}/`basename $prog`.segv.$$" export SEGFAULT_OUTPUT_NAME $prog $args exval=$? unset LD_PRELOAD -# Check for an segmentation fault. +# Check for an segmentation error. if test $exval -eq 139; then # We caught a segmentation error. The output is in the file with the # name we have in SEGFAULT_OUTPUT_NAME. In the output the names of @@ -66,10 +66,10 @@ if test $exval -eq 139; then read line; echo "$line" while read line; do case "$line" in - [*) addr="`echo $line | sed 's/^[\(.*\)]$/\1/'`" - complete="`addr2line -f -e $prog $addr 2>/dev/null|`" - if $? -eq 0; then - echo "`echo $complete|sed 'N;s/\(.*\)\n\(.*\)/\2(\1)/;'`$line" + [*) addr="`echo $line | sed 's/^\[\(.*\)\]$/\1/'`" + complete="`addr2line -f -e $prog $addr 2>/dev/null`" + if test $? -eq 0; then + echo "`echo $complete|sed 's/\(.*\) \(.*\)/\2(\1)/;'`$line" else echo "$line" fi diff --git a/manual/.cvsignore b/manual/.cvsignore index 01f89684cf..1d23d99cd2 100644 --- a/manual/.cvsignore +++ b/manual/.cvsignore @@ -8,5 +8,5 @@ glibc-* *.toc *.aux *.log *.tmp *.cp *.cps *.fn *.fns *.vr *.vrs *.tp *.tps *.ky *.kys *.pg *.pgs -chapters chapters-incl1 chapters-incl2 summary.texi stamp-* +texis top-menu.texi chapters.texi summary.texi stamp-* distinfo dir-add.texinfo diff --git a/manual/Makefile b/manual/Makefile index 8af1d6c1a2..47656c6c7f 100644 --- a/manual/Makefile +++ b/manual/Makefile @@ -48,35 +48,32 @@ endif mkinstalldirs = $(..)scripts/mkinstalldirs chapters = $(addsuffix .texi, \ - intro errno memory ctype string mbyte locale message search \ - pattern io stdio llio filesys pipe socket terminal math \ - arith time setjmp signal startup process job nss users \ - sysinfo conf) -add-chapters = $(wildcard $(patsubst %, ../%.texi, \ - $(join $(add-ons:=/),$(add-ons)))) + intro errno memory ctype string mbyte locale \ + message search pattern io stdio llio filesys \ + pipe socket terminal math arith time setjmp \ + signal startup process job nss users sysinfo conf) +add-chapters = $(wildcard $(foreach d, $(add-ons), ../$d/$d.texi)) appendices = lang.texi header.texi install.texi maint.texi contrib.texi -include texis -texis: $(chapters) $(add-chapters) $(appendices) lgpl.texinfo - $(AWK) -f texis.awk $^ > $@.T +texis: texis.awk $(chapters) $(add-chapters) $(appendices) lgpl.texinfo + $(AWK) -f $^ > $@.T mv -f $@.T $@ -nonexamples = $(filter-out %.c.texi, $(texis)) +nonexamples = $(filter-out $(add-chapters) %.c.texi, $(texis)) examples = $(filter %.c.texi, $(texis)) # Kludge: implicit rule so Make knows the one command does it all. -chapters.% top-menu.%: $(texis) - AWK=$(AWK) $(SHELL) libc-texinfo.sh \ - '$(chapters)' '$(add-chapters)' '$(appendices)' +chapters.% top-menu.%: libc-texinfo.sh $(texis) + AWK=$(AWK) $(SHELL) $< '$(chapters)' '$(add-chapters)' '$(appendices)' libc.dvi libc.info: chapters.texi top-menu.texi libc.dvi: texinfo.tex # Generate the summary from the Texinfo source files for each chapter. summary.texi: stamp-summary ; -stamp-summary: summary.awk $(chapters) $(chapters-incl) - $(AWK) -f $^ \ - | sort -df +1 -2 | tr '\014' '\012' > summary-tmp +stamp-summary: summary.awk $(filter-out summary.texi, $(texis)) + $(AWK) -f $^ | sort -df +1 -2 | tr '\014' '\012' > summary-tmp $(move-if-change) summary-tmp summary.texi touch $@ @@ -106,8 +103,8 @@ dir-add.texinfo: xtract-typefun.awk $(texis) $(TEXI2DVI) $< # Distribution. -minimal-dist = summary.awk texis.awk libc-texinfo.sh libc.texinfo \ - $(filter-out summary.texi, $(nonexamples)) \ +minimal-dist = summary.awk texis.awk libc-texinfo.sh libc.texinfo \ + $(filter-out summary.texi, $(nonexamples)) \ $(patsubst %.c.texi,examples/%.c, $(examples)) doc-only-dist = Makefile COPYING.LIB @@ -170,9 +167,7 @@ install-%: ; $(inst_infodir)/libc.info: libc.info installdirs for file in $<*; do \ - name=`basename $$file`; \ - $(INSTALL_DATA) $$file \ - `echo $@ | sed "s,$<\$$,$$name,"`; \ + $(INSTALL_DATA) $$file $(@D)/$$file; \ done installdirs: diff --git a/manual/libc-texinfo.sh b/manual/libc-texinfo.sh index 88733cb079..7f26f8ec5f 100644 --- a/manual/libc-texinfo.sh +++ b/manual/libc-texinfo.sh @@ -2,98 +2,71 @@ # Create libc.texinfo from the chapter files. -grep '^@node.*Top' $1 | cut -d, -f-2 | - sed 's/, /:/; s/:@node /:/; s/ /_/g; s/:/ /g' >cnodes.$$ - -$AWK '{ file[$2] = $1; nnode[$2] = $3 } -END { for(x in file) - if(file[x] != "") - print file[x] ":" x, file[nnode[x]] ":" nnode[x] }' \ - cnodes.$$ | tsort | sed 's/_/ /g; $d' >corder.$$ - -[ -z "$2" ] || grep '^@node.*Top' `echo $2 /dev/null | tr ' ' '\n' | sort` | - cut -d, -f1 | sed 's/@node //' >xorder.$$ - -grep '^@node.*Top' $3 | cut -d, -f-2 | - sed 's/, /:/; s/:@node /:/; s/ /_/g; s/:/ /g' >anodes.$$ - -$AWK '{ file[$2] = $1; nnode[$2] = $3 } -END { for(x in file) - if(file[x] != "") - print file[x] ":" x, file[nnode[x]] ":" nnode[x] }' \ - anodes.$$ | tsort | sed 's/_/ /g; $d' >aorder.$$ - -IFS=: - ->incl.$$ ->smenu.$$ ->lmenu.$$ - -while read file node; do - echo "@include $file" >>incl.$$ - echo "* $node:: `sed -n 's/^@c %MENU% //p' $file`" >>smenu.$$ - lmenu=`sed -n '/^@menu/,/^@end menu/p; /^@end menu/q' $file | - sed '/^@menu/d; /^@end menu/d'` - [ -z "$lmenu" ] || ( - echo; echo "$node"; echo - echo "$lmenu" - ) >>lmenu.$$ -done <corder.$$ - -if [ -f xorder.$$ ]; then - - (echo; echo 'Add-ons'; echo) >>smenu.$$ - - while read file node; do - echo "@include $file" >>incl.$$ - echo "* $node:: `sed -n 's/^@c %MENU% //p' $file`" >>smenu.$$ - lmenu=`sed -n '/^@menu/,/^@end menu/p; /^@end menu/q' $file | - sed '/^@menu/d; /^@end menu/d'` - [ -z "$lmenu" ] || ( - echo; echo "$node"; echo - echo "$lmenu" - ) >>lmenu.$$ - done <xorder.$$ -fi +trap "rm -f *.$$; exit 1" 1 2 15 + +exec 3>incl.$$ 4>smenu.$$ 5>lmenu.$$ + +build_menu () { + while IFS=: read file node; do + echo "@include $file" >&3 + echo "* $node:: `sed -n 's/^@c %MENU% //p' $file`" >&4 + $AWK 'BEGIN { do_menu = 0 } + /^@node / { sub(/^@node /, ""); sub(/,.*$/, ""); node = $0 } + /^@menu/ { printf "\n%s\n\n", node; do_menu = 1; next } + /^@end menu/ { do_menu = 0 } + do_menu { print }' $file >&5 + done +} -(echo; echo 'Appendices'; echo) >>smenu.$$ - -while read file node; do - echo "@include $file" >>incl.$$ - echo "* $node:: `sed -n 's/^@c %MENU% //p' $file`" >>smenu.$$ - lmenu=`sed -n '/^@menu/,/^@end menu/p; /^@end menu/q' $file | - sed '/^@menu/d; /^@end menu/d'` - [ -z "$lmenu" ] || ( - echo; echo "$node"; echo - echo "$lmenu" - ) >>lmenu.$$ -done <aorder.$$ - -$AWK ' -BEGIN { FS=":" } - -/^\*/ { - printf("%-32s", $1 "::"); - x = split($3, word, " "); - hpos = 34; - for(i = 1; i <= x; i++) { - hpos += length(word[i]) + 1; - if(hpos > 78) { - printf("\n%34s", ""); - hpos = 35 + length(word[i]); - } - printf(" %s", word[i]); - } - print "."; +collect_nodes () { + grep '^@node.*Top' "$@" /dev/null | cut -d, -f-2 | + sed 's/, /:/; s/:@node /:/; s/ /_/g; s/:/ /g' | + $AWK '{ file[$2] = $1; nnode[$2] = $3 } + END { for (x in file) + if (file[x] != "") + print file[x] ":" x, file[nnode[x]] ":" nnode[x] }' | + tsort | sed 's/_/ /g; $d' } -!/^\*/ { print; } -' smenu.$$ >smenux.$$ +collect_nodes $1 | build_menu + +if [ -n "$2" ]; then + + { echo; echo 'Add-ons'; echo; } >&4 + + grep '^@node.*Top' `echo $2 /dev/null | tr ' ' '\n' | sort` | + cut -d, -f1 | sed 's/@node //' | build_menu + +fi + +{ echo; echo 'Appendices'; echo; } >&4 + +collect_nodes $3 | build_menu + +exec 3>&- 4>&- 5>&- mv -f incl.$$ chapters.texi -(echo '@menu' - cat smenux.$$ +{ + echo '@menu' + $AWK -F: ' + /^\*/ { + printf("%-32s", $1 "::"); + x = split($3, word, " "); + hpos = 34; + for (i = 1; i <= x; i++) { + hpos += length(word[i]) + 1; + if (hpos > 78) { + printf("\n%34s", ""); + hpos = 35 + length(word[i]); + } + printf(" %s", word[i]); + } + print "."; + } + + !/^\*/ { print; } + ' smenu.$$ cat <<EOF * Copying:: The GNU Library General Public License says how you can copy and share the GNU C Library. @@ -109,7 +82,7 @@ Indices --- The Detailed Node Listing --- EOF cat lmenu.$$ - echo '@end menu' ) >top-menu.texi.$$ + echo '@end menu'; } >top-menu.texi.$$ mv -f top-menu.texi.$$ top-menu.texi rm -f *.$$ diff --git a/manual/llio.texi b/manual/llio.texi index 459032ee3a..cf3e1a7c89 100644 --- a/manual/llio.texi +++ b/manual/llio.texi @@ -41,6 +41,8 @@ directly.) or vice-versa. * Stream/Descriptor Precautions:: Precautions needed if you use both descriptors and streams. +* Scatter-Gather:: Fast I/O to discontinous buffers. +* Memory-mapped I/O:: Using files like memory. * Waiting for I/O:: How to check for input or output on multiple file descriptors. * Synchronizing I/O:: Making sure all I/O actions completed. @@ -58,6 +60,7 @@ directly.) file locking. * Interrupt Input:: Getting an asynchronous signal when input arrives. +* IOCTLs:: Generic I/O Control operations. @end menu @@ -88,7 +91,7 @@ parameters (using the @samp{|} operator in C). @xref{File Status Flags}, for the parameters available. The normal return value from @code{open} is a non-negative integer file -descriptor. In the case of an error, a value of @code{-1} is returned +descriptor. In the case of an error, a value of @math{-1} is returned instead. In addition to the usual file name errors (@pxref{File Name Errors}), the following @code{errno} error conditions are defined for this function: @@ -240,7 +243,7 @@ until the program ends. To avoid this calls to @code{close} should be protected using cancelation handlers. @c ref pthread_cleanup_push / pthread_cleanup_pop -The normal return value from @code{close} is @code{0}; a value of @code{-1} +The normal return value from @code{close} is @math{0}; a value of @math{-1} is returned in case of failure. The following @code{errno} error conditions are defined for this function: @@ -422,7 +425,7 @@ If @code{read} returns at least one character, there is no way you can tell whether end-of-file was reached. But if you did reach the end, the next read will return zero. -In case of an error, @code{read} returns @code{-1}. The following +In case of an error, @code{read} returns @math{-1}. The following @code{errno} error conditions are defined for this function: @table @code @@ -564,7 +567,7 @@ is therefore faster. You can use the @code{O_FSYNC} open mode to make @code{write} always store the data to disk before returning; @pxref{Operating Modes}. -In the case of an error, @code{write} returns @code{-1}. The following +In the case of an error, @code{write} returns @math{-1}. The following @code{errno} error conditions are defined for this function: @table @code @@ -761,7 +764,7 @@ file takes up less space than it appears so; it is then called a @cindex holes in files If the file position cannot be changed, or the operation is in some way -invalid, @code{lseek} returns a value of @code{-1}. The following +invalid, @code{lseek} returns a value of @math{-1}. The following @code{errno} error conditions are defined for this function: @table @code @@ -944,7 +947,7 @@ see @ref{Creating a Pipe}. This function returns the file descriptor associated with the stream @var{stream}. If an error is detected (for example, if the @var{stream} is not valid) or if @var{stream} does not do I/O to a file, -@code{fileno} returns @code{-1}. +@code{fileno} returns @math{-1}. @end deftypefun @cindex standard file descriptors @@ -1122,6 +1125,341 @@ terminal settings that were in effect at the time, flush the output streams for that terminal before setting the modes. @xref{Terminal Modes}. +@node Scatter-Gather +@section Fast Scatter-Gather I/O +@cindex scatter-gather + +Some applications may need to read or write data to multiple buffers, +which are seperated in memory. Although this can be done easily enough +with multiple calls to @code{read} and @code{write}, it is inefficent +because there is overhead associated with each kernel call. + +Instead, many platforms provide special high-speed primitives to perform +these @dfn{scatter-gather} operations in a single kernel call. The GNU C +library will provide an emulation on any system that lacks these +primitives, so they are not a portability threat. They are defined in +@code{sys/uio.h}. + +These functions are controlled with arrays of @code{iovec} structures, +which describe the location and size of each buffer. + +@deftp {Data Type} {struct iovec} + +The @code{iovec} structure describes a buffer. It contains two fields: + +@table @code + +@item void *iov_base +Contains the address of a buffer. + +@item size_t iov_len +Contains the length of the buffer. + +@end table +@end deftp + +@deftypefun ssize_t readv (int @var{filedes}, const struct iovec *@var{vector}, int @var{count}) + +The @code{readv} function reads data from @var{filedes} and scatters it +into the buffers described in @var{vector}, which is taken to be +@var{count} structures long. As each buffer is filled, data is sent to the +next. + +Note that @code{readv} is not guaranteed to fill all the buffers. +It may stop at any point, for the same reasons @code{read} would. + +The return value is a count of bytes (@emph{not} buffers) read, @math{0} +indicating end-of-file, or @math{-1} indicating an error. The possible +errors are the same as in @code{read}. + +@end deftypefun + +@deftypefun ssize_t writev (int @var{filedes}, const struct iovec *@var{vector}, int @var{count}) + +The @code{writev} function gathers data from the buffers described in +@var{vector}, which is taken to be @var{count} structures long, and writes +them to @code{filedes}. As each buffer is written, it moves on to the +next. + +Like @code{readv}, @code{writev} may stop midstream under the same +conditions @code{write} would. + +The return value is a count of bytes written, or @math{-1} indicating an +error. The possible errors are the same as in @code{write}. + +@end deftypefun + +@c Note - I haven't read this anywhere. I surmised it from my knowledge +@c of computer science. Thus, there could be subtleties I'm missing. + +Note that if the buffers are small (under about 1kB), high-level streams +may be easier to use than these functions. However, @code{readv} and +@code{writev} are more efficient when the individual buffers themselves +(as opposed to the total output), are large. In that case, a high-level +stream would not be able to cache the data effectively. + +@node Memory-mapped I/O +@section Memory-mapped I/O + +On modern operating systems, it is possible to @dfn{mmap} (pronounced +``em-map'') a file to a region of memory. When this is done, the file can +be accessed just like an array in the program. + +This is more efficent than @code{read} or @code{write}, as only regions +of the file a program actually accesses are loaded. Accesses to +not-yet-loaded parts of the mmapped region are handled in the same way as +swapped out pages. + +Since mmapped pages can be stored back to their file when physical memory +is low, it is possible to mmap files orders of magnitude larger than both +the physical memory @emph{and} swap space. The only limit is address +space. The theoretical limit is 4GB on a 32-bit machine - however, the +actual limit will be smaller since some areas will be reserved for other +purposes. + +Memory mapping only works on entire pages of memory. Thus, addresses +for mapping must be page-aligned, and length values will be rounded up. +To determine t |
