diff options
author | K. Richard Pixley <rich@cygnus> | 1992-12-08 05:21:19 +0000 |
---|---|---|
committer | K. Richard Pixley <rich@cygnus> | 1992-12-08 05:21:19 +0000 |
commit | 017349fbcff97ddad57d87a7a43b8a68dd09cc5b (patch) | |
tree | c89f602f3180ba64b92102cd508f40e993d11216 | |
parent | 43bbd567f2d928b2628e508ee9c75a3920e26b4d (diff) | |
download | gdb-017349fbcff97ddad57d87a7a43b8a68dd09cc5b.zip gdb-017349fbcff97ddad57d87a7a43b8a68dd09cc5b.tar.gz gdb-017349fbcff97ddad57d87a7a43b8a68dd09cc5b.tar.bz2 |
recording file death
-rwxr-xr-x | gprof/Makefile | 46 | ||||
-rw-r--r-- | gprof/blurbs.c | 219 | ||||
-rwxr-xr-x | gprof/config/tmake-i386 | 1 | ||||
-rwxr-xr-x | gprof/config/tmake-sparc | 1 | ||||
-rwxr-xr-x | gprof/configure | 678 | ||||
-rw-r--r-- | gprof/gprof.callg | 108 | ||||
-rw-r--r-- | gprof/gprof.flat | 32 | ||||
-rw-r--r-- | gprof/make-c-prog.awk | 29 | ||||
-rwxr-xr-x | gprof/pathnames.h | 24 | ||||
-rwxr-xr-x | gprof/t.c | 12 | ||||
-rwxr-xr-x | mmalloc/README | 160 | ||||
-rwxr-xr-x | mmalloc/fsf.shar.orig | 1841 |
12 files changed, 0 insertions, 3151 deletions
diff --git a/gprof/Makefile b/gprof/Makefile deleted file mode 100755 index 30d13f0..0000000 --- a/gprof/Makefile +++ /dev/null @@ -1,46 +0,0 @@ -# This file was generated automatically by configure. Do not edit. -VPATH = . -links = -host_alias = sparc-sun-solaris -host_cpu = sparc -host_vendor = sun -host_os = solaris -target_alias = sparc-sun-solaris -target_cpu = sparc -target_vendor = sun -target_os = solaris -target_makefile_frag = ./config/mt-sparc -ALL=all.internal -# @(#)Makefile 5.17 (Berkeley) 5/11/90 - -#### host and target dependent Makefile fragments come in here. -MACHINE=sparc -### - -PROG= gprof -SRCS= gprof.c arcs.c dfn.c lookup.c ${MACHINE}.c hertz.c \ - printgprof.c printlist.c -LIBS = ../bfd/libbfd.a ../libiberty/libiberty.a - -OBJS= gprof.o arcs.o dfn.o lookup.o ${MACHINE}.o hertz.o \ - printgprof.o printlist.o - -CFLAGS= -I. -I../include -DMACHINE_H=\"${MACHINE}.h\" ${TCFLAGS} ${HCFLAGS} -.c.o: - $(CC) -c $(CFLAGS) $< - -all: ${PROG} - -.PHONY: check -check: - -beforeinstall: - install -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ - ${.CURDIR}/gprof.flat ${.CURDIR}/gprof.callg \ - ${DESTDIR}/usr/share/misc - -$(PROG): $(OBJS) - $(CC) $(CFLAGS) $(OBJS) -o $(PROG) $(LIBS) - -clean: - -rm -f $(OBJS) core gprof nohup.out diff --git a/gprof/blurbs.c b/gprof/blurbs.c deleted file mode 100644 index e586fa2..0000000 --- a/gprof/blurbs.c +++ /dev/null @@ -1,219 +0,0 @@ -#include <stdio.h> -#include "gprof.h" - -void -flat_blurb (file) - FILE *file; -{ - fputs("\n\ - % the percentage of the total running time of the\n\ -time program used by this function.\n\ -\n\ -cumulative a running sum of the number of seconds accounted\n\ - seconds for by this function and those listed above it.\n\ -\n\ - self the number of seconds accounted for by this\n\ -seconds function alone. This is the major sort for this\n\ - listing.\n\ -\n\ -calls the number of times this function was invoked, if\n\ - this function is profiled, else blank.\n\ - \n\ - self the average number of milliseconds spent in this\n\ -ms/call function per call, if this function is profiled,\n\ - else blank.\n\ -\n\ - total the average number of milliseconds spent in this\n\ -ms/call function and its descendents per call, if this \n\ - function is profiled, else blank.\n\ -\n\ -name the name of the function. This is the minor sort\n\ - for this listing. The index shows the location of\n\ - the function in the gprof listing. If the index is\n\ - in parenthesis it shows where it would appear in\n\ - the gprof listing if it were to be printed.\n\ -\n", file); -} - -static char *callg_blurb_bsd = "\n\ -\n\ -\n\ -call graph profile:\n\ - The sum of self and descendents is the major sort\n\ - for this listing.\n\ -\n\ - function entries:\n\ -\n\ -index the index of the function in the call graph\n\ - listing, as an aid to locating it (see below).\n\ -\n\ -%time the percentage of the total time of the program\n\ - accounted for by this function and its\n\ - descendents.\n\ -\n\ -self the number of seconds spent in this function\n\ - itself.\n\ -\n\ -descendents\n\ - the number of seconds spent in the descendents of\n\ - this function on behalf of this function.\n\ -\n\ -called the number of times this function is called (other\n\ - than recursive calls).\n\ -\n\ -self the number of times this function calls itself\n\ - recursively.\n\ -\n\ -name the name of the function, with an indication of\n\ - its membership in a cycle, if any.\n\ -\n\ -index the index of the function in the call graph\n\ - listing, as an aid to locating it.\n\ -\n\ -\n\ -\n\ - parent listings:\n\ -\n\ -self* the number of seconds of this function's self time\n\ - which is due to calls from this parent.\n\ -\n\ -descendents*\n\ - the number of seconds of this function's\n\ - descendent time which is due to calls from this\n\ - parent.\n\ -\n\ -called** the number of times this function is called by\n\ - this parent. This is the numerator of the\n\ - fraction which divides up the function's time to\n\ - its parents.\n\ -\n\ -total* the number of times this function was called by\n\ - all of its parents. This is the denominator of\n\ - the propagation fraction.\n\ -\n\ -parents the name of this parent, with an indication of the\n\ - parent's membership in a cycle, if any.\n\ -\n\ -index the index of this parent in the call graph\n\ - listing, as an aid in locating it.\n\ -\n\ -\n\ -\n\ - children listings:\n\ -\n\ -self* the number of seconds of this child's self time\n\ - which is due to being called by this function.\n\ -\n\ -descendent*\n\ - the number of seconds of this child's descendent's\n\ - time which is due to being called by this\n\ - function.\n\ -\n\ -called** the number of times this child is called by this\n\ - function. This is the numerator of the\n\ - propagation fraction for this child.\n\ -\n\ -total* the number of times this child is called by all\n\ - functions. This is the denominator of the\n\ - propagation fraction.\n\ -\n\ -children the name of this child, and an indication of its\n\ - membership in a cycle, if any.\n\ -\n\ -index the index of this child in the call graph listing,\n\ - as an aid to locating it.\n\ -\n\ -\n\ -\n\ - * these fields are omitted for parents (or\n\ - children) in the same cycle as the function. If\n\ - the function (or child) is a member of a cycle,\n\ - the propagated times and propagation denominator\n\ - represent the self time and descendent time of the\n\ - cycle as a whole.\n\ -\n\ - ** static-only parents and children are indicated\n\ - by a call count of 0.\n\ -\n\ -\n\ -\n\ - cycle listings:\n\ - the cycle as a whole is listed with the same\n\ - fields as a function entry. Below it are listed\n\ - the members of the cycle, and their contributions\n\ - to the time and call counts of the cycle.\n\ -\n"; - -static char *callg_blurb_fsf = "\n\ - This table describes the call tree of the program, and was sorted by\n\ - the total amount of time spent in each function and its children.\n\n\ - Each entry in this table consists of several lines. The line with the\n\ - index number at the left hand margin lists the current function.\n\ - The lines above it list the functions that called this function,\n\ - and the lines below it list the functions this one called.\n\ - This line lists:\n\ - index A unique number given to each element of the table.\n\ - Index numbers are sorted numerically.\n\ - The index number is printed next to every function name so\n\ - it is easier to look up where the function in the table.\n\n\ - % time This is the percentage of the `total' time that was spent\n\ - in this function and its children. Note that due to\n\ - different viewpoints, functions excluded by options, etc,\n\ - these numbers will NOT add up to 100%.\n\n\ - self This is the total amount of time spent in this function.\n\n\ - children This is the total amount of time propagated into this\n\ - function by its children.\n\n\ - called This is the number of times the function was called.\n\ - If the function called itself recursively, the number\n\ - only includes non-recursive calls, and is followed by\n\ - a `+' and the number of recursive calls.\n\n\ - name The name of the current function. The index number is\n\ - printed after it. If the function is a member of a\n\ - cycle, the cycle number is printed between the\n\ - function's name and the index number.\n\n\n\ - For the function's parents, the fields have the following meanings:\n\n\ - self This is the amount of time that was propagated directly\n\ - from the function into this parent.\n\n\ - children This is the amount of time that was propagated from\n\ - the function's children into this parent.\n\n\ - called This is the number of times this parent called the\n\ - function `/' the total number of times the function\n\ - was called. Recursive calls to the function are not\n\ - included in the number after the `/'.\n\n\ - name This is the name of the parent. The parent's index\n\ - number is printed after it. If the parent is a\n\ - member of a cycle, the cycle number is printed between\n\ - the name and the index number.\n\n\ - If the parents of the function cannot be determined, the word\n\ - `<spontaneous>' is printed in the `name' field, and all the other\n\ - fields are blank.\n\n\ - For the function's children, the fields have the following meanings:\n\n\ - self This is the amount of time that was propagated directly\n\ - from the child into the function.\n\n\ - children This is the amount of time that was propagated from the\n\ - child's children to the function.\n\n\ - called This is the number of times the function called\n\ - this child `/' the total number of times the child\n\ - was called. Recursive calls by the child are not\n\ - listed in the number after the `/'.\n\n\ - name This is the name of the child. The child's index\n\ - number is printed after it. If the child is a\n\ - member of a cycle, the cycle number is printed\n\ - between the name and the index number.\n\n\ - If there are any cycles (circles) in the call graph, there is an\n\ - entry for the cycle-as-a-whole. This entry shows who called the\n\ - cycle (as parents) and the members of the cycle (as children.)\n\ - The `+' recursive calls entry shows the number of function calls that\n\ - were internal to the cycle, and the calls entry for each member shows,\n\ - for that member, how many times it was called from other members of\n\ - the cycle.\n\n"; - -void -callg_blurb (file) - FILE *file; -{ - if (bsd_style_output) - fputs(callg_blurb_bsd, file); - else - fputs(callg_blurb_fsf, file); -} diff --git a/gprof/config/tmake-i386 b/gprof/config/tmake-i386 deleted file mode 100755 index 5b45798..0000000 --- a/gprof/config/tmake-i386 +++ /dev/null @@ -1 +0,0 @@ -MACHINE=i386 diff --git a/gprof/config/tmake-sparc b/gprof/config/tmake-sparc deleted file mode 100755 index b88bc27..0000000 --- a/gprof/config/tmake-sparc +++ /dev/null @@ -1 +0,0 @@ -MACHINE=sparc diff --git a/gprof/configure b/gprof/configure deleted file mode 100755 index a42008f..0000000 --- a/gprof/configure +++ /dev/null @@ -1,678 +0,0 @@ -#!/bin/sh -# Please do not edit this file. It is generated automatically from -# configure.in and a configure template. -configdirs= - -# the debugger. -#set -x - -#!/bin/sh - -# Configuration script template -# Copyright (C) 1988, 1990, 1991 Free Software Foundation, Inc. - -#This file is part of GNU. - -#GNU CC is free software; you can redistribute it and/or modify -#it under the terms of the GNU General Public License as published by -#the Free Software Foundation; either version 1, or (at your option) -#any later version. - -#GNU CC is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. - -#You should have received a copy of the GNU General Public License -#along with GNU CC; see the file COPYING. If not, write to -#the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -# $Id$ - -# -# Shell script to create proper links to machine-dependent files in -# preparation for compilation. -# -# If configure succeeds, it leaves its status in config.status. -# If configure fails after disturbing the status quo, -# config.status is removed. -# - -remove=rm -hard_link=ln -symbolic_link='ln -s' - -#for Test -#remove="echo rm" -#hard_link="echo ln" -#symbolic_link="echo ln -s" - -progname=$0 - -# clear some things potentially inherited from environment. - -ansi= -clib= -defaulttargets= -destdir= -fatal= -hostsubdir= -norecurse= -removing= -srcdir= -srctrigger= -target= -targets= -targetsubdir= -template= -verbose= - -for arg in $*; -do - case ${arg} in - -ansi | +ansi) - ansi=true - ;; - -clib | +c*) - clib=clib - ;; - -destdir=* | +destdir=* | +destdi=* | +destd=* | +dest=* | +des=* | +de=* | +d=*) - destdir=`echo ${arg} | sed 's/[+-]d[a-z]*=//'` - ;; - -forcesubdirs | +forcesubdirs | +forcesubdir | +forcesubdi | +forcesubd \ - | +forcesub | +forcesu | +forces | +force | +forc | +for | +fo | +f) - forcesubdirs=${arg} - ;; - -languages=* | +languages=* | +language=* | +languag=* \ - | +langua=* | +langu=* | +lang=* | +lan=* | +la=* \ - | +l=*) - languages="${languages} `echo ${arg} | sed 's/[+-]l[a-z]*=//'`" - ;; - -gas | +gas | +ga | +g) - gas=yes - ;; - -help | +h | +help) - fatal=true - ;; - -nfp | +nfp | +nf | +n) - nfp=yes - ;; - -norecurse | +norecurse) - norecurse=true - ;; - -rm | +rm) - removing=${arg} - ;; -# -srcdir=* | +srcdir=* | +srcdi=* | +srcd=* | +src=* | +sr=* | +s=*) -# srcdir=`echo ${arg} | sed 's/[+-]s[a-z]*=//'` -# ;; - -target=* | +target=* | +targe=* | +targ=* | +tar=* | +ta=* | +t=*) - if [ -n "${targets}" ] ; then - forcesubdirs="+forcesubdirs" - fi - - newtargets="${targets} `echo ${arg} | sed 's/[+-]t[a-z]*=//'`" - targets="${newtargets}" - ;; - -template=* | +template=*) - template=`echo ${arg} | sed 's/[+-]template=//'` - ;; - +verbose | +verbos | +verbo | +verb | +ver | +ve | +v) - verbose=${arg} - ;; - -* | +*) - (echo ; - echo "Unrecognized option: \"${arg}\"". ; - echo) 1>&2 - fatal=true - ;; - *) - if [ -n "${hosts}" ] ; then - forcesubdirs="+forcesubdirs" - fi - - newhosts="${hosts} ${arg}" - hosts=${newhosts} - ;; - esac -done - -if [ -n "${verbose}" ] ; then - echo `pwd`/configure $* - echo targets=\"${targets}\" -fi - -# process host and target only if not rebuilding configure itself or removing. -if [ -z "${template}" -a -z "${removing}" -a -z "${fatal}" ] ; then - # Complain if an arg is missing - if [ -z "${hosts}" ] ; then - (echo ; - echo "configure: No HOST specified." ; - echo) 2>&1 - fatal=true - fi -fi - -if [ -n "${fatal}" -o "${hosts}" = "help" ] ; then - (echo "Usage: configure HOST" ; - echo ; - echo "Options: [defaults in brackets]" ; - echo " +ansi configure w/ANSI library. [no ansi lib]" ; - echo " +destdir=MYDIR configure for installation into MYDIR. [/usr/local]" ; - echo " +forcesubdirs configure in subdirectories. [in source directories]" ; - echo " +lang=LANG configure to build LANG. [gcc]" ; - echo " +help print this message. [normal config]" ; - echo " +gas configure the compilers for use with gas. [native as]" ; - echo " +nfp configure the compilers default to soft floating point. [hard float]" ; - echo " +norecurse configure this directory only. [recurse]" ; - echo " +rm remove this configuration. [build a configuration]" ; - echo " +target=TARGET configure for TARGET. [TARGET = HOST]" ; - echo " +template=TEM rebuild configure using TEM. [normal config]" ; - echo ; - echo "Where HOST and TARGET are something like \"vax\", \"sun3\", \"encore\", etc." ; - echo "Asking for more than one \"+target\" implies \"+forcesubdirs\". Any other" ; - echo "options given will apply to all targets.") 1>&2 - - if [ -r config.status ] ; then - cat config.status - fi - - exit 1 -fi - -#### configure.in common parts come in here. -# This file is a shell script that supplies the information necessary -# to tailor a template configure script into the configure script -# appropriate for this directory. For more information, check any -# existing configure script. - -srctrigger=gprof.c -srcname="gprof" - -## end of common part. - -# are we rebuilding config itself? -if [ -n "${template}" ] ; then - if [ ! -r ${template} ] ; then - echo "Can't find template ${template}." - exit 1 - fi - -# prep the template - sed -e '/^#### configure.in common parts come in here.$/,/^## end of common part.$/c\ -#### configure.in common parts come in here.\ -## end of common part.' \ - -e '/^#### configure.in per-host parts come in here.$/,/^## end of per-host part.$/c\ -#### configure.in per-host parts come in here.\ -## end of per-host part.' \ - -e '/^#### configure.in per-target parts come in here.$/,/^## end of per-target part.$/c\ -#### configure.in per-target parts come in here.\ -## end of per-target part.' \ - < ${template} > template.new - - if [ -r configure.in ] ; then - if [ -z "`grep '^# per\-host:' configure.in`" ] ; then - echo `pwd`/configure.in has no "per-host:" line. - exit 1 - fi - - if [ -z "`grep '^# per\-target:' configure.in`" ] ; then - echo `pwd`/configure.in has no "per-target:" line. - exit 1 - fi - - # split configure.in into common, per-host, and per-target parts - sed -e '/^# per\-host:/,$d' configure.in > configure.com - sed -e '1,/^# per\-host:/d' -e '/^# per\-target:/,$d' configure.in > configure.hst - sed -e '1,/^# per\-target:/d' configure.in > configure.tgt - - # and insert them - sed -e '/^#### configure.in common parts come in here.$/ r configure.com' \ - -e '/^#### configure.in per\-host parts come in here.$/ r configure.hst' \ - -e '/^#### configure.in per\-target parts come in here.$/ r configure.tgt' \ - template.new > configure.new - - rm -f configure.com configure.tgt configure.hst - else - echo Warning: no configure.in in `pwd` - cat ${template} >> configure - fi - - chmod a+x configure.new - rm template.new -# mv configure configure.old - mv configure.new configure - echo Rebuilt configure in `pwd` - - if [ -z "${norecurse}" ] ; then - while [ -n "${configdirs}" ] ; do - # set configdir to car of configdirs, configdirs to cdr of configdirs - set ${configdirs}; configdir=$1; shift; configdirs=$* - - if [ "`echo ${configdir}.*`" != "${configdir}.*" ] ; then - targetspecificdirs=${configdir}.* - else - targetspecificdirs= - fi - - for i in ${configdir} ${targetspecificdirs} ; do - if [ -d $i ] ; then - if [ -r $i/configure ] ; then - (cd $i ; - ./configure +template=${template} ${verbose}) - else - echo No configure script in `pwd`/$i - fi - else - echo Warning: directory $i is missing. - fi - done - done - fi - - exit 0 -fi - -# some sanity checks on configure.in -if [ -z "${srctrigger}" ] ; then - echo srctrigger not set in configure.in. `pwd` not configured. - exit 1 -fi - -for host in ${hosts} ; do - # Default other arg - if [ -z "${targets}" -o -n "${defaulttargets}" ] ; then - targets=${host} - defaulttargets=true - fi - - host_makefile_frag=config/hmake-${host} - -#### configure.in per-host parts come in here. - -## end of per-host part. - - - for target in ${targets} ; do - - if [ -n "${verbose}" ] ; then - echo host \= \"${host}\", target \= \"${target}\". - fi - - target_makefile_frag=config/tmake-${target} - -#### configure.in per-target parts come in here. - -files= -links= -## end of per-target part. - - # Temporarily, we support only direct subdir builds. - hostsubdir=Host-${host} - targetsubdir=Target-${target} - - if [ -n "${removing}" ] ; then - if [ -n "${forcesubdirs}" ] ; then - if [ -d "${hostsubdir}" ] ; then - rm -rf ${hostsubdir}/${targetsubdir} - - if [ -z "`(ls ${hostsubdir}) 2>&1 | grep Target-`" ] ; then - rm -rf ${hostsubdir} - fi - else - echo Warning: no `pwd`/${hostsubdir} to remove. - fi - else - rm -f Makefile config.status ${links} - fi - else - if [ -n "${forcesubdirs}" ] ; then - # check for existing status before allowing forced subdirs. - if [ -f Makefile ] ; then - echo "Makefile already exists in source directory. `pwd` not configured." - exit 1 - fi - - if [ ! -d ${hostsubdir} ] ; then mkdir ${hostsubdir} ; fi - cd ${hostsubdir} - - if [ ! -d ${targetsubdir} ] ; then mkdir ${targetsubdir} ; fi - cd ${targetsubdir} - - srcdir=../.. - else - # if not subdir builds, then make sure none exist. - if [ -n "`(ls .) 2>&1 | grep Host-`" ] ; then - echo "Configured subdirs exist. `pwd` not configured." - exit 1 - fi - fi - - # Find the source files, if location was not specified. - if [ -z "${srcdir}" ] ; then - srcdirdefaulted=1 - srcdir=. - if [ -n "${srctrigger}" -a ! -r ${srctrigger} ] ; then - srcdir=.. - fi - fi - - if [ -n "${srctrigger}" -a ! -r ${srcdir}/${srctrigger} ] ; then - if [ -z "${srcdirdefaulted}" ] ; then - echo "${progname}: Can't find ${srcname} sources in `pwd`/${srcdir}" 1>&2 - else - echo "${progname}: Can't find ${srcname} sources in `pwd`/. or `pwd`/.." 1>&2 - fi - - echo \(At least ${srctrigger} is missing.\) 1>&2 - exit 1 - fi - - # Set up the list of links to be made. - # ${links} is the list of link names, and ${files} is the list of names to link to. - - # Make the links. - while [ -n "${files}" ] ; do - # set file to car of files, files to cdr of files - set ${files}; file=$1; shift; files=$* - set ${links}; link=$1; shift; links=$* - - if [ ! -r ${srcdir}/${file} ] ; then - echo "${progname}: cannot create a link \"${link}\"," 1>&2 - echo "since the file \"${file}\" does not exist." 1>&2 - exit 1 - fi - - ${remove} -f ${link} - rm -f config.status - # Make a symlink if possible, otherwise try a hard link - ${symbolic_link} ${srcdir}/${file} ${link} 2>/dev/null || ${hard_link} ${srcdir}/${file} ${link} - - if [ ! -r ${link} ] ; then - echo "${progname}: unable to link \"${link}\" to \"${srcdir}/${file}\"." 1>&2 - exit 1 - fi - echo "Linked \"${link}\" to \"${srcdir}/${file}\"." - done - - # Create a .gdbinit file which runs the one in srcdir - # and tells GDB to look there for source files. - - case ${srcdir} in - .) - ;; - *) - echo "dir ." > .gdbinit - echo "dir ${srcdir}" >> .gdbinit - echo "source ${srcdir}/.gdbinit" >> .gdbinit - ;; - esac - - # Install a makefile, and make it set VPATH - # if necessary so that the sources are found. - # Also change its value of srcdir. - - # FIXME-someday: This business of always writing to .tem and mv back - # is so that I don't screw things up while developing. Once this - # template is stable, these should be optimized. xoxorich. - - # Define macro CROSS_COMPILE in compilation if this is a cross-compiler. - if [ "${host}" != "${target}" ] ; then - echo "CROSS=-DCROSS_COMPILE" > Makefile - echo "ALL=start.encap" >> Makefile - else - echo "ALL=all.internal" > Makefile - fi - - # set target, host, VPATH - echo "host = ${host}" >> Makefile - echo "target = ${target}" >> Makefile - - if [ -n "${forcesubdirs}" ] ; then - echo "subdir = /${hostsubdir}/${targetsubdir}" >> Makefile - else - echo "subdir =" >> Makefile - fi - - # echo "workdir = `pwd`" >> Makefile - echo "VPATH = ${srcdir}" >> Makefile - - # add Makefile.in - cat ${srcdir}/Makefile.in >> Makefile - - # and shake thoroughly. - # Conditionalize the makefile for this host. - if [ -f ${srcdir}/${host_makefile_frag} ] ; then - sed -e "/^####/ r ${srcdir}/${host_makefile_frag}" Makefile > Makefile.tem - mv Makefile.tem Makefile - fi - - # Conditionalize the makefile for this target. - if [ -f ${srcdir}/${target_makefile_frag} ] ; then - sed -e "/^####/ r ${srcdir}/${target_makefile_frag}" Makefile > Makefile.tem - mv Makefile.tem Makefile - fi - - # set srcdir - sed "s@^srcdir = \.@srcdir = ${srcdir}@" Makefile > Makefile.tem - mv Makefile.tem Makefile - - # set destdir - if [ -n "${destdir}" ] ; then - sed "s:^destdir =.*$:destdir = ${destdir}:" Makefile > Makefile.tem - mv Makefile.tem Makefile - fi - - # Remove all formfeeds, since some Makes get confused by them. - sed "s///" Makefile >> Makefile.tem - mv Makefile.tem Makefile - - # reset SUBDIRS - sed "s:^SUBDIRS =.*$:SUBDIRS = ${configdirs}:" Makefile > Makefile.tem - mv Makefile.tem Makefile - - # reset NONSUBDIRS - sed "s:^NONSUBDIRS =.*$:NONSUBDIRS = ${noconfigdirs}:" Makefile > Makefile.tem - mv Makefile.tem Makefile - - using= - if [ -f ${srcdir}/${host_makefile_frag} ] ; then - using=" using \"${host_makefile_frag}\"" - fi - - if [ -f ${srcdir}/${target_makefile_frag} ] ; then - if [ -z "${using}" ] ; then - andusing=" using \"${target_makefile_frag}\"" - else - andusing="${using} and \"${target_makefile_frag}\"" - fi - else - andusing=${using} - fi - - echo "Created \"Makefile\"" in `pwd`${andusing}. - - if [ "${host}" = "${target}" ] ; then - echo "Links are now set up for use with a ${target}." \ - > config.status - # | tee ${srcdir}/config.status - else - echo "Links are now set up for host ${host} and target ${target}." \ - > config.status - # | tee ${srcdir}/config.status - fi - - originaldir=`pwd` - cd ${srcdir} - fi - done # for each target - -# # Now build a Makefile for this host. -# if [ -n "${forcesubdirs}" ] ; then -# cd ${hostsubdir} -# cat > GNUmakefile << E!O!F -## Makefile generated by configure for host ${host}. -# -#%: -# for i in ${targets} ; do \ -# $(MAKE) -C Target-\$i \$@ -# -#all clean stage1 stage2 stage3 stage4etags tags TAGS -#E!O!F -# fi -done # for each host - -# If there are subdirectories, then recurse. - -if [ -n "${norecurse}" -o -z "${configdirs}" ] ; then exit 0 ; fi - -# configdirs is not null -for configdir in ${configdirs} ; do - echo Configuring ${configdir}... - specifics= - commons= - - if [ -n "${defaulttargets}" ] ; then - for host in ${hosts} ; do - if [ -d ${configdir}.${host} ] ; then - newspecifics="${specifics} ${host}" - specifics=${newspecifics} - else - newcommons="${commons} ${host}" - commons=${newcommons} - fi # if target specific - done # for each host - - if [ -n "${commons}" ] ; then - if [ -d ${configdir} ] ; then - (cd ${configdir} ; - ./configure ${commons} ${verbose} ${forcesubdirs} ${removing} "+destdir=${destdir}") \ - | sed 's/^/ /' - else - echo Warning: directory \"${configdir}\" is missing. - fi - fi # if any common hosts - - if [ -n "${specifics}" ] ; then - for host in ${specifics} ; do - echo Configuring target specific directory ${configdir}.${host}... - (cd ${configdir}.${host} ; - ./configure ${host} ${verbose} ${forcesubdirs} ${removing} "+destdir=${destdir}") \ - | sed 's/^/ /' - done # for host in specifics - fi # if there are any specifics - else - - for target in ${targets} ; do - if [ -d ${configdir}.${target} ] ; then - newspecifics="${specifics} ${target}" - specifics=${newspecifics} - else - newcommons="${commons} +target=${target}" - commons=${newcommons} - fi - - done # check for target specific dir override - - if [ -n "${verbose}" ] ; then - echo " "commons=\"${commons}\" - echo " "specifics=\"${specifics}\" - fi # if verbose - - if [ -n "${commons}" ] ; then - if [ -d ${configdir} ] ; then - (cd ${configdir} ; - ./configure ${hosts} ${verbose} ${forcesubdirs} ${removing} ${commons} "+destdir=${destdir}") \ - | sed 's/^/ /' - else - echo Warning: directory \"${configdir}\" is missing. - fi - fi # if any commons - - if [ -n "${specifics}" ] ; then - for target in ${specifics} ; do - echo Configuring target specific directory ${configdir}.${target}... - (cd ${configdir}.${target} ; - ./configure ${hosts} ${verbose} ${forcesubdirs} ${removing} "+target=${target}" "+destdir=${destdir}") \ - | sed 's/^/ /' - done - fi # if any specifics - fi # not default targets -done - -exit 0 - -# -# $Log$ -# Revision 1.1 1991/07/23 19:09:21 sef -# Initial revision -# -# Revision 1.20 1991/06/18 15:30:33 rich -# Added prms. -# -# Revision 1.19 1991/06/13 04:21:14 rich -# Re-arrange so that gcc, which creates directories, gets installed -# first. -# -# Revision 1.18 1991/06/12 21:23:05 rich -# correctly propogate destdir -# -# Revision 1.17 1991/06/09 20:39:58 rich -# Added +clib option. -# -# Revision 1.16 1991/05/27 21:04:21 rich -# Removed clib for now. -# -# Revision 1.15 1991/05/27 20:54:24 rich -# fixed a bug in multiple targets -# -# Revision 1.14 1991/05/22 01:44:04 rich -# remove gdb until config issues resolve. -# -# Revision 1.13 1991/05/19 08:00:09 rich -# Added gdb. -# -# Revision 1.12 1991/05/19 00:32:13 rich -# Changes to deal with missing subdirs gracefully, and changes dictated -# from dropping configure over gdb. -# -# Revision 1.4 1991/05/19 00:16:45 rich -# Configure for gdb. -# -# Revision 1.10 1991/05/04 00:58:38 rich -# Fix program name bug. -# -# Revision 1.9 1991/05/03 19:14:18 rich -# Changed getopt to libiberty, commented out an aborted attempt at host -# level Makefiles because it caused errors on +rm, add a warning for -# directories expected to be removed on +rm but that don't exist. -# -# Revision 1.8 1991/04/24 16:50:59 rich -# Three staging checkpoint. -# -# Revision 1.7 1991/04/17 01:34:47 rich -# Added getopt for binutils, fixed problem with host dependancies in -# configure.template. -# -# Revision 1.6 1991/04/16 00:18:44 rich -# Now handles multiple hosts and targets. -# -# Revision 1.5 1991/04/15 23:43:44 rich -# Now handles multiple hosts and targets. -# -# Revision 1.4 1991/04/13 02:11:03 rich -# Config cut 3. We now almost install a29k. -# -# Revision 1.3 1991/04/11 02:41:54 rich -# Cut 2 config. Subdirs. -# -# -# - -# -# Local Variables: -# fill-column: 131 -# End: -# - -# end of configure.template diff --git a/gprof/gprof.callg b/gprof/gprof.callg deleted file mode 100644 index 533c96c..0000000 --- a/gprof/gprof.callg +++ /dev/null @@ -1,108 +0,0 @@ - - - -call graph profile: - The sum of self and descendents is the major sort - for this listing. - - function entries: - -index the index of the function in the call graph - listing, as an aid to locating it (see below). - -%time the percentage of the total time of the program - accounted for by this function and its - descendents. - -self the number of seconds spent in this function - itself. - -descendents - the number of seconds spent in the descendents of - this function on behalf of this function. - -called the number of times this function is called (other - than recursive calls). - -self the number of times this function calls itself - recursively. - -name the name of the function, with an indication of - its membership in a cycle, if any. - -index the index of the function in the call graph - listing, as an aid to locating it. - - - - parent listings: - -self* the number of seconds of this function's self time - which is due to calls from this parent. - -descendents* - the number of seconds of this function's - descendent time which is due to calls from this - parent. - -called** the number of times this function is called by - this parent. This is the numerator of the - fraction which divides up the function's time to - its parents. - -total* the number of times this function was called by - all of its parents. This is the denominator of - the propagation fraction. - -parents the name of this parent, with an indication of the - parent's membership in a cycle, if any. - -index the index of this parent in the call graph - listing, as an aid in locating it. - - - - children listings: - -self* the number of seconds of this child's self time - which is due to being called by this function. - -descendent* - the number of seconds of this child's descendent's - time which is due to being called by this - function. - -called** the number of times this child is called by this - function. This is the numerator of the - propagation fraction for this child. - -total* the number of times this child is called by all - functions. This is the denominator of the - propagation fraction. - -children the name of this child, and an indication of its - membership in a cycle, if any. - -index the index of this child in the call graph listing, - as an aid to locating it. - - - - * these fields are omitted for parents (or - children) in the same cycle as the function. If - the function (or child) is a member of a cycle, - the propagated times and propagation denominator - represent the self time and descendent time of the - cycle as a whole. - - ** static-only parents and children are indicated - by a call count of 0. - - - - cycle listings: - the cycle as a whole is listed with the same - fields as a function entry. Below it are listed - the members of the cycle, and their contributions - to the time and call counts of the cycle. - diff --git a/gprof/gprof.flat b/gprof/gprof.flat deleted file mode 100644 index 60999a3..0000000 --- a/gprof/gprof.flat +++ /dev/null @@ -1,32 +0,0 @@ - - - -flat profile: - - % the percentage of the total running time of the -time program used by this function. - -cumulative a running sum of the number of seconds accounted - seconds for by this function and those listed above it. - - self the number of seconds accounted for by this -seconds function alone. This is the major sort for this - listing. - -calls the number of times this function was invoked, if - this function is profiled, else blank. - - self the average number of milliseconds spent in this -ms/call function per call, if this function is profiled, - else blank. - - total the average number of milliseconds spent in this -ms/call function and its descendents per call, if this - function is profiled, else blank. - -name the name of the function. This is the minor sort - for this listing. The index shows the location of - the function in the gprof listing. If the index is - in parenthesis it shows where it would appear in - the gprof listing if it were to be printed. - diff --git a/gprof/make-c-prog.awk b/gprof/make-c-prog.awk deleted file mode 100644 index a0a49de..0000000 --- a/gprof/make-c-prog.awk +++ /dev/null @@ -1,29 +0,0 @@ -BEGIN { - FS="\""; - print "/* ==> Do not modify this file!! It is created automatically" - print " by make-c-prog.awk; modify make-c-prog.awk instead. <== */" - print "" - print "#include <stdio.h>" - } - - { - if (curfun != FUNCTION) - { - if (curfun) - print "}" - curfun = FUNCTION - print "" - print "void"; - printf "%s (file)\n", FUNCTION - print " FILE *file;"; - print "{"; - } - printf " fputs (\""; - for (i = 1; i < NF; i++) - printf "%s\\\"", $i; - printf "%s\\n\", file);\n", $NF; - } - -END { - print "}" - } diff --git a/gprof/pathnames.h b/gprof/pathnames.h deleted file mode 100755 index 80cbe07..0000000 --- a/gprof/pathnames.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that: (1) source distributions retain this entire copyright - * notice and comment, and (2) distributions including binaries display - * the following acknowledgement: ``This product includes software - * developed by the University of California, Berkeley and its contributors'' - * in the documentation or other materials provided with the distribution - * and in all advertising materials mentioning features or use of this - * software. Neither the name of the University nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * @(#)pathnames.h 5.2 (Berkeley) 6/1/90 - */ - -#define _PATH_FLAT_BLURB "/usr/local/lib/gprof.flat" -#define _PATH_CALLG_BLURB "/usr/local/lib/gprof.callg" - diff --git a/gprof/t.c b/gprof/t.c deleted file mode 100755 index 62272b4..0000000 --- a/gprof/t.c +++ /dev/null @@ -1,12 +0,0 @@ -void -foo(int x) { - if (x&3) - foo (x-1); -} - -main() { - int i; - - for (i=0; i< 1024; i++) - foo(i); -} diff --git a/mmalloc/README b/mmalloc/README deleted file mode 100755 index fc2e4ec..0000000 --- a/mmalloc/README +++ /dev/null @@ -1,160 +0,0 @@ -The GNU mmalloc (mapped-malloc) package. fnf@cygnus.com - - -Description ------------ - -This is a heavily modified version of GNU malloc which has been extended to -use mmap() as the basic mechanism for for obtaining memory from the system, -rather than sbrk(). This gives it several advantages over the -more traditional malloc: - - * Providing suitable precautions are taken to avoid memory region - collisions, sbrk() is now available for use by applications that - use this package and still need to use some memory management - package that includes functions like malloc/realloc/free. - - * Several different memory pools can be used, each of them growing - or shinking under control of mmap(), with the mmalloc functions - using a specific pool on a call by call basis. - - * By using mmap, it is easy to create data pools which are intended to - be persistent and exist as a filesystem object after the creating - process has gone away. - - * Because multiple memory pools can be managed, data used for a - specific purpose can be allocated into it's own memory pool, making - it easier to allow applications to "dump" and "restore" initialized - malloc-managed memory regions. I.E., the "unexec" hack popularized - by GNU emacs could potentially go away. - - -Implementation --------------- - -The mmalloc functions contain no internal static state. All of mmalloc -internal data is allocated in the mapped in region, along with the user -data that it manages. This allows it to manage multiple such regions -and to "pick up where it left off" when such regions are later dynamically -mapped back in. - -In some sense, malloc has been "purified" to contain no internal state -information and generalized to use multiple memory regions rather than a -single region managed by sbrk(). However the new routines now need an -extra parameter which informs malloc which memory region it is dealing -with (along with other information). - -For ease of initial implementation, and to avoid exporting or importing -any more global variables or routines than necessary, this package is -implemented with all functions contained within a single source file. -At some future point, once everything has stabilized, it may be desirable -split it up into separate files. - -The functions initially provided by mmalloc are: - - void *mmalloc_attach (int fd, void *baseaddr); - void *mmalloc_detach (void *md); - int mmalloc_errno (void *md); - int mmalloc_setkey (void *md, int keynum, void *key); - void *mmalloc_getkey (void *md, int keynum); - - void *mmalloc (void *md, size_t size); - void *mrealloc (void *md, void *ptr, size_t size); - void *mvalloc (void *md, size_t size); - void mfree (void *md, void *ptr); - -Backwards Compatibility ------------------------ - -To allow a single malloc package to be used in a given application, provision -is made for the traditional malloc/realloc/free functions to be implemented -as special cases of the mmalloc functions. In particular, if any of the -functions that expect malloc descriptors are called with a NULL pointer rather -than a valid malloc descriptor, then they default to using an mmap'd region -starting at the current sbrk() value and mapped to /dev/zero. Applications -can simply include the following defines to use the mmalloc versions: - - #define malloc(size) mmalloc ((void *)0, (size)) - #define realloc(ptr,size) mrealloc ((void *)0, (ptr), (size)); - #define free(ptr) mfree ((void *)0, (ptr)) - -or replace the existing malloc/realloc/free calls with the above patterns -if the #define's cause problems. - -Note that this does not prevent calls to malloc/realloc/free within -libraries from continuing to use the library version of malloc, so if this -is a problem, the compatibility issue needs to be dealt with in another way. - - -Function Descriptions ---------------------- - - void *mmalloc_attach (int fd, void *baseaddr); - - Initialize access to a mmalloc managed region. - - If FD is a valid file descriptor for an open file then data for the - mmalloc managed region is mapped to that file, otherwise "/dev/zero" - is used and the data will not exist in any filesystem object. - - If the open file corresponding to FD is from a previous use of - mmalloc and passes some basic sanity checks to ensure that it is - compatible with the current mmalloc package, then it's data is - mapped in and is immediately accessible at the same addresses in - the current process as the process that created the file. - - If BASEADDR is not NULL, the mapping is established starting at the - specified address in the process address space. If BASEADDR is NULL, - the mmalloc package chooses a suitable address at which to start the - mapped region, which will be the value of the previous mapping if - opening an existing file which was previously built by mmalloc, or - for new files will be a value chosen by mmap. - - Specifying BASEADDR provides more control over where the regions - start and how big they can be before bumping into existing mapped - regions or future mapped regions. - - On success, returns a "malloc descriptor" which is used in subsequent - calls to other mmalloc package functions. It is explicitly "void *" - ("char *" for systems that don't fully support void) so that users - of the package don't have to worry about the actual implementation - details. - - On failure returns NULL. - - void *mmalloc_detach (void *md); - - Terminate access to a mmalloc managed region by closing the base - file and unmapping all memory pages associated with the region. - - Returns NULL on success. - - Returns the malloc descriptor on failure, which can subsequently - be used for further action (such as obtaining more information about - the nature of the failure). - - void *mmalloc (void *md, size_t size); - - Given an mmalloc descriptor MD, allocate additional memory of - SIZE bytes in the associated mapped region. - - void *mrealloc (void *md, void *ptr, size_t size); - - Given an mmalloc descriptor MD and a pointer to memory previously - allocated by mmalloc in PTR, reallocate the memory to be SIZE bytes - long, possibly moving the existing contents of memory if necessary. - - void *mvalloc (void *md, size_t size); - - Like mmalloc but the resulting memory is aligned on a page boundary. - - void mfree (void *md, void *ptr); - - Given an mmalloc descriptor MD and a pointer to memory previously - allocated by mmalloc in PTR, free the previously allocated memory. - - int mmalloc_errno (void *md); - - Given a mmalloc descriptor, if the last mmalloc operation - failed for some reason due to a system call failure, then - returns the associated errno. Returns 0 otherwise. diff --git a/mmalloc/fsf.shar.orig b/mmalloc/fsf.shar.orig deleted file mode 100755 index 3ece103..0000000 --- a/mmalloc/fsf.shar.orig +++ /dev/null @@ -1,1841 +0,0 @@ -#--------CUT---------CUT---------CUT---------CUT--------# -######################################################### -# # -# This is a shell archive file. To extract files: # -# # -# 1) Make a directory for the files. # -# 2) Write a file, such as "file.shar", containing # -# this archive file into the directory. # -# 3) Type "sh file.shar". Do not use csh. # -# # -######################################################### -# -# -echo Extracting ChangeLog: -sed 's/^Z//' >ChangeLog <<\STUNKYFLUFF -ZThu Jul 11 18:15:04 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) -Z -Z * Merged with C library version, which now has its own subdir. -Z * malloc.h, *.c: Use ansideclisms and #ifdefs for portability both -Z in and out of the C library. -Z * Makefile: New makefile for malloc subdir in libc. -Z Has targets to create malloc.tar{,.Z} by ansidecl processing on srcs. -Z * malloc/Makefile: New file; Makefile for standalone distribution. -Z * malloc/README: New file; info for same. -Z -ZFri Apr 6 00:18:36 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu) -Z -Z * Makefile: Add comments. -Z -ZThu Apr 5 23:08:14 1990 Mike Haertel (mike at albert.ai.mit.edu) -Z -Z * mcheck.c (mcheck, checkhdr): Support user-supplied abort() -Z function. -Z * malloc.h: Declare __free(). -Z * Makefile: New target libmalloc.a. -Z -ZThu Apr 5 21:56:03 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu) -Z -Z * free.c (free): Split into free and __free. -Z * malloc.c (morecore): Call __free on oldinfo. -Z -ZLocal Variables: -Zmode: indented-text -Zleft-margin: 8 -Zfill-column: 76 -Zversion-control: never -ZEnd: -STUNKYFLUFF -set `sum ChangeLog` -if test 21008 != $1 -then -echo ChangeLog: Checksum error. Is: $1, should be: 21008. -fi -# -# -echo Extracting Makefile: -sed 's/^Z//' >Makefile <<\STUNKYFLUFF -Z# Copyright (C) 1991, 1992 Free Software Foundation, Inc. -Z# This file is part of the GNU C Library. -Z -Z# The GNU C Library is free software; you can redistribute it and/or -Z# modify it under the terms of the GNU Library General Public License as -Z# published by the Free Software Foundation; either version 2 of the -Z# License, or (at your option) any later version. -Z -Z# The GNU C Library is distributed in the hope that it will be useful, -Z# but WITHOUT ANY WARRANTY; without even the implied warranty of -Z# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Z# Library General Public License for more details. -Z -Z# You should have received a copy of the GNU Library General Public -Z# License along with the GNU C Library; see the file COPYING.LIB. If -Z# not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Z# Cambridge, MA 02139, USA. -Z -Z# -Z# Makefile for malloc routines -Z# -Zsubdir := malloc -Z -Zall: -Z -Zheaders := malloc.h -Z -Zroutines := malloc free cfree realloc calloc morecore \ -Z valloc memalign mcheck mtrace mstats -Znodist := cfree -Z -Zinstall-lib := libmcheck.a -Z -Zdistribute := mcheck-init.c ChangeLog TODO \ -Z malloc/gmalloc-head.c dist-README dist-Makefile \ -Z mtrace.awk -Z -Z -Zinclude ../Rules -Z -Z$(objpfx)libmcheck.a: $(objpfx)mcheck-init.o -Z ln $< $@ -Z -Z# Make the standalone malloc distribution. -Zdist-routines := $(filter-out $(nodist),$(routines)) -Zmalloc-dist := README COPYING.LIB Makefile ChangeLog \ -Z $(addsuffix .c,$(dist-routines)) $(headers) gmalloc.c \ -Z gmalloc-head.c mtrace.awk -Z%.uu: % -Z uuencode $< < $< > $@-tmp -Z mv $@-tmp $@ -Z%.Z: % -Z compress -c $< > $@-tmp -Z mv $@-tmp $@ -Zmalloc.tar: $(addprefix malloc/,$(malloc-dist)) -Z tar ch$(verbose)f $@ $^ -Zmalloc/%.c: %.c malloc/ -Z $(..)ansidecl -trad $< | indent -stdin -gnu > $@-tmp -Z mv $@-tmp $@ -Zmalloc/%.h: %.h malloc/ -Z $(..)ansidecl -trad $< | indent -stdin -gnu > $@-tmp -Z mv $@-tmp $@ -Zmalloc/Makefile: dist-Makefile -Z sed -e 's,<DIST-SOURCES>,$(addsuffix .c,$(dist-routines)),' \ -Z -e 's,<DIST-OBJECTS>,$(addsuffix .o,$(dist-routines)),' \ -Z -e 's,<DIST-HEADERS>,$(headers),' < $< > $@-tmp -Z mv $@-tmp $@ -Zmalloc/gmalloc.c: malloc/Makefile -Z $(MAKE) -C malloc gmalloc.c -Zmalloc/README: dist-README -Z @rm -f $@ -Z cp $< $@ -Zmalloc/%: % -Z @rm -f $@ -Z cp $< $@ -STUNKYFLUFF -set `sum Makefile` -if test 48180 != $1 -then -echo Makefile: Checksum error. Is: $1, should be: 48180. -fi -# -# -echo Extracting TODO: -sed 's/^Z//' >TODO <<\STUNKYFLUFF -Z0. Access data structures with accessor macros, then turn the heapinfo -Zinto several arrays for faster access on machines with addressing modes. -ZAlso, this eventually raises the possibility of maintaining multiple -Zheaps. -Z1. Possible heuristic to catch multiple frees. Introduce an extra word -Zof heapinfo that says whether the remaining info is for something -Zbusy or something free. Then we can catch attempts to free already-free -Zlarge blocks, as well as things not belonging to malloc at all. In the -Zcase of a fragment, we can check if the fragment looks like it *already* -Zbelongs to the fragment list, by comparing it with the "first" fragment -Zof the block, or checking its "prev" pointer to see if it points into -Zthe block. Then if it looks like it might we can exhaustively search -Zthe block's free list to see if the fragment is there or not. Extending -Zthe heapinfo structure would have the benefit of making it a power of -Ztwo and thus making array indexing faster, perhaps. Suitably adapted, -Zthis heuristic could also catch invalid pointers passed to realloc. -Z -ZAll of these additional features require the inclusion of <malloc.h>. -Z3. indirect reference allocator: ialloc(), ifree(), irealloc(). -Z4. garbage collecting allocator: galloc(), garbage(), gfree(), grealloc(). -STUNKYFLUFF -set `sum TODO` -if test 51437 != $1 -then -echo TODO: Checksum error. Is: $1, should be: 51437. -fi -# -# -echo Extracting calloc.c: -sed 's/^Z//' >calloc.c <<\STUNKYFLUFF -Z/* Copyright (C) 1991 Free Software Foundation, Inc. -ZThis file is part of the GNU C Library. -Z -ZThe GNU C Library is free software; you can redistribute it and/or -Zmodify it under the terms of the GNU Library General Public License as -Zpublished by the Free Software Foundation; either version 2 of the -ZLicense, or (at your option) any later version. -Z -ZThe GNU C Library is distributed in the hope that it will be useful, -Zbut WITHOUT ANY WARRANTY; without even the implied warranty of -ZMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -ZLibrary General Public License for more details. -Z -ZYou should have received a copy of the GNU Library General Public -ZLicense along with the GNU C Library; see the file COPYING.LIB. If -Znot, write to the Free Software Foundation, Inc., 675 Mass Ave, -ZCambridge, MA 02139, USA. */ -Z -Z/* IGNORE(@ */ -Z#include <ansidecl.h> -Z/* @) */ -Z#include <malloc.h> -Z -Z#if defined(__GNU_LIBRARY__) || defined(STDC_HEADERS) || defined(USG) -Z#include <string.h> -Z#else -Z#define memset(s, zero, n) bzero ((s), (n)) -Z#endif -Z -Z/* Allocate an array of NMEMB elements each SIZE bytes long. -Z The entire array is initialized to zeros. */ -ZPTR -ZDEFUN(calloc, (nmemb, size), register size_t nmemb AND register size_t size) -Z{ -Z register PTR result = malloc (nmemb * size); -Z -Z if (result != NULL) -Z (void) memset (result, 0, nmemb * size); -Z -Z return result; -Z} -STUNKYFLUFF -set `sum calloc.c` -if test 48371 != $1 -then -echo calloc.c: Checksum error. Is: $1, should be: 48371. -fi -# -# -echo Extracting cfree.c: -sed 's/^Z//' >cfree.c <<\STUNKYFLUFF -Z/* Copyright (C) 1991 Free Software Foundation, Inc. -ZThis file is part of the GNU C Library. -Z -ZThe GNU C Library is free software; you can redistribute it and/or -Zmodify it under the terms of the GNU Library General Public License as -Zpublished by the Free Software Foundation; either version 2 of the -ZLicense, or (at your option) any later version. -Z -ZThe GNU C Library is distributed in the hope that it will be useful, -Zbut WITHOUT ANY WARRANTY; without even the implied warranty of -ZMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -ZLibrary General Public License for more details. -Z -ZYou should have received a copy of the GNU Library General Public -ZLicense along with the GNU C Library; see the file COPYING.LIB. If -Znot, write to the Free Software Foundation, Inc., 675 Mass Ave, -ZCambridge, MA 02139, USA. */ -Z -Z#include <ansidecl.h> -Z#include <stdlib.h> -Z -Z#undef cfree -Z -Z#include <gnu-stabs.h> -Z -Zfunction_alias(cfree, free, void, (ptr), -Z DEFUN(cfree, (ptr), PTR ptr)) -STUNKYFLUFF -set `sum cfree.c` -if test 17488 != $1 -then -echo cfree.c: Checksum error. Is: $1, should be: 17488. -fi -# -# -echo Extracting dist-Makefile: -sed 's/^Z//' >dist-Makefile <<\STUNKYFLUFF -Z# Copyright (C) 1991 Free Software Foundation, Inc. -Z# This file is part of the GNU C Library. -Z -Z# The GNU C Library is free software; you can redistribute it and/or -Z# modify it under the terms of the GNU Library General Public License -Z# as published by the Free Software Foundation; either version 2 of -Z# the License, or (at your option) any later version. -Z -Z# The GNU C Library is distributed in the hope that it will be useful, -Z# but WITHOUT ANY WARRANTY; without even the implied warranty of -Z# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Z# Library General Public License for more details. -Z -Z# You should have received a copy of the GNU Library General Public -Z# License along with the GNU C Library; see the file COPYING.LIB. If -Z# not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Z# Cambridge, MA 02139, USA. -Z -Z# Makefile for standalone distribution of malloc. -Z -Z# Use this on System V. -Z#CPPFLAGS = -DUSG -Z -Z.PHONY: all -Zall: libmalloc.a gmalloc.o -Z -Zsources = <DIST-SOURCES> -Zobjects = <DIST-OBJECTS> -Zheaders = <DIST-HEADERS> -Z -Zlibmalloc.a: $(objects) -Z ar crv $@ $(objects) -Z ranlib $@ -Z -Z$(objects): $(headers) -Z -Zgmalloc.c: gmalloc-head.c $(headers) $(sources) -Z cat gmalloc-head.c $(headers) $(sources) > $@ -Z -Z.c.o: -Z $(CC) $(CFLAGS) $(CPPFLAGS) -I. -c $< $(OUTPUT_OPTION) -Z -Z.PHONY: clean realclean malloc-clean malloc-realclean -Zclean malloc-clean: -Z -rm -f libmalloc.a *.o core -Zrealclean malloc-realclean: clean -Z -rm -f TAGS tags *~ -Z -Z# For inside the C library. -Zmalloc.tar malloc.tar.Z: -Z $(MAKE) -C .. $@ -STUNKYFLUFF -set `sum dist-Makefile` -if test 58822 != $1 -then -echo dist-Makefile: Checksum error. Is: $1, should be: 58822. -fi -# -# -echo Extracting dist-README: -sed 's/^Z//' >dist-README <<\STUNKYFLUFF -ZThis is the standalone distribution of GNU malloc. -ZGNU malloc is part of the GNU C Library, but is also distributed separately. -Z -ZIf you find bugs in GNU malloc, send reports to bug-glibc@prep.ai.mit.edu. -Z -ZGNU malloc is free software. See the file COPYING.LIB for copying conditions. -Z -ZThe makefile builds libmalloc.a and gmalloc.o. If you are using GNU malloc -Zto replace your system's existing malloc package, it is important to make -Zsure you get all GNU functions, not some of the GNU functions and some from -Zthe system library. gmalloc.o has all the functions in one file, so using -Zthat will make sure you don't accidentally mix the two malloc packages. -STUNKYFLUFF -set `sum dist-README` -if test 59167 != $1 -then -echo dist-README: Checksum error. Is: $1, should be: 59167. -fi -# -# -echo Extracting free.c: -sed 's/^Z//' >free.c <<\STUNKYFLUFF -Z/* Free a block of memory allocated by `malloc'. -Z Copyright 1990, 1991 Free Software Foundation -Z Written May 1989 by Mike Haertel. -Z -ZThe GNU C Library is free software; you can redistribute it and/or -Zmodify it under the terms of the GNU Library General Public License as -Zpublished by the Free Software Foundation; either version 2 of the -ZLicense, or (at your option) any later version. -Z -ZThe GNU C Library is distributed in the hope that it will be useful, -Zbut WITHOUT ANY WARRANTY; without even the implied warranty of -ZMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -ZLibrary General Public License for more details. -Z -ZYou should have received a copy of the GNU Library General Public -ZLicense along with the GNU C Library; see the file COPYING.LIB. If -Znot, write to the Free Software Foundation, Inc., 675 Mass Ave, -ZCambridge, MA 02139, USA. -Z -Z The author may be reached (Email) at the address mike@ai.mit.edu, -Z or (US mail) as Mike Haertel c/o Free Software Foundation. */ -Z -Z/* IGNORE(@ */ -Z#include <ansidecl.h> -Z#include <stddef.h> -Z#include <stdlib.h> -Z/* @) */ -Z -Z#define _MALLOC_INTERNAL -Z#include <malloc.h> -Z -Z/* Debugging hook for free. */ -Zvoid EXFUN((*__free_hook), (PTR __ptr)); -Z -Z/* List of blocks allocated by memalign. */ -Zstruct alignlist *_aligned_blocks = NULL; -Z -Z/* Return memory to the heap. -Z Like `free' but don't call a __free_hook if there is one. */ -Zvoid -ZDEFUN(__free, (ptr), PTR ptr) -Z{ -Z int type; -Z size_t block, blocks; -Z register size_t i; -Z struct list *prev, *next; -Z -Z block = BLOCK(ptr); -Z -Z type = _heapinfo[block].busy.type; -Z switch (type) -Z { -Z case 0: -Z /* Get as many statistics as early as we can. */ -Z --_chunks_used; -Z _bytes_used -= _heapinfo[block].busy.info.size * BLOCKSIZE; -Z _bytes_free += _heapinfo[block].busy.info.size * BLOCKSIZE; -Z -Z /* Find the free cluster previous to this one in the free list. -Z Start searching at the last block referenced; this may benefit -Z programs with locality of allocation. */ -Z i = _heapindex; -Z if (i > block) -Z while (i > block) -Z i = _heapinfo[i].free.prev; -Z else -Z { -Z do -Z i = _heapinfo[i].free.next; -Z while (i > 0 && i < block); -Z i = _heapinfo[i].free.prev; -Z } -Z -Z /* Determine how to link this block into the free list. */ -Z if (block == i + _heapinfo[i].free.size) -Z { -Z /* Coalesce this block with its predecessor. */ -Z _heapinfo[i].free.size += _heapinfo[block].busy.info.size; -Z block = i; -Z } -Z else -Z { -Z /* Really link this block back into the free list. */ -Z _heapinfo[block].free.size = _heapinfo[block].busy.info.size; -Z _heapinfo[block].free.next = _heapinfo[i].free.next; -Z _heapinfo[block].free.prev = i; -Z _heapinfo[i].free.next = block; -Z _heapinfo[_heapinfo[block].free.next].free.prev = block; -Z ++_chunks_free; -Z } -Z -Z /* Now that the block is linked in, see if we can coalesce it -Z with its successor (by deleting its successor from the list -Z and adding in its size). */ -Z if (block + _heapinfo[block].free.size == _heapinfo[block].free.next) -Z { -Z _heapinfo[block].free.size -Z += _heapinfo[_heapinfo[block].free.next].free.size; -Z _heapinfo[block].free.next -Z = _heapinfo[_heapinfo[block].free.next].free.next; -Z _heapinfo[_heapinfo[block].free.next].free.prev = block; -Z --_chunks_free; -Z } -Z -Z /* Now see if we can return stuff to the system. */ -Z blocks = _heapinfo[block].free.size; -Z if (blocks >= FINAL_FREE_BLOCKS && block + blocks == _heaplimit -Z && (*__morecore)(0) == ADDRESS(block + blocks)) -Z { -Z register size_t bytes = blocks * BLOCKSIZE; -Z _heaplimit -= blocks; -Z (*__morecore)(- bytes); -Z _heapinfo[_heapinfo[block].free.prev].free.next -Z = _heapinfo[block].free.next; -Z _heapinfo[_heapinfo[block].free.next].free.prev -Z = _heapinfo[block].free.prev; -Z block = _heapinfo[block].free.prev; -Z --_chunks_free; -Z _bytes_free -= bytes; -Z } -Z -Z /* Set the next search to begin at this block. */ -Z _heapindex = block; -Z break; -Z -Z default: -Z /* Do some of the statistics. */ -Z --_chunks_used; -Z _bytes_used -= 1 << type; -Z ++_chunks_free; -Z _bytes_free += 1 << type; -Z -Z /* Get the address of the first free fragment in this block. */ -Z prev = (struct list *) ((char *) ADDRESS(block) + -Z (_heapinfo[block].busy.info.frag.first << type)); -Z -Z if (_heapinfo[block].busy.info.frag.nfree == (BLOCKSIZE >> type) - 1) -Z { -Z /* If all fragments of this block are free, remove them -Z from the fragment list and free the whole block. */ -Z next = prev; -Z for (i = 1; i < (size_t) (BLOCKSIZE >> type); ++i) -Z next = next->next; -Z prev->prev->next = next; -Z if (next != NULL) -Z next->prev = prev->prev; -Z _heapinfo[block].busy.type = 0; -Z _heapinfo[block].busy.info.size = 1; -Z -Z /* Keep the statistics accurate. */ -Z ++_chunks_used; -Z _bytes_used += BLOCKSIZE; -Z _chunks_free -= BLOCKSIZE >> type; -Z _bytes_free -= BLOCKSIZE; -Z -Z free(ADDRESS(block)); -Z } -Z else if (_heapinfo[block].busy.info.frag.nfree != 0) -Z { -Z /* If some fragments of this block are free, link this -Z fragment into the fragment list after the first free -Z fragment of this block. */ -Z next = (struct list *) ptr; -Z next->next = prev->next; -Z next->prev = prev; -Z prev->next = next; -Z if (next->next != NULL) -Z next->next->prev = next; -Z ++_heapinfo[block].busy.info.frag.nfree; -Z } -Z else -Z { -Z /* No fragments of this block are free, so link this -Z fragment into the fragment list and announce that -Z it is the first free fragment of this block. */ -Z prev = (struct list *) ptr; -Z _heapinfo[block].busy.info.frag.nfree = 1; -Z _heapinfo[block].busy.info.frag.first = (unsigned long int) -Z ((unsigned long int) ((char *) ptr - (char *) NULL) -Z % BLOCKSIZE >> type); -Z prev->next = _fraghead[type].next; -Z prev->prev = &_fraghead[type]; -Z prev->prev->next = prev; -Z if (prev->next != NULL) -Z prev->next->prev = prev; -Z } -Z break; -Z } -Z} -Z -Z/* Return memory to the heap. */ -Zvoid -ZDEFUN(free, (ptr), PTR ptr) -Z{ -Z register struct alignlist *l; -Z -Z if (ptr == NULL) -Z return; -Z -Z for (l = _aligned_blocks; l != NULL; l = l->next) -Z if (l->aligned == ptr) -Z { -Z l->aligned = NULL; /* Mark the slot in the list as free. */ -Z ptr = l->exact; -Z break; -Z } -Z -Z if (__free_hook != NULL) -Z (*__free_hook) (ptr); -Z else -Z __free (ptr); -Z} -STUNKYFLUFF -set `sum free.c` -if test 53143 != $1 -then -echo free.c: Checksum error. Is: $1, should be: 53143. -fi -# -# -echo Extracting gmalloc-head.c: -sed 's/^Z//' >gmalloc-head.c <<\STUNKYFLUFF -Z/* DO NOT EDIT THIS FILE -- it is automagically generated. -*- C -*- */ -Z -Z#define SKELETON -Z -Z#if defined(__GNU_LIBRARY__) || defined(STDC_HEADERS) || defined(USG) -Z#include <string.h> -Z#else -Z#define memset(s, zero, n) bzero ((s), (n)) -Z#define memcpy(d, s, n) bcopy ((s), (d), (n)) -Z#define memmove(d, s, n) bcopy ((s), (d), (n)) -Z#endif -Z -Z#define _MALLOC_INTERNAL -Z -Z/* The malloc headers and source files from the C library follow here. */ -STUNKYFLUFF -set `sum gmalloc-head.c` -if test 33445 != $1 -then -echo gmalloc-head.c: Checksum error. Is: $1, should be: 33445. -fi -# -# -echo Extracting malloc.c: -sed 's/^Z//' >malloc.c <<\STUNKYFLUFF -Z/* Memory allocator `malloc'. -Z Copyright 1990, 1991 Free Software Foundation -Z Written May 1989 by Mike Haertel. -Z -ZThe GNU C Library is free software; you can redistribute it and/or -Zmodify it under the terms of the GNU Library General Public License as -Zpublished by the Free Software Foundation; either version 2 of the -ZLicense, or (at your option) any later version. -Z -ZThe GNU C Library is distributed in the hope that it will be useful, -Zbut WITHOUT ANY WARRANTY; without even the implied warranty of -ZMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -ZLibrary General Public License for more details. -Z -ZYou should have received a copy of the GNU Library General Public -ZLicense along with the GNU C Library; see the file COPYING.LIB. If -Znot, write to the Free Software Foundation, Inc., 675 Mass Ave, -ZCambridge, MA 02139, USA. -Z -Z The author may be reached (Email) at the address mike@ai.mit.edu, -Z or (US mail) as Mike Haertel c/o Free Software Foundation. */ -Z -Z/* IGNORE(@ */ -Z#include <ansidecl.h> -Z#include <stddef.h> -Z#include <stdlib.h> -Z/* @) */ -Z -Z#define _MALLOC_INTERNAL -Z#include <malloc.h> -Z -Z#if defined(__GNU_LIBRARY__) || defined(STDC_HEADERS) || defined(USG) -Z#include <string.h> -Z#else -Z#define memset(s, zero, n) bzero ((s), (n)) -Z#define memcpy(d, s, n) bcopy ((s), (d), (n)) -Z#endif -Z -Z -Z/* How to really get more memory. */ -ZPTR EXFUN((*__morecore), (ptrdiff_t __size)) = __default_morecore; -Z -Z/* Debugging hook for `malloc'. */ -ZPTR EXFUN((*__malloc_hook), (size_t __size)); -Z -Z/* Pointer to the base of the first block. */ -Zchar *_heapbase; -Z -Z/* Block information table. Allocated with align/__free (not malloc/free). */ -Zmalloc_info *_heapinfo; -Z -Z/* Number of info entries. */ -Zstatic size_t heapsize; -Z -Z/* Search index in the info table. */ -Zsize_t _heapindex; -Z -Z/* Limit of valid info table indices. */ -Zsize_t _heaplimit; -Z -Z/* Free lists for each fragment size. */ -Zstruct list _fraghead[BLOCKLOG]; -Z -Z/* Instrumentation. */ -Zsize_t _chunks_used; -Zsize_t _bytes_used; -Zsize_t _chunks_free; -Zsize_t _bytes_free; -Z -Z/* Are you experienced? */ -Zint __malloc_initialized; -Z -Z/* Aligned allocation. */ -Zstatic PTR -ZDEFUN(align, (size), size_t size) -Z{ -Z PTR result; -Z unsigned long int adj; -Z -Z result = (*__morecore)(size); -Z adj = (unsigned long int) ((unsigned long int) ((char *) result - -Z (char *) NULL)) % BLOCKSIZE; -Z if (adj != 0) -Z { -Z adj = BLOCKSIZE - adj; -Z (void) (*__morecore)(adj); -Z result = (char *) result + adj; -Z } -Z return result; -Z} -Z -Z/* Set everything up and remember that we have. */ -Zstatic int -ZDEFUN_VOID(initialize) -Z{ -Z heapsize = HEAP / BLOCKSIZE; -Z _heapinfo = (malloc_info *) align(heapsize * sizeof(malloc_info)); -Z if (_heapinfo == NULL) -Z return 0; -Z memset(_heapinfo, 0, heapsize * sizeof(malloc_info)); -Z _heapinfo[0].free.size = 0; -Z _heapinfo[0].free.next = _heapinfo[0].free.prev = 0; -Z _heapindex = 0; -Z _heapbase = (char *) _heapinfo; -Z __malloc_initialized = 1; -Z return 1; -Z} -Z -Z/* Get neatly aligned memory, initializing or -Z growing the heap info table as necessary. */ -Zstatic PTR -ZDEFUN(morecore, (size), size_t size) -Z{ -Z PTR result; -Z malloc_info *newinfo, *oldinfo; -Z size_t newsize; -Z -Z result = align(size); -Z if (result == NULL) -Z return NULL; -Z -Z /* Check if we need to grow the info table. */ -Z if ((size_t) BLOCK((char *) result + size) > heapsize) -Z { -Z newsize = heapsize; -Z while ((size_t) BLOCK((char *) result + size) > newsize) -Z newsize *= 2; -Z newinfo = (malloc_info *) align(newsize * sizeof(malloc_info)); -Z if (newinfo == NULL) -Z { -Z (*__morecore)(- size); -Z return NULL; -Z } -Z memset(newinfo, 0, newsize * sizeof(malloc_info)); -Z memcpy(newinfo, _heapinfo, heapsize * sizeof(malloc_info)); -Z oldinfo = _heapinfo; -Z newinfo[BLOCK(oldinfo)].busy.type = 0; -Z newinfo[BLOCK(oldinfo)].busy.info.size -Z = BLOCKIFY(heapsize * sizeof(malloc_info)); -Z _heapinfo = newinfo; -Z __free(oldinfo); -Z heapsize = newsize; -Z } -Z -Z _heaplimit = BLOCK((char *) result + size); -Z return result; -Z} -Z -Z/* Allocate memory from the heap. */ -ZPTR -ZDEFUN(malloc, (size), size_t size) -Z{ -Z PTR result; -Z size_t block, blocks, lastblocks, start; -Z register size_t i; -Z struct list *next; -Z -Z if (size == 0) -Z return NULL; -Z -Z if (__malloc_hook != NULL) -Z return (*__malloc_hook)(size); -Z -Z if (!__malloc_initialized) -Z if (!initialize()) -Z return NULL; -Z -Z if (size < sizeof(struct list)) -Z size = sizeof(struct list); -Z -Z /* Determine the allocation policy based on the request size. */ -Z if (size <= BLOCKSIZE / 2) -Z { -Z /* Small allocation to receive a fragment of a block. -Z Determine the logarithm to base two of the fragment size. */ -Z register size_t log = 1; -Z --size; -Z while ((size /= 2) != 0) -Z ++log; -Z -Z /* Look in the fragment lists for a -Z free fragment of the desired size. */ -Z next = _fraghead[log].next; -Z if (next != NULL) -Z { -Z /* There are free fragments of this size. -Z Pop a fragment out of the fragment list and return it. -Z Update the block's nfree and first counters. */ -Z result = (PTR) next; -Z next->prev->next = next->next; -Z if (next->next != NULL) -Z next->next->prev = next->prev; -Z block = BLOCK(result); -Z if (--_heapinfo[block].busy.info.frag.nfree != 0) -Z _heapinfo[block].busy.info.frag.first = (unsigned long int) -Z ((unsigned long int) ((char *) next->next - (char *) NULL) -Z % BLOCKSIZE) >> log; -Z -Z /* Update the statistics. */ -Z ++_chunks_used; -Z _bytes_used += 1 << log; -Z --_chunks_free; -Z _bytes_free -= 1 << log; -Z } -Z else -Z { -Z /* No free fragments of the desired size, so get a new block -Z and break it into fragments, returning the first. */ -Z result = malloc(BLOCKSIZE); -Z if (result == NULL) -Z return NULL; -Z -Z /* Link all fragments but the first into the free list. */ -Z for (i = 1; i < (size_t) (BLOCKSIZE >> log); ++i) -Z { -Z next = (struct list *) ((char *) result + (i << log)); -Z next->next = _fraghead[log].next; -Z next->prev = &_fraghead[log]; -Z next->prev->next = next; -Z if (next->next != NULL) -Z next->next->prev = next; -Z } -Z -Z /* Initialize the nfree and first counters for this block. */ -Z block = BLOCK(result); -Z _heapinfo[block].busy.type = log; -Z _heapinfo[block].busy.info.frag.nfree = i - 1; -Z _heapinfo[block].busy.info.frag.first = i - 1; -Z -Z _chunks_free += (BLOCKSIZE >> log) - 1; -Z _bytes_free += BLOCKSIZE - (1 << log); -Z _bytes_used -= BLOCKSIZE - (1 << log); -Z } -Z } -Z else -Z { -Z /* Large allocation to receive one or more blocks. -Z Search the free list in a circle starting at the last place visited. -Z If we loop completely around without finding a large enough -Z space we will have to get more memory from the system. */ -Z blocks = BLOCKIFY(size); -Z start = block = MALLOC_SEARCH_START; -Z while (_heapinfo[block].free.size < blocks) -Z { -Z block = _heapinfo[block].free.next; -Z if (block == start) -Z { -Z /* Need to get more from the system. Check to see if -Z the new core will be contiguous with the final free -Z block; if so we don't need to get as much. */ -Z block = _heapinfo[0].free.prev; -Z lastblocks = _heapinfo[block].free.size; -Z if (_heaplimit != 0 && block + lastblocks == _heaplimit && -Z (*__morecore)(0) == ADDRESS(block + lastblocks) && -Z (morecore((blocks - lastblocks) * BLOCKSIZE)) != NULL) -Z { -Z _heapinfo[block].free.size = blocks; -Z _bytes_free += (blocks - lastblocks) * BLOCKSIZE; -Z continue; -Z } -Z result = morecore(blocks * BLOCKSIZE); -Z if (result == NULL) -Z return NULL; -Z block = BLOCK(result); -Z _heapinfo[block].busy.type = 0; -Z _heapinfo[block].busy.info.size = blocks; -Z ++_chunks_used; -Z _bytes_used += blocks * BLOCKSIZE; -Z return result; -Z } -Z } -Z -Z /* At this point we have found a suitable free list entry. -Z Figure out how to remove what we need from the list. */ -Z result = ADDRESS(block); -Z if (_heapinfo[block].free.size > blocks) -Z { -Z /* The block we found has a bit left over, -Z so relink the tail end back into the free list. */ -Z _heapinfo[block + blocks].free.size -Z = _heapinfo[block].free.size - blocks; -Z _heapinfo[block + blocks].free.next -Z = _heapinfo[block].free.next; -Z _heapinfo[block + blocks].free.prev -Z = _heapinfo[block].free.prev; -Z _heapinfo[_heapinfo[block].free.prev].free.next -Z = _heapinfo[_heapinfo[block].free.next].free.prev -Z = _heapindex = block + blocks; -Z } -Z else -Z { -Z /* The block exactly matches our requirements, -Z so just remove it from the list. */ -Z _heapinfo[_heapinfo[block].free.next].free.prev -Z = _heapinfo[block].free.prev; -Z _heapinfo[_heapinfo[block].free.prev].free.next -Z = _heapindex = _heapinfo[block].free.next; -Z --_chunks_free; -Z } -Z -Z _heapinfo[block].busy.type = 0; -Z _heapinfo[block].busy.info.size = blocks; -Z ++_chunks_used; -Z _bytes_used += blocks * BLOCKSIZE; -Z _bytes_free -= blocks * BLOCKSIZE; -Z } -Z -Z return result; -Z} -STUNKYFLUFF -set `sum malloc.c` -if test 64456 != $1 -then -echo malloc.c: Checksum error. Is: $1, should be: 64456. -fi -# -# -echo Extracting malloc.h: -sed 's/^Z//' >malloc.h <<\STUNKYFLUFF -Z/* Declarations for `malloc' and friends. -Z Copyright 1990, 1991 Free Software Foundation -Z Written May 1989 by Mike Haertel. -Z -ZThe GNU C Library is free software; you can redistribute it and/or -Zmodify it under the terms of the GNU Library General Public License as -Zpublished by the Free Software Foundation; either version 2 of the -ZLicense, or (at your option) any later version. -Z -ZThe GNU C Library is distributed in the hope that it will be useful, -Zbut WITHOUT ANY WARRANTY; without even the implied warranty of -ZMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -ZLibrary General Public License for more details. -Z -ZYou should have received a copy of the GNU Library General Public -ZLicense along with the GNU C Library; see the file COPYING.LIB. If -Znot, write to the Free Software Foundation, Inc., 675 Mass Ave, -ZCambridge, MA 02139, USA. -Z -Z The author may be reached (Email) at the address mike@ai.mit.edu, -Z or (US mail) as Mike Haertel c/o Free Software Foundation. */ -Z -Z#ifndef _MALLOC_H -Z -Z#define _MALLOC_H 1 -Z -Z/* IGNORE(@ */ -Z#include <features.h> -Z#define __need_NULL -Z#define __need_size_t -Z#define __need_ptrdiff_t -Z#include <stddef.h> -Z/* @) */ -Z -Z#ifndef NULL -Z#define NULL 0 -Z#endif -Z -Z#ifdef __STDC__ -Z#include <stddef.h> -Z#else -Z#undef size_t -Z#define size_t unsigned int -Z#endif -Z -Z -Z/* Allocate SIZE bytes of memory. */ -Zextern PTR EXFUN(malloc, (size_t __size)); -Z/* Re-allocate the previously allocated block -Z in PTR, making the new block SIZE bytes long. */ -Zextern PTR EXFUN(realloc, (PTR __ptr, size_t __size)); -Z/* Allocate NMEMB elements of SIZE bytes each, all initialized to 0. */ -Zextern PTR EXFUN(calloc, (size_t __nmemb, size_t __size)); -Z/* Free a block allocated by `malloc', `realloc' or `calloc'. */ -Zextern void EXFUN(free, (PTR __ptr)); -Z -Z/* Allocate SIZE bytes allocated to ALIGNMENT bytes. */ -Zextern PTR EXFUN(memalign, (size_t __alignment, size_t __size)); -Z -Z/* Allocate SIZE bytes on a page boundary. */ -Zextern PTR EXFUN(valloc, (size_t __size)); -Z -Z -Z#ifdef _MALLOC_INTERNAL -Z -Z#if defined(__GNU_LIBRARY__) || defined(__STDC__) -Z#include <limits.h> -Z#else -Z#define CHAR_BIT 8 -Z#endif -Z -Z/* The allocator divides the heap into blocks of fixed size; large -Z requests receive one or more whole blocks, and small requests -Z receive a fragment of a block. Fragment sizes are powers of two, -Z and all fragments of a block are the same size. When all the -Z fragments in a block have been freed, the block itself is freed. */ -Z#define INT_BIT (CHAR_BIT * sizeof(int)) -Z#define BLOCKLOG (INT_BIT > 16 ? 12 : 9) -Z#define BLOCKSIZE (1 << BLOCKLOG) -Z#define BLOCKIFY(SIZE) (((SIZE) + BLOCKSIZE - 1) / BLOCKSIZE) -Z -Z/* Determine the amount of memory spanned by the initial heap table -Z (not an absolute limit). */ -Z#define HEAP (INT_BIT > 16 ? 4194304 : 65536) -Z -Z/* Number of contiguous free blocks allowed to build up at the end of -Z memory before they will be returned to the system. */ -Z#define FINAL_FREE_BLOCKS 8 -Z -Z/* Where to start searching the free list when looking for new memory. -Z The two possible values are 0 and _heapindex. Starting at 0 seems -Z to reduce total memory usage, while starting at _heapindex seems to -Z run faster. */ -Z#define MALLOC_SEARCH_START _heapindex -Z -Z/* Data structure giving per-block information. */ -Ztypedef union -Z { -Z /* Heap information for a busy block. */ -Z struct -Z { -Z /* Zero for a large block, or positive giving the -Z logarithm to the base two of the fragment size. */ -Z int type; -Z union -Z { -Z struct -Z { -Z size_t nfree; /* Free fragments in a fragmented block. */ -Z size_t first; /* First free fragment of the block. */ -Z } frag; -Z /* Size (in blocks) of a large cluster. */ -Z size_t size; -Z } info; -Z } busy; -Z /* Heap information for a free block (that may be the first of -Z a free cluster). */ -Z struct -Z { -Z size_t size; /* Size (in blocks) of a free cluster. */ -Z size_t next; /* Index of next free cluster. */ -Z size_t prev; /* Index of previous free cluster. */ -Z } free; -Z } malloc_info; -Z -Z/* Pointer to first block of the heap. */ -Zextern char *_heapbase; -Z -Z/* Table indexed by block number giving per-block information. */ -Zextern malloc_info *_heapinfo; -Z -Z/* Address to block number and vice versa. */ -Z#define BLOCK(A) (((char *) (A) - _heapbase) / BLOCKSIZE + 1) -Z/* The following line MUST be split! m4 will not process it otherwise. */ -Z#define ADDRESS(B) \ -Z ((PTR) (((B) - 1) * BLOCKSIZE + _heapbase)) -Z -Z/* Current search index for the heap table. */ -Zextern size_t _heapindex; -Z -Z/* Limit of valid info table indices. */ -Zextern size_t _heaplimit; -Z -Z/* Doubly linked lists of free fragments. */ -Zstruct list -Z { -Z struct list *next; -Z struct list *prev; -Z }; -Z -Z/* Free list headers for each fragment size. */ -Zextern struct list _fraghead[]; -Z -Z/* List of blocks allocated with `memalign' (or `valloc'). */ -Zstruct alignlist -Z { -Z struct alignlist *next; -Z PTR aligned; /* The address that memaligned returned. */ -Z PTR exact; /* The address that malloc returned. */ -Z }; -Zextern struct alignlist *_aligned_blocks; -Z -Z/* Instrumentation. */ -Zextern size_t _chunks_used; -Zextern size_t _bytes_used; -Zextern size_t _chunks_free; -Zextern size_t _bytes_free; -Z -Z/* Internal version of `free' used in `morecore'. */ -Zextern void EXFUN(__free, (PTR __ptr)); -Z -Z#endif /* _MALLOC_INTERNAL. */ -Z -Z/* Underlying allocation function; successive calls should -Z return contiguous pieces of memory. */ -Zextern PTR EXFUN((*__morecore), (ptrdiff_t __size)); -Z -Z/* Default value of `__morecore'. */ -Zextern PTR EXFUN(__default_morecore, (ptrdiff_t __size)); -Z -Z/* Nonzero if `malloc' has been called and done its initialization. */ -Zextern int __malloc_initialized; -Z -Z/* Hooks for debugging versions. */ -Zextern void EXFUN((*__free_hook), (PTR __ptr)); -Zextern PTR EXFUN((*__malloc_hook), (size_t __size)); -Zextern PTR EXFUN((*__realloc_hook), (PTR __ptr, size_t __size)); -Z -Z/* Activate a standard collection of debugging hooks. */ -Zextern void EXFUN(mcheck, (void EXFUN((*__func), (void)))); -Z -Z/* Statistics available to the user. */ -Zstruct mstats -Z { -Z size_t bytes_total; /* Total size of the heap. */ -Z size_t chunks_used; /* Chunks allocated by the user. */ -Z size_t bytes_used; /* Byte total of user-allocated chunks. */ -Z size_t chunks_free; /* Chunks in the free list. */ -Z size_t bytes_free; /* Byte total of chunks in the free list. */ -Z }; -Z -Z/* Pick up the current statistics. */ -Zextern struct mstats EXFUN(mstats, (NOARGS)); -Z -Z#endif /* malloc.h */ -STUNKYFLUFF -set `sum malloc.h` -if test 10676 != $1 -then -echo malloc.h: Checksum error. Is: $1, should be: 10676. -fi -# -# -echo Extracting mcheck-init.c: -sed 's/^Z//' >mcheck-init.c <<\STUNKYFLUFF -Z/* Copyright (C) 1991 Free Software Foundation, Inc. -ZThis file is part of the GNU C Library. -Z -ZThe GNU C Library is free software; you can redistribute it and/or -Zmodify it under the terms of the GNU Library General Public License as -Zpublished by the Free Software Foundation; either version 2 of the -ZLicense, or (at your option) any later version. -Z -ZThe GNU C Library is distributed in the hope that it will be useful, -Zbut WITHOUT ANY WARRANTY; without even the implied warranty of -ZMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -ZLibrary General Public License for more details. -Z -ZYou should have received a copy of the GNU Library General Public -ZLicense along with the GNU C Library; see the file COPYING.LIB. If -Znot, write to the Free Software Foundation, Inc., 675 Mass Ave, -ZCambridge, MA 02139, USA. */ -Z -Z/* The object of this file should be installed as libmcheck.a, -Z so one can do -lmcheck to turn on mcheck. */ -Z -Z#ifdef __GNU_STAB__ -Z -Z#include <ansidecl.h> -Z#include <malloc.h> -Z#include <gnu-stabs.h> -Z -Zstatic void -ZDEFUN_VOID (turn_on_mcheck) -Z{ -Z mcheck (NULL); -Z} -Z -Ztext_set_element (__libc_subinit, turn_on_mcheck); -Z -Z#endif -STUNKYFLUFF -set `sum mcheck-init.c` -if test 31836 != $1 -then -echo mcheck-init.c: Checksum error. Is: $1, should be: 31836. -fi -# -# -echo Extracting mcheck.c: -sed 's/^Z//' >mcheck.c <<\STUNKYFLUFF -Z/* Standard debugging hooks for `malloc'. -Z Copyright 1990, 1991 Free Software Foundation -Z Written May 1989 by Mike Haertel. -Z -ZThe GNU C Library is free software; you can redistribute it and/or -Zmodify it under the terms of the GNU Library General Public License as -Zpublished by the Free Software Foundation; either version 2 of the -ZLicense, or (at your option) any later version. -Z -ZThe GNU C Library is distributed in the hope that it will be useful, -Zbut WITHOUT ANY WARRANTY; without even the implied warranty of -ZMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -ZLibrary General Public License for more details. -Z -ZYou should have received a copy of the GNU Library General Public -ZLicense along with the GNU C Library; see the file COPYING.LIB. If -Znot, write to the Free Software Foundation, Inc., 675 Mass Ave, -ZCambridge, MA 02139, USA. -Z -Z The author may be reached (Email) at the address mike@ai.mit.edu, -Z or (US mail) as Mike Haertel c/o Free Software Foundation. */ -Z -Z/* IGNORE(@ */ -Z#include <ansidecl.h> -Z#include <stdlib.h> -Z/* @) */ -Z -Z#include <malloc.h> -Z -Z/* Old hook values. */ -Zstatic void EXFUN((*old_free_hook), (PTR ptr)); -Zstatic PTR EXFUN((*old_malloc_hook), (size_t size)); -Zstatic PTR EXFUN((*old_realloc_hook), (PTR ptr, size_t size)); -Z -Z/* Function to call when something awful happens. */ -Zextern void EXFUN(abort, (NOARGS)); -Zstatic void EXFUN((*abortfunc), (NOARGS)) = (void EXFUN((*), (NOARGS))) abort; -Z -Z/* Arbitrary magical numbers. */ -Z#define MAGICWORD 0xfedabeeb -Z#define MAGICBYTE ((char) 0xd7) -Z -Zstruct hdr -Z { -Z size_t size; /* Exact size requested by user. */ -Z unsigned long int magic; /* Magic number to check header integrity. */ -Z }; -Z -Zstatic void -ZDEFUN(checkhdr, (hdr), CONST struct hdr *hdr) -Z{ -Z if (hdr->magic != MAGICWORD || ((char *) &hdr[1])[hdr->size] != MAGICBYTE) -Z (*abortfunc)(); -Z} -Z -Zstatic void -ZDEFUN(freehook, (ptr), PTR ptr) -Z{ -Z struct hdr *hdr = ((struct hdr *) ptr) - 1; -Z checkhdr(hdr); -Z hdr->magic = 0; -Z __free_hook = old_free_hook; -Z free(hdr); -Z __free_hook = freehook; -Z} -Z -Zstatic PTR -ZDEFUN(mallochook, (size), size_t size) -Z{ -Z struct hdr *hdr; -Z -Z __malloc_hook = old_malloc_hook; -Z hdr = (struct hdr *) malloc (sizeof(struct hdr) + size + 1); -Z __malloc_hook = mallochook; -Z if (hdr == NULL) -Z return NULL; -Z -Z hdr->size = size; -Z hdr->magic = MAGICWORD; -Z ((char *) &hdr[1])[size] = MAGICBYTE; -Z return (PTR) (hdr + 1); -Z} -Z -Zstatic PTR -ZDEFUN(reallochook, (ptr, size), PTR ptr AND size_t size) -Z{ -Z struct hdr *hdr = ((struct hdr *) ptr) - 1; -Z -Z checkhdr(hdr); -Z __free_hook = old_free_hook; -Z __malloc_hook = old_malloc_hook; -Z __realloc_hook = old_realloc_hook; -Z hdr = (struct hdr *) realloc((PTR) hdr, sizeof(struct hdr) + size + 1); -Z __free_hook = freehook; -Z __malloc_hook = mallochook; -Z __realloc_hook = reallochook; -Z if (hdr == NULL) -Z return NULL; -Z -Z hdr->size = size; -Z ((char *) &hdr[1])[size] = MAGICBYTE; -Z return (PTR) (hdr + 1); -Z} -Z -Zvoid -ZDEFUN(mcheck, (func), void EXFUN((*func), (void))) -Z{ -Z static int mcheck_used = 0; -Z -Z if (func != NULL) -Z abortfunc = func; -Z -Z /* These hooks may not be safely inserted if malloc is already in use. */ -Z if (!__malloc_initialized && !mcheck_used) -Z { -Z old_free_hook = __free_hook; -Z __free_hook = freehook; -Z old_malloc_hook = __malloc_hook; -Z __malloc_hook = mallochook; -Z old_realloc_hook = __realloc_hook; -Z __realloc_hook = reallochook; -Z mcheck_used = 1; -Z } -Z} -STUNKYFLUFF -set `sum mcheck.c` -if test 15283 != $1 -then -echo mcheck.c: Checksum error. Is: $1, should be: 15283. -fi -# -# -echo Extracting memalign.c: -sed 's/^Z//' >memalign.c <<\STUNKYFLUFF -Z/* Copyright (C) 1991 Free Software Foundation, Inc. -ZThis file is part of the GNU C Library. -Z -ZThe GNU C Library is free software; you can redistribute it and/or -Zmodify it under the terms of the GNU Library General Public License as -Zpublished by the Free Software Foundation; either version 2 of the -ZLicense, or (at your option) any later version. -Z -ZThe GNU C Library is distributed in the hope that it will be useful, -Zbut WITHOUT ANY WARRANTY; without even the implied warranty of -ZMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -ZLibrary General Public License for more details. -Z -ZYou should have received a copy of the GNU Library General Public -ZLicense along with the GNU C Library; see the file COPYING.LIB. If -Znot, write to the Free Software Foundation, Inc., 675 Mass Ave, -ZCambridge, MA 02139, USA. */ -Z -Z/* IGNORE(@ */ -Z#include <ansidecl.h> -Z#include <stdlib.h> -Z/* @) */ -Z -Z#define _MALLOC_INTERNAL -Z#include <malloc.h> -Z -ZPTR -ZDEFUN(memalign, (alignment, size), -Z size_t alignment AND size_t size) -Z{ -Z PTR result; -Z unsigned long int adj; -Z -Z size = ((size + alignment - 1) / alignment) * alignment; -Z -Z result = malloc (size); -Z if (result == NULL) -Z return NULL; -Z adj = (unsigned long int) ((unsigned long int) ((char *) result - -Z (char *) NULL)) % alignment; -Z if (adj != 0) -Z { -Z struct alignlist *l; -Z for (l = _aligned_blocks; l != NULL; l = l->next) -Z if (l->aligned == NULL) -Z /* This slot is free. Use it. */ -Z break; -Z if (l == NULL) -Z { -Z l = (struct alignlist *) malloc (sizeof (struct alignlist)); -Z if (l == NULL) -Z { -Z free (result); -Z return NULL; -Z } -Z } -Z l->exact = result; -Z result = l->aligned = (char *) result + alignment - adj; -Z l->next = _aligned_blocks; -Z _aligned_blocks = l; -Z } -Z -Z return result; -Z} -STUNKYFLUFF -set `sum memalign.c` -if test 11691 != $1 -then -echo memalign.c: Checksum error. Is: $1, should be: 11691. -fi -# -# -echo Extracting mstats.c: -sed 's/^Z//' >mstats.c <<\STUNKYFLUFF -Z/* Access the statistics maintained by `malloc'. -Z Copyright 1990, 1991 Free Software Foundation -Z Written May 1989 by Mike Haertel. -Z -ZThe GNU C Library is free software; you can redistribute it and/or -Zmodify it under the terms of the GNU Library General Public License as -Zpublished by the Free Software Foundation; either version 2 of the -ZLicense, or (at your option) any later version. -Z -ZThe GNU C Library is distributed in the hope that it will be useful, -Zbut WITHOUT ANY WARRANTY; without even the implied warranty of -ZMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -ZLibrary General Public License for more details. -Z -ZYou should have received a copy of the GNU Library General Public -ZLicense along with the GNU C Library; see the file COPYING.LIB. If -Znot, write to the Free Software Foundation, Inc., 675 Mass Ave, -ZCambridge, MA 02139, USA. -Z -Z The author may be reached (Email) at the address mike@ai.mit.edu, -Z or (US mail) as Mike Haertel c/o Free Software Foundation. */ -Z -Z/* IGNORE(@ */ -Z#include <ansidecl.h> -Z/* @) */ -Z -Z#define _MALLOC_INTERNAL -Z#include <malloc.h> -Z -Zstruct mstats -ZDEFUN_VOID(mstats) -Z{ -Z struct mstats result; -Z -Z result.bytes_total = (char *) (*__morecore)(0) - _heapbase; -Z result.chunks_used = _chunks_used; -Z result.bytes_used = _bytes_used; -Z result.chunks_free = _chunks_free; -Z result.bytes_free = _bytes_free; -Z return result; -Z} -STUNKYFLUFF -set `sum mstats.c` -if test 51328 != $1 -then -echo mstats.c: Checksum error. Is: $1, should be: 51328. -fi -# -# -echo Extracting mtrace.awk: -sed 's/^Z//' >mtrace.awk <<\STUNKYFLUFF -Z# -Z# Awk program to analyze mtrace.c output. -Z# -Z$1 == "+" { if (allocated[$2] != "") -Z print "+", $2, "Alloc", NR, "duplicate:", allocated[$2]; -Z else -Z allocated[$2] = $3; -Z } -Z$1 == "-" { if (allocated[$2] != "") { -Z allocated[$2] = ""; -Z if (allocated[$2] != "") -Z print "DELETE FAILED", $2, allocated[$2]; -Z } else -Z print "-", $2, "Free", NR, "was never alloc'd"; -Z } -Z$1 == "<" { if (allocated[$2] != "") -Z allocated[$2] = ""; -Z else -Z print "-", $2, "Realloc", NR, "was never alloc'd"; -Z } -Z$1 == ">" { if (allocated[$2] != "") -Z print "+", $2, "Realloc", NR, "duplicate:", allocated[$2]; -Z else -Z allocated[$2] = $3; -Z } -Z -Z# Ignore "= Start" -Z$1 == "=" { } -Z# Ignore failed realloc attempts for now -Z$1 == "!" { } -Z -Z -ZEND { for (x in allocated) -Z if (allocated[x] != "") -Z print "+", x, allocated[x]; -Z } -STUNKYFLUFF -set `sum mtrace.awk` -if test 57510 != $1 -then -echo mtrace.awk: Checksum error. Is: $1, should be: 57510. -fi -# -# -echo Extracting mtrace.c: -sed 's/^Z//' >mtrace.c <<\STUNKYFLUFF -Z/* More debugging hooks for `malloc'. -Z Copyright 1991 Free Software Foundation -Z Written April 2, 1991 by John Gilmore of Cygnus Support -Z Based on mcheck.c by Mike Haertel. -Z -ZThis program is free software; you can redistribute it and/or modify -Zit under the terms of the GNU General Public License as published by -Zthe Free Software Foundation; either version 2 of the License, or -Z(at your option) any later version. -Z -ZThis program is distributed in the hope that it will be useful, -Zbut WITHOUT ANY WARRANTY; without even the implied warranty of -ZMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -ZGNU General Public License for more details. -Z -ZYou should have received a copy of the GNU General Public License -Zalong with this program; if not, write to the Free Software -ZFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -Z -Z/* IGNORE(@ */ -Z#include <ansidecl.h> -Z#include <stdlib.h> -Z/* @) */ -Z -Z#include <stdio.h> -Z#include <malloc.h> -Z -Z#ifndef __GNU_LIBRARY__ -Zextern char *getenv (); -Z#endif -Z -Zstatic FILE *mallstream; -Zstatic char mallenv[] = "MALLOC_TRACE"; -Zstatic char mallbuf[BUFSIZ]; /* Buffer for the output. */ -Z -Z/* Address to breakpoint on accesses to... */ -ZPTR mallwatch; -Z -Z/* Old hook values. */ -Zstatic void EXFUN((*old_free_hook), (PTR ptr)); -Zstatic PTR EXFUN((*old_malloc_hook), (size_t size)); -Zstatic PTR EXFUN((*old_realloc_hook), (PTR ptr, size_t size)); -Z -Z/* This function is called when the block being alloc'd, realloc'd, or -Z freed has an address matching the variable "mallwatch". In a debugger, -Z set "mallwatch" to the address of interest, then put a breakpoint on -Z tr_break. */ -Z -Zvoid -ZDEFUN_VOID(tr_break) -Z{ -Z} -Z -Zstatic void -ZDEFUN(tr_freehook, (ptr), PTR ptr) -Z{ -Z fprintf(mallstream, "- %p\n", ptr); /* Be sure to print it first. */ -Z if (ptr == mallwatch) -Z tr_break (); -Z __free_hook = old_free_hook; -Z free (ptr); -Z __free_hook = tr_freehook; -Z} -Z -Zstatic PTR -ZDEFUN(tr_mallochook, (size), size_t size) -Z{ -Z PTR hdr; -Z -Z __malloc_hook = old_malloc_hook; -Z hdr = (PTR) malloc (size); -Z __malloc_hook = tr_mallochook; -Z -Z /* We could be printing a NULL here; that's OK. */ -Z fprintf (mallstream, "+ %p %x\n", hdr, size); -Z -Z if (hdr == mallwatch) -Z tr_break (); -Z -Z return hdr; -Z} -Z -Zstatic PTR -ZDEFUN(tr_reallochook, (ptr, size), PTR ptr AND size_t size) -Z{ -Z PTR hdr; -Z -Z if (ptr == mallwatch) -Z tr_break (); -Z -Z __free_hook = old_free_hook; -Z __malloc_hook = old_malloc_hook; -Z __realloc_hook = old_realloc_hook; -Z hdr = (PTR) realloc (ptr, size); -Z __free_hook = tr_freehook; -Z __malloc_hook = tr_mallochook; -Z __realloc_hook = tr_reallochook; -Z if (hdr == NULL) -Z /* Failed realloc. */ -Z fprintf (mallstream, "! %p %x\n", ptr, size); -Z else -Z fprintf (mallstream, "< %p\n> %p %x\n", ptr, hdr, size); -Z -Z if (hdr == mallwatch) -Z tr_break (); -Z -Z return hdr; -Z} -Z -Z/* We enable tracing if either the environment variable MALLOC_TRACE -Z is set, or if the variable mallwatch has been patched to an address -Z that the debugging user wants us to stop on. When patching mallwatch, -Z don't forget to set a breakpoint on tr_break! */ -Z -Zvoid -ZDEFUN_VOID(mtrace) -Z{ -Z char *mallfile; -Z -Z mallfile = getenv (mallenv); -Z if (mallfile != NULL || mallwatch != NULL) -Z { -Z mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "w"); -Z if (mallstream != NULL) -Z { -Z /* Be sure it doesn't malloc its buffer! */ -Z setbuf (mallstream, mallbuf); -Z fprintf (mallstream, "= Start\n"); -Z old_free_hook = __free_hook; -Z __free_hook = tr_freehook; -Z old_malloc_hook = __malloc_hook; -Z __malloc_hook = tr_mallochook; -Z old_realloc_hook = __realloc_hook; -Z __realloc_hook = tr_reallochook; -Z } -Z } -Z} -STUNKYFLUFF -set `sum mtrace.c` -if test 38600 != $1 -then -echo mtrace.c: Checksum error. Is: $1, should be: 38600. -fi -# -# -echo Extracting realloc.c: -sed 's/^Z//' >realloc.c <<\STUNKYFLUFF -Z/* Change the size of a block allocated by `malloc'. -Z Copyright 1990, 1991 Free Software Foundation -Z Written May 1989 by Mike Haertel. -Z -ZThe GNU C Library is free software; you can redistribute it and/or -Zmodify it under the terms of the GNU Library General Public License as -Zpublished by the Free Software Foundation; either version 2 of the -ZLicense, or (at your option) any later version. -Z -ZThe GNU C Library is distributed in the hope that it will be useful, -Zbut WITHOUT ANY WARRANTY; without even the implied warranty of -ZMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -ZLibrary General Public License for more details. -Z -ZYou should have received a copy of the GNU Library General Public -ZLicense along with the GNU C Library; see the file COPYING.LIB. If -Znot, write to the Free Software Foundation, Inc., 675 Mass Ave, -ZCambridge, MA 02139, USA. -Z -Z The author may be reached (Email) at the address mike@ai.mit.edu, -Z or (US mail) as Mike Haertel c/o Free Software Foundation. */ -Z -Z/* IGNORE(@ */ -Z#include <ansidecl.h> -Z#include <stdlib.h> -Z/* @) */ -Z -Z#if defined(__GNU_LIBRARY__) || defined(STDC_HEADERS) || defined(USG) -Z#include <string.h> -Z#else -Z#define memcpy(d, s, n) bcopy((s), (d), (n)) -Z#endif -Z -Z#define _MALLOC_INTERNAL -Z#include <malloc.h> -Z -Z#define MIN(A, B) ((A) < (B) ? (A) : (B)) -Z -Z/* Debugging hook for realloc. */ -ZPTR EXFUN((*__realloc_hook), (PTR __ptr, size_t __size)); -Z -Z/* Resize the given region to the new size, returning a pointer -Z to the (possibly moved) region. This is optimized for speed; -Z some benchmarks seem to indicate that greater compactness is -Z achieved by unconditionally allocating and copying to a -Z new region. This module has incestuous knowledge of the -Z internals of both free and malloc. */ -ZPTR -ZDEFUN(realloc, (ptr, size), PTR ptr AND size_t size) -Z{ -Z PTR result; -Z int type; -Z size_t block, blocks, oldlimit; -Z -Z if (size == 0) -Z { -Z free(ptr); -Z return malloc(0); -Z } -Z else if (ptr == NULL) -Z return malloc(size); -Z -Z if (__realloc_hook != NULL) -Z return (*__realloc_hook)(ptr, size); -Z -Z block = BLOCK(ptr); -Z -Z type = _heapinfo[block].busy.type; -Z switch (type) -Z { -Z case 0: -Z /* Maybe reallocate a large block to a small fragment. */ -Z if (size <= BLOCKSIZE / 2) -Z { -Z result = malloc(size); -Z if (result != NULL) -Z { -Z memcpy(result, ptr, size); -Z free(ptr); -Z return result; -Z } -Z } -Z -Z /* The new size is a large allocation as well; -Z see if we can hold it in place. */ -Z blocks = BLOCKIFY(size); -Z if (blocks < _heapinfo[block].busy.info.size) -Z { -Z /* The new size is smaller; return -Z excess memory to the free list. */ -Z _heapinfo[block + blocks].busy.type = 0; -Z _heapinfo[block + blocks].busy.info.size -Z = _heapinfo[block].busy.info.size - blocks; -Z _heapinfo[block].busy.info.size = blocks; -Z free(ADDRESS(block + blocks)); -Z result = ptr; -Z } -Z else if (blocks == _heapinfo[block].busy.info.size) -Z /* No size change necessary. */ -Z result = ptr; -Z else -Z { -Z /* Won't fit, so allocate a new region that will. -Z Free the old region first in case there is sufficient -Z adjacent free space to grow without moving. */ -Z blocks = _heapinfo[block].busy.info.size; -Z /* Prevent free from actually returning memory to the system. */ -Z oldlimit = _heaplimit; -Z _heaplimit = 0; -Z free(ptr); -Z _heaplimit = oldlimit; -Z result = malloc(size); -Z if (result == NULL) -Z { -Z (void) malloc(blocks * BLOCKSIZE); -Z return NULL; -Z } -Z if (ptr != result) -Z memmove(result, ptr, blocks * BLOCKSIZE); -Z } -Z break; -Z -Z default: -Z /* Old size is a fragment; type is logarithm -Z to base two of the fragment size. */ -Z if (size > (size_t) (1 << (type - 1)) && size <= (size_t) (1 << type)) -Z /* The new size is the same kind of fragment. */ -Z result = ptr; -Z else -Z { -Z /* The new size is different; allocate a new space, -Z and copy the lesser of the new size and the old. */ -Z result = malloc(size); -Z if (result == NULL) -Z return NULL; -Z memcpy(result, ptr, MIN(size, (size_t) 1 << type)); -Z free(ptr); -Z } -Z break; -Z } -Z -Z return result; -Z} -STUNKYFLUFF -set `sum realloc.c` -if test 3391 != $1 -then -echo realloc.c: Checksum error. Is: $1, should be: 3391. -fi -# -# -echo Extracting valloc.c: -sed 's/^Z//' >valloc.c <<\STUNKYFLUFF -Z/* Allocate memory on a page boundary. -Z Copyright (C) 1991 Free Software Foundation, Inc. -Z -ZThe GNU C Library is free software; you can redistribute it and/or -Zmodify it under the terms of the GNU Library General Public License as -Zpublished by the Free Software Foundation; either version 2 of the -ZLicense, or (at your option) any later version. -Z -ZThe GNU C Library is distributed in the hope that it will be useful, -Zbut WITHOUT ANY WARRANTY; without even the implied warranty of -ZMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -ZLibrary General Public License for more details. -Z -ZYou should have received a copy of the GNU Library General Public -ZLicense along with the GNU C Library; see the file COPYING.LIB. If -Znot, write to the Free Software Foundation, Inc., 675 Mass Ave, -ZCambridge, MA 02139, USA. */ -Z -Z/* IGNORE(@ */ -Z#include <ansidecl.h> -Z#include <stdlib.h> -Z/* @) */ -Z -Z#include <malloc.h> -Z -Z#ifdef __GNU_LIBRARY__ -Zextern size_t EXFUN(__getpagesize, (NOARGS)); -Z#else -Z#ifndef USG -Zextern size_t EXFUN(getpagesize, (NOARGS)); -Z#define __getpagesize() getpagesize() -Z#else -Z#include <sys/param.h> -Z#ifdef EXEC_PAGESIZE -Z#define __getpagesize() EXEC_PAGESIZE -Z#else /* No EXEC_PAGESIZE. */ -Z#ifdef NBPG -Z#ifndef CLSIZE -Z#define CLSIZE 1 -Z#endif /* No CLSIZE. */ -Z#define __getpagesize() (NBPG * CLSIZE) -Z#else /* No NBPG. */ -Z#define __getpagesize() NBPC -Z#endif /* NBPG. */ -Z#endif /* EXEC_PAGESIZE. */ -Z#endif /* USG. */ -Z#endif -Z -Zstatic size_t pagesize; -Z -ZPTR -ZDEFUN(valloc, (size), size_t size) -Z{ -Z if (pagesize == 0) -Z pagesize = __getpagesize(); -Z -Z return memalign (pagesize, size); -Z} -STUNKYFLUFF -set `sum valloc.c` -if test 63930 != $1 -then -echo valloc.c: Checksum error. Is: $1, should be: 63930. -fi -echo ALL DONE BUNKY! -exit 0 |