URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
Compare Revisions
- This comparison shows the changes necessary to convert path
/or1k/trunk/gdb-5.3/mmalloc
- from Rev 1183 to Rev 1765
- ↔ Reverse comparison
Rev 1183 → Rev 1765
/mmalloc.texi
0,0 → 1,258
\input texinfo @c -*- Texinfo -*- |
@setfilename mmalloc.info |
|
@ifinfo |
@format |
START-INFO-DIR-ENTRY |
* Mmalloc: (mmalloc). The GNU mapped-malloc package. |
END-INFO-DIR-ENTRY |
@end format |
|
This file documents the GNU mmalloc (mapped-malloc) package, written by |
fnf@@cygnus.com, based on GNU malloc written by mike@@ai.mit.edu. |
|
Copyright (C) 1992 Free Software Foundation, Inc. |
|
Permission is granted to make and distribute verbatim copies of |
this manual provided the copyright notice and this permission notice |
are preserved on all copies. |
|
@ignore |
Permission is granted to process this file through Tex and print the |
results, provided the printed document carries copying permission |
notice identical to this one except for the removal of this paragraph |
(this paragraph not being relevant to the printed manual). |
|
@end ignore |
Permission is granted to copy and distribute modified versions of this |
manual under the conditions for verbatim copying, provided also that the |
entire resulting derived work is distributed under the terms of a |
permission notice identical to this one. |
|
Permission is granted to copy and distribute translations of this manual |
into another language, under the above conditions for modified versions. |
@end ifinfo |
@iftex |
@c @finalout |
@setchapternewpage odd |
@settitle MMALLOC, the GNU memory-mapped malloc package |
@titlepage |
@title mmalloc |
@subtitle The GNU memory-mapped malloc package |
@author Fred Fish |
@author Cygnus Support |
@author Mike Haertel |
@author Free Software Foundation |
@page |
|
@tex |
\def\$#1${{#1}} % Kluge: collect RCS revision info without $...$ |
\xdef\manvers{\$Revision: 1.2 $} % For use in headers, footers too |
{\parskip=0pt |
\hfill Cygnus Support\par |
\hfill fnf\@cygnus.com\par |
\hfill {\it MMALLOC, the GNU memory-mapped malloc package}, \manvers\par |
\hfill \TeX{}info \texinfoversion\par |
} |
@end tex |
|
@vskip 0pt plus 1filll |
Copyright @copyright{} 1992 Free Software Foundation, Inc. |
|
Permission is granted to make and distribute verbatim copies of |
this manual provided the copyright notice and this permission notice |
are preserved on all copies. |
|
Permission is granted to copy and distribute modified versions of this |
manual under the conditions for verbatim copying, provided also that |
the entire resulting derived work is distributed under the terms of a |
permission notice identical to this one. |
|
Permission is granted to copy and distribute translations of this manual |
into another language, under the above conditions for modified versions. |
@end titlepage |
@end iftex |
|
@ifinfo |
@node Top, Overview, (dir), (dir) |
@top mmalloc |
This file documents the GNU memory-mapped malloc package mmalloc. |
|
@menu |
* Overview:: Overall Description |
* Implementation:: Implementation |
|
--- The Detailed Node Listing --- |
|
Implementation |
|
* Compatibility:: Backwards Compatibility |
* Functions:: Function Descriptions |
@end menu |
|
@end ifinfo |
|
@node Overview, Implementation, Top, Top |
@chapter Overall Description |
|
This is a heavily modified version of GNU @code{malloc}. It uses |
@code{mmap} as the basic mechanism for obtaining memory from the |
system, rather than @code{sbrk}. This gives it several advantages over the |
more traditional malloc: |
|
@itemize @bullet |
@item |
Several different heaps can be used, each of them growing |
or shinking under control of @code{mmap}, with the @code{mmalloc} functions |
using a specific heap on a call by call basis. |
|
@item |
By using @code{mmap}, it is easy to create heaps which are intended to |
be persistent and exist as a filesystem object after the creating |
process has gone away. |
|
@item |
Because multiple heaps can be managed, data used for a |
specific purpose can be allocated into its own heap, making |
it easier to allow applications to ``dump'' and ``restore'' initialized |
malloc-managed memory regions. For example, the ``unexec'' hack popularized |
by GNU Emacs could potentially go away. |
@end itemize |
|
@node Implementation, , Overview, Top |
@chapter Implementation |
|
The @code{mmalloc} functions contain no internal static state. All |
@code{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 @code{sbrk}. However the new routines now need an |
extra parameter which informs @code{mmalloc} which memory region it is dealing |
with (along with other information). This parameter is called the |
@dfn{malloc descriptor}. |
|
The functions initially provided by @code{mmalloc} are: |
|
@example |
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); |
@end example |
|
@menu |
* Compatibility:: Backwards Compatibility |
* Functions:: Function Descriptions |
@end menu |
|
@node Compatibility, Functions, Implementation, Implementation |
@section Backwards Compatibility |
|
To allow a single malloc package to be used in a given application, |
provision is made for the traditional @code{malloc}, @code{realloc}, and |
@code{free} functions to be implemented as special cases of the |
@code{mmalloc} functions. In particular, if any of the functions that |
expect malloc descriptors are called with a @code{NULL} pointer rather than a |
valid malloc descriptor, then they default to using an @code{sbrk} managed |
region. |
The @code{mmalloc} package provides compatible @code{malloc}, @code{realloc}, |
and @code{free} functions using this mechanism internally. |
Applications can avoid this extra interface layer by simply including the |
following defines: |
|
@example |
#define malloc(size) mmalloc ((void *)0, (size)) |
#define realloc(ptr,size) mrealloc ((void *)0, (ptr), (size)); |
#define free(ptr) mfree ((void *)0, (ptr)) |
@end example |
|
@noindent |
or replace the existing @code{malloc}, @code{realloc}, and @code{free} |
calls with the above patterns if using @code{#define} causes problems. |
|
@node Functions, , Compatibility, Implementation |
@section Function Descriptions |
|
These are the details on the functions that make up the @code{mmalloc} |
package. |
|
@table @code |
@item void *mmalloc_attach (int @var{fd}, void *@var{baseaddr}); |
Initialize access to a @code{mmalloc} managed region. |
|
If @var{fd} is a valid file descriptor for an open file, then data for the |
@code{mmalloc} managed region is mapped to that file. Otherwise |
@file{/dev/zero} is used and the data will not exist in any filesystem object. |
|
If the open file corresponding to @var{fd} is from a previous use of |
@code{mmalloc} and passes some basic sanity checks to ensure that it is |
compatible with the current @code{mmalloc} package, then its data is |
mapped in and is immediately accessible at the same addresses in |
the current process as the process that created the file. |
|
If @var{baseaddr} is not @code{NULL}, the mapping is established |
starting at the specified address in the process address space. If |
@var{baseaddr} is @code{NULL}, the @code{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 @code{mmalloc}, or for new files will be a value |
chosen by @code{mmap}. |
|
Specifying @var{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 @code{mmalloc} package functions. It is explicitly |
@samp{void *} (@samp{char *} for systems that don't fully support |
@code{void}) so that users of the package don't have to worry about the |
actual implementation details. |
|
On failure returns @code{NULL}. |
|
@item void *mmalloc_detach (void *@var{md}); |
Terminate access to a @code{mmalloc} managed region identified by the |
descriptor @var{md}, by closing the base file and unmapping all memory |
pages associated with the region. |
|
Returns @code{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). |
|
@item void *mmalloc (void *@var{md}, size_t @var{size}); |
Given an @code{mmalloc} descriptor @var{md}, allocate additional memory of |
@var{size} bytes in the associated mapped region. |
|
@item *mrealloc (void *@var{md}, void *@var{ptr}, size_t @var{size}); |
Given an @code{mmalloc} descriptor @var{md} and a pointer to memory |
previously allocated by @code{mmalloc} in @var{ptr}, reallocate the |
memory to be @var{size} bytes long, possibly moving the existing |
contents of memory if necessary. |
|
@item void *mvalloc (void *@var{md}, size_t @var{size}); |
Like @code{mmalloc} but the resulting memory is aligned on a page boundary. |
|
@item void mfree (void *@var{md}, void *@var{ptr}); |
Given an @code{mmalloc} descriptor @var{md} and a pointer to memory previously |
allocated by @code{mmalloc} in @var{ptr}, free the previously allocated memory. |
|
@item int mmalloc_errno (void *@var{md}); |
Given a @code{mmalloc} descriptor, if the last @code{mmalloc} operation |
failed for some reason due to a system call failure, then |
returns the associated @code{errno}. Returns 0 otherwise. |
(This function is not yet implemented). |
@end table |
|
@bye |
/mfree.c
0,0 → 1,247
/* Free a block of memory allocated by `mmalloc'. |
Copyright 1990, 1991, 1992 Free Software Foundation |
|
Written May 1989 by Mike Haertel. |
Heavily modified Mar 1992 by Fred Fish. (fnf@cygnus.com) |
|
The GNU C Library is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public License as |
published by the Free Software Foundation; either version 2 of the |
License, or (at your option) any later version. |
|
The GNU C Library 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 |
Library General Public License for more details. |
|
You should have received a copy of the GNU Library General Public |
License along with the GNU C Library; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
Boston, MA 02111-1307, USA. |
|
The author may be reached (Email) at the address mike@ai.mit.edu, |
or (US mail) as Mike Haertel c/o Free Software Foundation. */ |
|
#include "mmprivate.h" |
|
/* Return memory to the heap. |
Like `mfree' but don't call a mfree_hook if there is one. */ |
|
void |
__mmalloc_free (mdp, ptr) |
struct mdesc *mdp; |
PTR ptr; |
{ |
int type; |
size_t block, blocks; |
register size_t i; |
struct list *prev, *next; |
|
block = BLOCK (ptr); |
|
type = mdp -> heapinfo[block].busy.type; |
switch (type) |
{ |
case 0: |
/* Get as many statistics as early as we can. */ |
mdp -> heapstats.chunks_used--; |
mdp -> heapstats.bytes_used -= |
mdp -> heapinfo[block].busy.info.size * BLOCKSIZE; |
mdp -> heapstats.bytes_free += |
mdp -> heapinfo[block].busy.info.size * BLOCKSIZE; |
|
/* Find the free cluster previous to this one in the free list. |
Start searching at the last block referenced; this may benefit |
programs with locality of allocation. */ |
i = mdp -> heapindex; |
if (i > block) |
{ |
while (i > block) |
{ |
i = mdp -> heapinfo[i].free.prev; |
} |
} |
else |
{ |
do |
{ |
i = mdp -> heapinfo[i].free.next; |
} |
while ((i != 0) && (i < block)); |
i = mdp -> heapinfo[i].free.prev; |
} |
|
/* Determine how to link this block into the free list. */ |
if (block == i + mdp -> heapinfo[i].free.size) |
{ |
/* Coalesce this block with its predecessor. */ |
mdp -> heapinfo[i].free.size += |
mdp -> heapinfo[block].busy.info.size; |
block = i; |
} |
else |
{ |
/* Really link this block back into the free list. */ |
mdp -> heapinfo[block].free.size = |
mdp -> heapinfo[block].busy.info.size; |
mdp -> heapinfo[block].free.next = mdp -> heapinfo[i].free.next; |
mdp -> heapinfo[block].free.prev = i; |
mdp -> heapinfo[i].free.next = block; |
mdp -> heapinfo[mdp -> heapinfo[block].free.next].free.prev = block; |
mdp -> heapstats.chunks_free++; |
} |
|
/* Now that the block is linked in, see if we can coalesce it |
with its successor (by deleting its successor from the list |
and adding in its size). */ |
if (block + mdp -> heapinfo[block].free.size == |
mdp -> heapinfo[block].free.next) |
{ |
mdp -> heapinfo[block].free.size |
+= mdp -> heapinfo[mdp -> heapinfo[block].free.next].free.size; |
mdp -> heapinfo[block].free.next |
= mdp -> heapinfo[mdp -> heapinfo[block].free.next].free.next; |
mdp -> heapinfo[mdp -> heapinfo[block].free.next].free.prev = block; |
mdp -> heapstats.chunks_free--; |
} |
|
/* Now see if we can return stuff to the system. */ |
blocks = mdp -> heapinfo[block].free.size; |
if (blocks >= FINAL_FREE_BLOCKS && block + blocks == mdp -> heaplimit |
&& mdp -> morecore (mdp, 0) == ADDRESS (block + blocks)) |
{ |
register size_t bytes = blocks * BLOCKSIZE; |
mdp -> heaplimit -= blocks; |
mdp -> morecore (mdp, -bytes); |
mdp -> heapinfo[mdp -> heapinfo[block].free.prev].free.next |
= mdp -> heapinfo[block].free.next; |
mdp -> heapinfo[mdp -> heapinfo[block].free.next].free.prev |
= mdp -> heapinfo[block].free.prev; |
block = mdp -> heapinfo[block].free.prev; |
mdp -> heapstats.chunks_free--; |
mdp -> heapstats.bytes_free -= bytes; |
} |
|
/* Set the next search to begin at this block. */ |
mdp -> heapindex = block; |
break; |
|
default: |
/* Do some of the statistics. */ |
mdp -> heapstats.chunks_used--; |
mdp -> heapstats.bytes_used -= 1 << type; |
mdp -> heapstats.chunks_free++; |
mdp -> heapstats.bytes_free += 1 << type; |
|
/* Get the address of the first free fragment in this block. */ |
prev = (struct list *) |
((char *) ADDRESS(block) + |
(mdp -> heapinfo[block].busy.info.frag.first << type)); |
|
if (mdp -> heapinfo[block].busy.info.frag.nfree == |
(BLOCKSIZE >> type) - 1) |
{ |
/* If all fragments of this block are free, remove them |
from the fragment list and free the whole block. */ |
next = prev; |
for (i = 1; i < (size_t) (BLOCKSIZE >> type); ++i) |
{ |
next = next -> next; |
} |
prev -> prev -> next = next; |
if (next != NULL) |
{ |
next -> prev = prev -> prev; |
} |
mdp -> heapinfo[block].busy.type = 0; |
mdp -> heapinfo[block].busy.info.size = 1; |
|
/* Keep the statistics accurate. */ |
mdp -> heapstats.chunks_used++; |
mdp -> heapstats.bytes_used += BLOCKSIZE; |
mdp -> heapstats.chunks_free -= BLOCKSIZE >> type; |
mdp -> heapstats.bytes_free -= BLOCKSIZE; |
|
mfree ((PTR) mdp, (PTR) ADDRESS(block)); |
} |
else if (mdp -> heapinfo[block].busy.info.frag.nfree != 0) |
{ |
/* If some fragments of this block are free, link this |
fragment into the fragment list after the first free |
fragment of this block. */ |
next = (struct list *) ptr; |
next -> next = prev -> next; |
next -> prev = prev; |
prev -> next = next; |
if (next -> next != NULL) |
{ |
next -> next -> prev = next; |
} |
++mdp -> heapinfo[block].busy.info.frag.nfree; |
} |
else |
{ |
/* No fragments of this block are free, so link this |
fragment into the fragment list and announce that |
it is the first free fragment of this block. */ |
prev = (struct list *) ptr; |
mdp -> heapinfo[block].busy.info.frag.nfree = 1; |
mdp -> heapinfo[block].busy.info.frag.first = |
RESIDUAL (ptr, BLOCKSIZE) >> type; |
prev -> next = mdp -> fraghead[type].next; |
prev -> prev = &mdp -> fraghead[type]; |
prev -> prev -> next = prev; |
if (prev -> next != NULL) |
{ |
prev -> next -> prev = prev; |
} |
} |
break; |
} |
} |
|
/* Return memory to the heap. */ |
|
void |
mfree (md, ptr) |
PTR md; |
PTR ptr; |
{ |
struct mdesc *mdp; |
register struct alignlist *l; |
|
if (ptr != NULL) |
{ |
mdp = MD_TO_MDP (md); |
for (l = mdp -> aligned_blocks; l != NULL; l = l -> next) |
{ |
if (l -> aligned == ptr) |
{ |
l -> aligned = NULL; /* Mark the slot in the list as free. */ |
ptr = l -> exact; |
break; |
} |
} |
if (mdp -> mfree_hook != NULL) |
{ |
(*mdp -> mfree_hook) (md, ptr); |
} |
else |
{ |
__mmalloc_free (mdp, ptr); |
} |
} |
} |
|
/* When using this package, provide a version of malloc/realloc/free built |
on top of it, so that if we use the default sbrk() region we will not |
collide with another malloc package trying to do the same thing, if |
the application contains any "hidden" calls to malloc/realloc/free (such |
as inside a system library). */ |
|
void |
free (ptr) |
PTR ptr; |
{ |
mfree ((PTR) NULL, ptr); |
} |
/mrealloc.c
0,0 → 1,163
/* Change the size of a block allocated by `mmalloc'. |
Copyright 1990, 1991 Free Software Foundation |
Written May 1989 by Mike Haertel. |
|
The GNU C Library is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public License as |
published by the Free Software Foundation; either version 2 of the |
License, or (at your option) any later version. |
|
The GNU C Library 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 |
Library General Public License for more details. |
|
You should have received a copy of the GNU Library General Public |
License along with the GNU C Library; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
Boston, MA 02111-1307, USA. |
|
The author may be reached (Email) at the address mike@ai.mit.edu, |
or (US mail) as Mike Haertel c/o Free Software Foundation. */ |
|
#include <string.h> /* Prototypes for memcpy, memmove, memset, etc */ |
|
#include "mmprivate.h" |
|
/* Resize the given region to the new size, returning a pointer |
to the (possibly moved) region. This is optimized for speed; |
some benchmarks seem to indicate that greater compactness is |
achieved by unconditionally allocating and copying to a |
new region. This module has incestuous knowledge of the |
internals of both mfree and mmalloc. */ |
|
PTR |
mrealloc (md, ptr, size) |
PTR md; |
PTR ptr; |
size_t size; |
{ |
struct mdesc *mdp; |
PTR result; |
int type; |
size_t block, blocks, oldlimit; |
|
if (size == 0) |
{ |
mfree (md, ptr); |
return (mmalloc (md, 0)); |
} |
else if (ptr == NULL) |
{ |
return (mmalloc (md, size)); |
} |
|
mdp = MD_TO_MDP (md); |
|
if (mdp -> mrealloc_hook != NULL) |
{ |
return ((*mdp -> mrealloc_hook) (md, ptr, size)); |
} |
|
block = BLOCK (ptr); |
|
type = mdp -> heapinfo[block].busy.type; |
switch (type) |
{ |
case 0: |
/* Maybe reallocate a large block to a small fragment. */ |
if (size <= BLOCKSIZE / 2) |
{ |
result = mmalloc (md, size); |
if (result != NULL) |
{ |
memcpy (result, ptr, size); |
mfree (md, ptr); |
return (result); |
} |
} |
|
/* The new size is a large allocation as well; |
see if we can hold it in place. */ |
blocks = BLOCKIFY (size); |
if (blocks < mdp -> heapinfo[block].busy.info.size) |
{ |
/* The new size is smaller; return excess memory to the free list. */ |
mdp -> heapinfo[block + blocks].busy.type = 0; |
mdp -> heapinfo[block + blocks].busy.info.size |
= mdp -> heapinfo[block].busy.info.size - blocks; |
mdp -> heapinfo[block].busy.info.size = blocks; |
mfree (md, ADDRESS (block + blocks)); |
result = ptr; |
} |
else if (blocks == mdp -> heapinfo[block].busy.info.size) |
{ |
/* No size change necessary. */ |
result = ptr; |
} |
else |
{ |
/* Won't fit, so allocate a new region that will. |
Free the old region first in case there is sufficient |
adjacent free space to grow without moving. */ |
blocks = mdp -> heapinfo[block].busy.info.size; |
/* Prevent free from actually returning memory to the system. */ |
oldlimit = mdp -> heaplimit; |
mdp -> heaplimit = 0; |
mfree (md, ptr); |
mdp -> heaplimit = oldlimit; |
result = mmalloc (md, size); |
if (result == NULL) |
{ |
mmalloc (md, blocks * BLOCKSIZE); |
return (NULL); |
} |
if (ptr != result) |
{ |
memmove (result, ptr, blocks * BLOCKSIZE); |
} |
} |
break; |
|
default: |
/* Old size is a fragment; type is logarithm |
to base two of the fragment size. */ |
if (size > (size_t) (1 << (type - 1)) && size <= (size_t) (1 << type)) |
{ |
/* The new size is the same kind of fragment. */ |
result = ptr; |
} |
else |
{ |
/* The new size is different; allocate a new space, |
and copy the lesser of the new size and the old. */ |
result = mmalloc (md, size); |
if (result == NULL) |
{ |
return (NULL); |
} |
memcpy (result, ptr, MIN (size, (size_t) 1 << type)); |
mfree (md, ptr); |
} |
break; |
} |
|
return (result); |
} |
|
/* When using this package, provide a version of malloc/realloc/free built |
on top of it, so that if we use the default sbrk() region we will not |
collide with another malloc package trying to do the same thing, if |
the application contains any "hidden" calls to malloc/realloc/free (such |
as inside a system library). */ |
|
PTR |
realloc (ptr, size) |
PTR ptr; |
size_t size; |
{ |
PTR result; |
|
result = mrealloc ((PTR) NULL, ptr, size); |
return (result); |
} |
/mmap-sup.c
0,0 → 1,220
/* Support for an sbrk-like function that uses mmap. |
Copyright 1992, 2000 Free Software Foundation, Inc. |
|
Contributed by Fred Fish at Cygnus Support. fnf@cygnus.com |
|
This file is part of the GNU C Library. |
|
The GNU C Library is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public License as |
published by the Free Software Foundation; either version 2 of the |
License, or (at your option) any later version. |
|
The GNU C Library 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 |
Library General Public License for more details. |
|
You should have received a copy of the GNU Library General Public |
License along with the GNU C Library; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
Boston, MA 02111-1307, USA. */ |
|
#if defined(HAVE_MMAP) |
|
#ifdef HAVE_UNISTD_H |
#include <unistd.h> /* Prototypes for lseek */ |
#endif |
#include <stdio.h> |
#include <fcntl.h> |
#include <sys/mman.h> |
|
#ifndef SEEK_SET |
#define SEEK_SET 0 |
#endif |
|
#include "mmprivate.h" |
|
/* Cache the pagesize for the current host machine. Note that if the host |
does not readily provide a getpagesize() function, we need to emulate it |
elsewhere, not clutter up this file with lots of kluges to try to figure |
it out. */ |
|
static size_t pagesize; |
#if NEED_DECLARATION_GETPAGESIZE |
extern int getpagesize PARAMS ((void)); |
#endif |
|
#define PAGE_ALIGN(addr) (caddr_t) (((long)(addr) + pagesize - 1) & \ |
~(pagesize - 1)) |
|
|
/* Return MAP_PRIVATE if MDP represents /dev/zero. Otherwise, return |
MAP_SHARED. */ |
|
#define MAP_PRIVATE_OR_SHARED(MDP) ((MDP -> flags & MMALLOC_DEVZERO) \ |
? MAP_PRIVATE \ |
: MAP_SHARED) |
|
|
/* Get core for the memory region specified by MDP, using SIZE as the |
amount to either add to or subtract from the existing region. Works |
like sbrk(), but using mmap(). */ |
|
PTR |
__mmalloc_mmap_morecore (mdp, size) |
struct mdesc *mdp; |
int size; |
{ |
PTR result = NULL; |
off_t foffset; /* File offset at which new mapping will start */ |
size_t mapbytes; /* Number of bytes to map */ |
caddr_t moveto; /* Address where we wish to move "break value" to */ |
caddr_t mapto; /* Address we actually mapped to */ |
char buf = 0; /* Single byte to write to extend mapped file */ |
|
if (pagesize == 0) |
{ |
pagesize = getpagesize (); |
} |
if (size == 0) |
{ |
/* Just return the current "break" value. */ |
result = mdp -> breakval; |
} |
else if (size < 0) |
{ |
/* We are deallocating memory. If the amount requested would cause |
us to try to deallocate back past the base of the mmap'd region |
then do nothing, and return NULL. Otherwise, deallocate the |
memory and return the old break value. */ |
if (mdp -> breakval + size >= mdp -> base) |
{ |
result = (PTR) mdp -> breakval; |
mdp -> breakval += size; |
moveto = PAGE_ALIGN (mdp -> breakval); |
munmap (moveto, (size_t) (mdp -> top - moveto)); |
mdp -> top = moveto; |
} |
} |
else |
{ |
/* We are allocating memory. Make sure we have an open file |
descriptor and then go on to get the memory. */ |
if (mdp -> fd < 0) |
{ |
result = NULL; |
} |
else if (mdp -> breakval + size > mdp -> top) |
{ |
/* The request would move us past the end of the currently |
mapped memory, so map in enough more memory to satisfy |
the request. This means we also have to grow the mapped-to |
file by an appropriate amount, since mmap cannot be used |
to extend a file. */ |
moveto = PAGE_ALIGN (mdp -> breakval + size); |
mapbytes = moveto - mdp -> top; |
foffset = mdp -> top - mdp -> base; |
/* FIXME: Test results of lseek() and write() */ |
lseek (mdp -> fd, foffset + mapbytes - 1, SEEK_SET); |
write (mdp -> fd, &buf, 1); |
if (mdp -> base == 0) |
{ |
/* Let mmap pick the map start address */ |
mapto = mmap (0, mapbytes, PROT_READ | PROT_WRITE, |
MAP_PRIVATE_OR_SHARED (mdp), mdp -> fd, foffset); |
if (mapto != (caddr_t) -1) |
{ |
mdp -> base = mdp -> breakval = mapto; |
mdp -> top = mdp -> base + mapbytes; |
result = (PTR) mdp -> breakval; |
mdp -> breakval += size; |
} |
} |
else |
{ |
mapto = mmap (mdp -> top, mapbytes, PROT_READ | PROT_WRITE, |
MAP_PRIVATE_OR_SHARED (mdp) | MAP_FIXED, mdp -> fd, |
foffset); |
if (mapto == mdp -> top) |
{ |
mdp -> top = moveto; |
result = (PTR) mdp -> breakval; |
mdp -> breakval += size; |
} |
} |
} |
else |
{ |
result = (PTR) mdp -> breakval; |
mdp -> breakval += size; |
} |
} |
return (result); |
} |
|
PTR |
__mmalloc_remap_core (mdp) |
struct mdesc *mdp; |
{ |
caddr_t base; |
|
/* FIXME: Quick hack, needs error checking and other attention. */ |
|
base = mmap (mdp -> base, mdp -> top - mdp -> base, |
PROT_READ | PROT_WRITE, MAP_PRIVATE_OR_SHARED (mdp) | MAP_FIXED, |
mdp -> fd, 0); |
return ((PTR) base); |
} |
|
PTR |
mmalloc_findbase (size) |
int size; |
{ |
int fd; |
int flags; |
caddr_t base = NULL; |
|
#ifdef MAP_ANONYMOUS |
flags = MAP_PRIVATE | MAP_ANONYMOUS; |
fd = -1; |
#else |
#ifdef MAP_FILE |
flags = MAP_PRIVATE | MAP_FILE; |
#else |
flags = MAP_PRIVATE; |
#endif |
fd = open ("/dev/zero", O_RDWR); |
if (fd != -1) |
{ |
return ((PTR) NULL); |
} |
#endif |
base = mmap (0, size, PROT_READ | PROT_WRITE, flags, fd, 0); |
if (base != (caddr_t) -1) |
{ |
munmap (base, (size_t) size); |
} |
if (fd != -1) |
{ |
close (fd); |
} |
if (base == 0) |
{ |
/* Don't allow mapping at address zero. We use that value |
to signal an error return, and besides, it is useful to |
catch NULL pointers if it is unmapped. Instead start |
at the next page boundary. */ |
base = (caddr_t) getpagesize (); |
} |
else if (base == (caddr_t) -1) |
{ |
base = NULL; |
} |
return ((PTR) base); |
} |
|
#else /* defined(HAVE_MMAP) */ |
/* Prevent "empty translation unit" warnings from the idiots at X3J11. */ |
static char ansi_c_idiots = 69; |
#endif /* defined(HAVE_MMAP) */ |
/configure
0,0 → 1,1747
#! /bin/sh |
|
# Guess values for system-dependent variables and create Makefiles. |
# Generated automatically using autoconf version 2.13 |
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. |
# |
# This configure script is free software; the Free Software Foundation |
# gives unlimited permission to copy, distribute and modify it. |
|
# Defaults: |
ac_help= |
ac_default_prefix=/usr/local |
# Any additions from configure.in: |
|
# Initialize some variables set by options. |
# The variables have the same names as the options, with |
# dashes changed to underlines. |
build=NONE |
cache_file=./config.cache |
exec_prefix=NONE |
host=NONE |
no_create= |
nonopt=NONE |
no_recursion= |
prefix=NONE |
program_prefix=NONE |
program_suffix=NONE |
program_transform_name=s,x,x, |
silent= |
site= |
sitefile= |
srcdir= |
target=NONE |
verbose= |
x_includes=NONE |
x_libraries=NONE |
bindir='${exec_prefix}/bin' |
sbindir='${exec_prefix}/sbin' |
libexecdir='${exec_prefix}/libexec' |
datadir='${prefix}/share' |
sysconfdir='${prefix}/etc' |
sharedstatedir='${prefix}/com' |
localstatedir='${prefix}/var' |
libdir='${exec_prefix}/lib' |
includedir='${prefix}/include' |
oldincludedir='/usr/include' |
infodir='${prefix}/info' |
mandir='${prefix}/man' |
|
# Initialize some other variables. |
subdirs= |
MFLAGS= MAKEFLAGS= |
SHELL=${CONFIG_SHELL-/bin/sh} |
# Maximum number of lines to put in a shell here document. |
ac_max_here_lines=12 |
|
ac_prev= |
for ac_option |
do |
|
# If the previous option needs an argument, assign it. |
if test -n "$ac_prev"; then |
eval "$ac_prev=\$ac_option" |
ac_prev= |
continue |
fi |
|
case "$ac_option" in |
-*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; |
*) ac_optarg= ;; |
esac |
|
# Accept the important Cygnus configure options, so we can diagnose typos. |
|
case "$ac_option" in |
|
-bindir | --bindir | --bindi | --bind | --bin | --bi) |
ac_prev=bindir ;; |
-bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) |
bindir="$ac_optarg" ;; |
|
-build | --build | --buil | --bui | --bu) |
ac_prev=build ;; |
-build=* | --build=* | --buil=* | --bui=* | --bu=*) |
build="$ac_optarg" ;; |
|
-cache-file | --cache-file | --cache-fil | --cache-fi \ |
| --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) |
ac_prev=cache_file ;; |
-cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ |
| --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) |
cache_file="$ac_optarg" ;; |
|
-datadir | --datadir | --datadi | --datad | --data | --dat | --da) |
ac_prev=datadir ;; |
-datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ |
| --da=*) |
datadir="$ac_optarg" ;; |
|
-disable-* | --disable-*) |
ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` |
# Reject names that are not valid shell variable names. |
if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then |
{ echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } |
fi |
ac_feature=`echo $ac_feature| sed 's/-/_/g'` |
eval "enable_${ac_feature}=no" ;; |
|
-enable-* | --enable-*) |
ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` |
# Reject names that are not valid shell variable names. |
if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then |
{ echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } |
fi |
ac_feature=`echo $ac_feature| sed 's/-/_/g'` |
case "$ac_option" in |
*=*) ;; |
*) ac_optarg=yes ;; |
esac |
eval "enable_${ac_feature}='$ac_optarg'" ;; |
|
-exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ |
| --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ |
| --exec | --exe | --ex) |
ac_prev=exec_prefix ;; |
-exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ |
| --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ |
| --exec=* | --exe=* | --ex=*) |
exec_prefix="$ac_optarg" ;; |
|
-gas | --gas | --ga | --g) |
# Obsolete; use --with-gas. |
with_gas=yes ;; |
|
-help | --help | --hel | --he) |
# Omit some internal or obsolete options to make the list less imposing. |
# This message is too long to be a string in the A/UX 3.1 sh. |
cat << EOF |
Usage: configure [options] [host] |
Options: [defaults in brackets after descriptions] |
Configuration: |
--cache-file=FILE cache test results in FILE |
--help print this message |
--no-create do not create output files |
--quiet, --silent do not print \`checking...' messages |
--site-file=FILE use FILE as the site file |
--version print the version of autoconf that created configure |
Directory and file names: |
--prefix=PREFIX install architecture-independent files in PREFIX |
[$ac_default_prefix] |
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX |
[same as prefix] |
--bindir=DIR user executables in DIR [EPREFIX/bin] |
--sbindir=DIR system admin executables in DIR [EPREFIX/sbin] |
--libexecdir=DIR program executables in DIR [EPREFIX/libexec] |
--datadir=DIR read-only architecture-independent data in DIR |
[PREFIX/share] |
--sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] |
--sharedstatedir=DIR modifiable architecture-independent data in DIR |
[PREFIX/com] |
--localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] |
--libdir=DIR object code libraries in DIR [EPREFIX/lib] |
--includedir=DIR C header files in DIR [PREFIX/include] |
--oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] |
--infodir=DIR info documentation in DIR [PREFIX/info] |
--mandir=DIR man documentation in DIR [PREFIX/man] |
--srcdir=DIR find the sources in DIR [configure dir or ..] |
--program-prefix=PREFIX prepend PREFIX to installed program names |
--program-suffix=SUFFIX append SUFFIX to installed program names |
--program-transform-name=PROGRAM |
run sed PROGRAM on installed program names |
EOF |
cat << EOF |
Host type: |
--build=BUILD configure for building on BUILD [BUILD=HOST] |
--host=HOST configure for HOST [guessed] |
--target=TARGET configure for TARGET [TARGET=HOST] |
Features and packages: |
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) |
--enable-FEATURE[=ARG] include FEATURE [ARG=yes] |
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes] |
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) |
--x-includes=DIR X include files are in DIR |
--x-libraries=DIR X library files are in DIR |
EOF |
if test -n "$ac_help"; then |
echo "--enable and --with options recognized:$ac_help" |
fi |
exit 0 ;; |
|
-host | --host | --hos | --ho) |
ac_prev=host ;; |
-host=* | --host=* | --hos=* | --ho=*) |
host="$ac_optarg" ;; |
|
-includedir | --includedir | --includedi | --included | --include \ |
| --includ | --inclu | --incl | --inc) |
ac_prev=includedir ;; |
-includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ |
| --includ=* | --inclu=* | --incl=* | --inc=*) |
includedir="$ac_optarg" ;; |
|
-infodir | --infodir | --infodi | --infod | --info | --inf) |
ac_prev=infodir ;; |
-infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) |
infodir="$ac_optarg" ;; |
|
-libdir | --libdir | --libdi | --libd) |
ac_prev=libdir ;; |
-libdir=* | --libdir=* | --libdi=* | --libd=*) |
libdir="$ac_optarg" ;; |
|
-libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ |
| --libexe | --libex | --libe) |
ac_prev=libexecdir ;; |
-libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ |
| --libexe=* | --libex=* | --libe=*) |
libexecdir="$ac_optarg" ;; |
|
-localstatedir | --localstatedir | --localstatedi | --localstated \ |
| --localstate | --localstat | --localsta | --localst \ |
| --locals | --local | --loca | --loc | --lo) |
ac_prev=localstatedir ;; |
-localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ |
| --localstate=* | --localstat=* | --localsta=* | --localst=* \ |
| --locals=* | --local=* | --loca=* | --loc=* | --lo=*) |
localstatedir="$ac_optarg" ;; |
|
-mandir | --mandir | --mandi | --mand | --man | --ma | --m) |
ac_prev=mandir ;; |
-mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) |
mandir="$ac_optarg" ;; |
|
-nfp | --nfp | --nf) |
# Obsolete; use --without-fp. |
with_fp=no ;; |
|
-no-create | --no-create | --no-creat | --no-crea | --no-cre \ |
| --no-cr | --no-c) |
no_create=yes ;; |
|
-no-recursion | --no-recursion | --no-recursio | --no-recursi \ |
| --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) |
no_recursion=yes ;; |
|
-oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ |
| --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ |
| --oldin | --oldi | --old | --ol | --o) |
ac_prev=oldincludedir ;; |
-oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ |
| --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ |
| --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) |
oldincludedir="$ac_optarg" ;; |
|
-prefix | --prefix | --prefi | --pref | --pre | --pr | --p) |
ac_prev=prefix ;; |
-prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) |
prefix="$ac_optarg" ;; |
|
-program-prefix | --program-prefix | --program-prefi | --program-pref \ |
| --program-pre | --program-pr | --program-p) |
ac_prev=program_prefix ;; |
-program-prefix=* | --program-prefix=* | --program-prefi=* \ |
| --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) |
program_prefix="$ac_optarg" ;; |
|
-program-suffix | --program-suffix | --program-suffi | --program-suff \ |
| --program-suf | --program-su | --program-s) |
ac_prev=program_suffix ;; |
-program-suffix=* | --program-suffix=* | --program-suffi=* \ |
| --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) |
program_suffix="$ac_optarg" ;; |
|
-program-transform-name | --program-transform-name \ |
| --program-transform-nam | --program-transform-na \ |
| --program-transform-n | --program-transform- \ |
| --program-transform | --program-transfor \ |
| --program-transfo | --program-transf \ |
| --program-trans | --program-tran \ |
| --progr-tra | --program-tr | --program-t) |
ac_prev=program_transform_name ;; |
-program-transform-name=* | --program-transform-name=* \ |
| --program-transform-nam=* | --program-transform-na=* \ |
| --program-transform-n=* | --program-transform-=* \ |
| --program-transform=* | --program-transfor=* \ |
| --program-transfo=* | --program-transf=* \ |
| --program-trans=* | --program-tran=* \ |
| --progr-tra=* | --program-tr=* | --program-t=*) |
program_transform_name="$ac_optarg" ;; |
|
-q | -quiet | --quiet | --quie | --qui | --qu | --q \ |
| -silent | --silent | --silen | --sile | --sil) |
silent=yes ;; |
|
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) |
ac_prev=sbindir ;; |
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ |
| --sbi=* | --sb=*) |
sbindir="$ac_optarg" ;; |
|
-sharedstatedir | --sharedstatedir | --sharedstatedi \ |
| --sharedstated | --sharedstate | --sharedstat | --sharedsta \ |
| --sharedst | --shareds | --shared | --share | --shar \ |
| --sha | --sh) |
ac_prev=sharedstatedir ;; |
-sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ |
| --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ |
| --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ |
| --sha=* | --sh=*) |
sharedstatedir="$ac_optarg" ;; |
|
-site | --site | --sit) |
ac_prev=site ;; |
-site=* | --site=* | --sit=*) |
site="$ac_optarg" ;; |
|
-site-file | --site-file | --site-fil | --site-fi | --site-f) |
ac_prev=sitefile ;; |
-site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*) |
sitefile="$ac_optarg" ;; |
|
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr) |
ac_prev=srcdir ;; |
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) |
srcdir="$ac_optarg" ;; |
|
-sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ |
| --syscon | --sysco | --sysc | --sys | --sy) |
ac_prev=sysconfdir ;; |
-sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ |
| --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) |
sysconfdir="$ac_optarg" ;; |
|
-target | --target | --targe | --targ | --tar | --ta | --t) |
ac_prev=target ;; |
-target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) |
target="$ac_optarg" ;; |
|
-v | -verbose | --verbose | --verbos | --verbo | --verb) |
verbose=yes ;; |
|
-version | --version | --versio | --versi | --vers) |
echo "configure generated by autoconf version 2.13" |
exit 0 ;; |
|
-with-* | --with-*) |
ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` |
# Reject names that are not valid shell variable names. |
if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then |
{ echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } |
fi |
ac_package=`echo $ac_package| sed 's/-/_/g'` |
case "$ac_option" in |
*=*) ;; |
*) ac_optarg=yes ;; |
esac |
eval "with_${ac_package}='$ac_optarg'" ;; |
|
-without-* | --without-*) |
ac_package=`echo $ac_option|sed -e 's/-*without-//'` |
# Reject names that are not valid shell variable names. |
if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then |
{ echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } |
fi |
ac_package=`echo $ac_package| sed 's/-/_/g'` |
eval "with_${ac_package}=no" ;; |
|
--x) |
# Obsolete; use --with-x. |
with_x=yes ;; |
|
-x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ |
| --x-incl | --x-inc | --x-in | --x-i) |
ac_prev=x_includes ;; |
-x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ |
| --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) |
x_includes="$ac_optarg" ;; |
|
-x-libraries | --x-libraries | --x-librarie | --x-librari \ |
| --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) |
ac_prev=x_libraries ;; |
-x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ |
| --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) |
x_libraries="$ac_optarg" ;; |
|
-*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } |
;; |
|
*) |
if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then |
echo "configure: warning: $ac_option: invalid host type" 1>&2 |
fi |
if test "x$nonopt" != xNONE; then |
{ echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } |
fi |
nonopt="$ac_option" |
;; |
|
esac |
done |
|
if test -n "$ac_prev"; then |
{ echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } |
fi |
|
trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 |
|
# File descriptor usage: |
# 0 standard input |
# 1 file creation |
# 2 errors and warnings |
# 3 some systems may open it to /dev/tty |
# 4 used on the Kubota Titan |
# 6 checking for... messages and results |
# 5 compiler messages saved in config.log |
if test "$silent" = yes; then |
exec 6>/dev/null |
else |
exec 6>&1 |
fi |
exec 5>./config.log |
|
echo "\ |
This file contains any messages produced by compilers while |
running configure, to aid debugging if configure makes a mistake. |
" 1>&5 |
|
# Strip out --no-create and --no-recursion so they do not pile up. |
# Also quote any args containing shell metacharacters. |
ac_configure_args= |
for ac_arg |
do |
case "$ac_arg" in |
-no-create | --no-create | --no-creat | --no-crea | --no-cre \ |
| --no-cr | --no-c) ;; |
-no-recursion | --no-recursion | --no-recursio | --no-recursi \ |
| --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; |
*" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) |
ac_configure_args="$ac_configure_args '$ac_arg'" ;; |
*) ac_configure_args="$ac_configure_args $ac_arg" ;; |
esac |
done |
|
# NLS nuisances. |
# Only set these to C if already set. These must not be set unconditionally |
# because not all systems understand e.g. LANG=C (notably SCO). |
# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! |
# Non-C LC_CTYPE values break the ctype check. |
if test "${LANG+set}" = set; then LANG=C; export LANG; fi |
if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi |
if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi |
if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi |
|
# confdefs.h avoids OS command line length limits that DEFS can exceed. |
rm -rf conftest* confdefs.h |
# AIX cpp loses on an empty file, so make sure it contains at least a newline. |
echo > confdefs.h |
|
# A filename unique to this package, relative to the directory that |
# configure is in, which we can look for to find out if srcdir is correct. |
ac_unique_file=mmalloc.c |
|
# Find the source files, if location was not specified. |
if test -z "$srcdir"; then |
ac_srcdir_defaulted=yes |
# Try the directory containing this script, then its parent. |
ac_prog=$0 |
ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` |
test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. |
srcdir=$ac_confdir |
if test ! -r $srcdir/$ac_unique_file; then |
srcdir=.. |
fi |
else |
ac_srcdir_defaulted=no |
fi |
if test ! -r $srcdir/$ac_unique_file; then |
if test "$ac_srcdir_defaulted" = yes; then |
{ echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } |
else |
{ echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } |
fi |
fi |
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` |
|
# Prefer explicitly selected file to automatically selected ones. |
if test -z "$sitefile"; then |
if test -z "$CONFIG_SITE"; then |
if test "x$prefix" != xNONE; then |
CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" |
else |
CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" |
fi |
fi |
else |
CONFIG_SITE="$sitefile" |
fi |
for ac_site_file in $CONFIG_SITE; do |
if test -r "$ac_site_file"; then |
echo "loading site script $ac_site_file" |
. "$ac_site_file" |
fi |
done |
|
if test -r "$cache_file"; then |
echo "loading cache $cache_file" |
. $cache_file |
else |
echo "creating cache $cache_file" |
> $cache_file |
fi |
|
ac_ext=c |
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. |
ac_cpp='$CPP $CPPFLAGS' |
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' |
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' |
cross_compiling=$ac_cv_prog_cc_cross |
|
ac_exeext= |
ac_objext=o |
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then |
# Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. |
if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then |
ac_n= ac_c=' |
' ac_t=' ' |
else |
ac_n=-n ac_c= ac_t= |
fi |
else |
ac_n= ac_c='\c' ac_t= |
fi |
|
|
|
# Extract the first word of "gcc", so it can be a program name with args. |
set dummy gcc; ac_word=$2 |
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 |
echo "configure:540: checking for $ac_word" >&5 |
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
if test -n "$CC"; then |
ac_cv_prog_CC="$CC" # Let the user override the test. |
else |
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" |
ac_dummy="$PATH" |
for ac_dir in $ac_dummy; do |
test -z "$ac_dir" && ac_dir=. |
if test -f $ac_dir/$ac_word; then |
ac_cv_prog_CC="gcc" |
break |
fi |
done |
IFS="$ac_save_ifs" |
fi |
fi |
CC="$ac_cv_prog_CC" |
if test -n "$CC"; then |
echo "$ac_t""$CC" 1>&6 |
else |
echo "$ac_t""no" 1>&6 |
fi |
|
if test -z "$CC"; then |
# Extract the first word of "cc", so it can be a program name with args. |
set dummy cc; ac_word=$2 |
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 |
echo "configure:570: checking for $ac_word" >&5 |
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
if test -n "$CC"; then |
ac_cv_prog_CC="$CC" # Let the user override the test. |
else |
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" |
ac_prog_rejected=no |
ac_dummy="$PATH" |
for ac_dir in $ac_dummy; do |
test -z "$ac_dir" && ac_dir=. |
if test -f $ac_dir/$ac_word; then |
if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then |
ac_prog_rejected=yes |
continue |
fi |
ac_cv_prog_CC="cc" |
break |
fi |
done |
IFS="$ac_save_ifs" |
if test $ac_prog_rejected = yes; then |
# We found a bogon in the path, so make sure we never use it. |
set dummy $ac_cv_prog_CC |
shift |
if test $# -gt 0; then |
# We chose a different compiler from the bogus one. |
# However, it has the same basename, so the bogon will be chosen |
# first if we set CC to just the basename; use the full file name. |
shift |
set dummy "$ac_dir/$ac_word" "$@" |
shift |
ac_cv_prog_CC="$@" |
fi |
fi |
fi |
fi |
CC="$ac_cv_prog_CC" |
if test -n "$CC"; then |
echo "$ac_t""$CC" 1>&6 |
else |
echo "$ac_t""no" 1>&6 |
fi |
|
if test -z "$CC"; then |
case "`uname -s`" in |
*win32* | *WIN32*) |
# Extract the first word of "cl", so it can be a program name with args. |
set dummy cl; ac_word=$2 |
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 |
echo "configure:621: checking for $ac_word" >&5 |
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
if test -n "$CC"; then |
ac_cv_prog_CC="$CC" # Let the user override the test. |
else |
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" |
ac_dummy="$PATH" |
for ac_dir in $ac_dummy; do |
test -z "$ac_dir" && ac_dir=. |
if test -f $ac_dir/$ac_word; then |
ac_cv_prog_CC="cl" |
break |
fi |
done |
IFS="$ac_save_ifs" |
fi |
fi |
CC="$ac_cv_prog_CC" |
if test -n "$CC"; then |
echo "$ac_t""$CC" 1>&6 |
else |
echo "$ac_t""no" 1>&6 |
fi |
;; |
esac |
fi |
test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } |
fi |
|
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 |
echo "configure:653: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 |
|
ac_ext=c |
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. |
ac_cpp='$CPP $CPPFLAGS' |
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' |
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' |
cross_compiling=$ac_cv_prog_cc_cross |
|
cat > conftest.$ac_ext << EOF |
|
#line 664 "configure" |
#include "confdefs.h" |
|
main(){return(0);} |
EOF |
if { (eval echo configure:669: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then |
ac_cv_prog_cc_works=yes |
# If we can't run a trivial program, we are probably using a cross compiler. |
if (./conftest; exit) 2>/dev/null; then |
ac_cv_prog_cc_cross=no |
else |
ac_cv_prog_cc_cross=yes |
fi |
else |
echo "configure: failed program was:" >&5 |
cat conftest.$ac_ext >&5 |
ac_cv_prog_cc_works=no |
fi |
rm -fr conftest* |
ac_ext=c |
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. |
ac_cpp='$CPP $CPPFLAGS' |
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' |
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' |
cross_compiling=$ac_cv_prog_cc_cross |
|
echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 |
if test $ac_cv_prog_cc_works = no; then |
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } |
fi |
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 |
echo "configure:695: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 |
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 |
cross_compiling=$ac_cv_prog_cc_cross |
|
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 |
echo "configure:700: checking whether we are using GNU C" >&5 |
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
cat > conftest.c <<EOF |
#ifdef __GNUC__ |
yes; |
#endif |
EOF |
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:709: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then |
ac_cv_prog_gcc=yes |
else |
ac_cv_prog_gcc=no |
fi |
fi |
|
echo "$ac_t""$ac_cv_prog_gcc" 1>&6 |
|
if test $ac_cv_prog_gcc = yes; then |
GCC=yes |
else |
GCC= |
fi |
|
ac_test_CFLAGS="${CFLAGS+set}" |
ac_save_CFLAGS="$CFLAGS" |
CFLAGS= |
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 |
echo "configure:728: checking whether ${CC-cc} accepts -g" >&5 |
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
echo 'void f(){}' > conftest.c |
if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then |
ac_cv_prog_cc_g=yes |
else |
ac_cv_prog_cc_g=no |
fi |
rm -f conftest* |
|
fi |
|
echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 |
if test "$ac_test_CFLAGS" = set; then |
CFLAGS="$ac_save_CFLAGS" |
elif test $ac_cv_prog_cc_g = yes; then |
if test "$GCC" = yes; then |
CFLAGS="-g -O2" |
else |
CFLAGS="-g" |
fi |
else |
if test "$GCC" = yes; then |
CFLAGS="-O2" |
else |
CFLAGS= |
fi |
fi |
|
ac_aux_dir= |
for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do |
if test -f $ac_dir/install-sh; then |
ac_aux_dir=$ac_dir |
ac_install_sh="$ac_aux_dir/install-sh -c" |
break |
elif test -f $ac_dir/install.sh; then |
ac_aux_dir=$ac_dir |
ac_install_sh="$ac_aux_dir/install.sh -c" |
break |
fi |
done |
if test -z "$ac_aux_dir"; then |
{ echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } |
fi |
ac_config_guess=$ac_aux_dir/config.guess |
ac_config_sub=$ac_aux_dir/config.sub |
ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. |
|
# Find a good install program. We prefer a C program (faster), |
# so one script is as good as another. But avoid the broken or |
# incompatible versions: |
# SysV /etc/install, /usr/sbin/install |
# SunOS /usr/etc/install |
# IRIX /sbin/install |
# AIX /bin/install |
# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag |
# AFS /usr/afsws/bin/install, which mishandles nonexistent args |
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" |
# ./install, which can be erroneously created by make from ./install.sh. |
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 |
echo "configure:790: checking for a BSD compatible install" >&5 |
if test -z "$INSTALL"; then |
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" |
for ac_dir in $PATH; do |
# Account for people who put trailing slashes in PATH elements. |
case "$ac_dir/" in |
/|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; |
*) |
# OSF1 and SCO ODT 3.0 have their own names for install. |
# Don't use installbsd from OSF since it installs stuff as root |
# by default. |
for ac_prog in ginstall scoinst install; do |
if test -f $ac_dir/$ac_prog; then |
if test $ac_prog = install && |
grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then |
# AIX install. It has an incompatible calling convention. |
: |
else |
ac_cv_path_install="$ac_dir/$ac_prog -c" |
break 2 |
fi |
fi |
done |
;; |
esac |
done |
IFS="$ac_save_IFS" |
|
fi |
if test "${ac_cv_path_install+set}" = set; then |
INSTALL="$ac_cv_path_install" |
else |
# As a last resort, use the slow shell script. We don't cache a |
# path for INSTALL within a source directory, because that will |
# break other packages using the cache if that directory is |
# removed, or if the path is relative. |
INSTALL="$ac_install_sh" |
fi |
fi |
echo "$ac_t""$INSTALL" 1>&6 |
|
# Use test -z because SunOS4 sh mishandles braces in ${var-val}. |
# It thinks the first close brace ends the variable substitution. |
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' |
|
test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' |
|
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' |
|
|
# Make sure we can run config.sub. |
if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : |
else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } |
fi |
|
echo $ac_n "checking host system type""... $ac_c" 1>&6 |
echo "configure:849: checking host system type" >&5 |
|
host_alias=$host |
case "$host_alias" in |
NONE) |
case $nonopt in |
NONE) |
if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : |
else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } |
fi ;; |
*) host_alias=$nonopt ;; |
esac ;; |
esac |
|
host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` |
host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` |
host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` |
host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` |
echo "$ac_t""$host" 1>&6 |
|
echo $ac_n "checking build system type""... $ac_c" 1>&6 |
echo "configure:870: checking build system type" >&5 |
|
build_alias=$build |
case "$build_alias" in |
NONE) |
case $nonopt in |
NONE) build_alias=$host_alias ;; |
*) build_alias=$nonopt ;; |
esac ;; |
esac |
|
build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias` |
build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` |
build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` |
build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` |
echo "$ac_t""$build" 1>&6 |
|
if test $host != $build; then |
ac_tool_prefix=${host_alias}- |
else |
ac_tool_prefix= |
fi |
|
# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. |
set dummy ${ac_tool_prefix}ar; ac_word=$2 |
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 |
echo "configure:896: checking for $ac_word" >&5 |
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
if test -n "$AR"; then |
ac_cv_prog_AR="$AR" # Let the user override the test. |
else |
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" |
ac_dummy="$PATH" |
for ac_dir in $ac_dummy; do |
test -z "$ac_dir" && ac_dir=. |
if test -f $ac_dir/$ac_word; then |
ac_cv_prog_AR="${ac_tool_prefix}ar" |
break |
fi |
done |
IFS="$ac_save_ifs" |
test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar" |
fi |
fi |
AR="$ac_cv_prog_AR" |
if test -n "$AR"; then |
echo "$ac_t""$AR" 1>&6 |
else |
echo "$ac_t""no" 1>&6 |
fi |
|
|
|
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. |
set dummy ${ac_tool_prefix}ranlib; ac_word=$2 |
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 |
echo "configure:928: checking for $ac_word" >&5 |
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
if test -n "$RANLIB"; then |
ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. |
else |
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" |
ac_dummy="$PATH" |
for ac_dir in $ac_dummy; do |
test -z "$ac_dir" && ac_dir=. |
if test -f $ac_dir/$ac_word; then |
ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" |
break |
fi |
done |
IFS="$ac_save_ifs" |
fi |
fi |
RANLIB="$ac_cv_prog_RANLIB" |
if test -n "$RANLIB"; then |
echo "$ac_t""$RANLIB" 1>&6 |
else |
echo "$ac_t""no" 1>&6 |
fi |
|
|
if test -z "$ac_cv_prog_RANLIB"; then |
if test -n "$ac_tool_prefix"; then |
# Extract the first word of "ranlib", so it can be a program name with args. |
set dummy ranlib; ac_word=$2 |
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 |
echo "configure:960: checking for $ac_word" >&5 |
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
if test -n "$RANLIB"; then |
ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. |
else |
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" |
ac_dummy="$PATH" |
for ac_dir in $ac_dummy; do |
test -z "$ac_dir" && ac_dir=. |
if test -f $ac_dir/$ac_word; then |
ac_cv_prog_RANLIB="ranlib" |
break |
fi |
done |
IFS="$ac_save_ifs" |
test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" |
fi |
fi |
RANLIB="$ac_cv_prog_RANLIB" |
if test -n "$RANLIB"; then |
echo "$ac_t""$RANLIB" 1>&6 |
else |
echo "$ac_t""no" 1>&6 |
fi |
|
else |
RANLIB=":" |
fi |
fi |
|
|
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 |
echo "configure:994: checking how to run the C preprocessor" >&5 |
# On Suns, sometimes $CPP names a directory. |
if test -n "$CPP" && test -d "$CPP"; then |
CPP= |
fi |
if test -z "$CPP"; then |
if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
# This must be in double quotes, not single quotes, because CPP may get |
# substituted into the Makefile and "${CC-cc}" will confuse make. |
CPP="${CC-cc} -E" |
# On the NeXT, cc -E runs the code through the compiler's parser, |
# not just through cpp. |
cat > conftest.$ac_ext <<EOF |
#line 1009 "configure" |
#include "confdefs.h" |
#include <assert.h> |
Syntax Error |
EOF |
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" |
{ (eval echo configure:1015: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } |
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` |
if test -z "$ac_err"; then |
: |
else |
echo "$ac_err" >&5 |
echo "configure: failed program was:" >&5 |
cat conftest.$ac_ext >&5 |
rm -rf conftest* |
CPP="${CC-cc} -E -traditional-cpp" |
cat > conftest.$ac_ext <<EOF |
#line 1026 "configure" |
#include "confdefs.h" |
#include <assert.h> |
Syntax Error |
EOF |
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" |
{ (eval echo configure:1032: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } |
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` |
if test -z "$ac_err"; then |
: |
else |
echo "$ac_err" >&5 |
echo "configure: failed program was:" >&5 |
cat conftest.$ac_ext >&5 |
rm -rf conftest* |
CPP="${CC-cc} -nologo -E" |
cat > conftest.$ac_ext <<EOF |
#line 1043 "configure" |
#include "confdefs.h" |
#include <assert.h> |
Syntax Error |
EOF |
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" |
{ (eval echo configure:1049: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } |
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` |
if test -z "$ac_err"; then |
: |
else |
echo "$ac_err" >&5 |
echo "configure: failed program was:" >&5 |
cat conftest.$ac_ext >&5 |
rm -rf conftest* |
CPP=/lib/cpp |
fi |
rm -f conftest* |
fi |
rm -f conftest* |
fi |
rm -f conftest* |
ac_cv_prog_CPP="$CPP" |
fi |
CPP="$ac_cv_prog_CPP" |
else |
ac_cv_prog_CPP="$CPP" |
fi |
echo "$ac_t""$CPP" 1>&6 |
|
for ac_hdr in unistd.h |
do |
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` |
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 |
echo "configure:1077: checking for $ac_hdr" >&5 |
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
cat > conftest.$ac_ext <<EOF |
#line 1082 "configure" |
#include "confdefs.h" |
#include <$ac_hdr> |
EOF |
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" |
{ (eval echo configure:1087: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } |
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` |
if test -z "$ac_err"; then |
rm -rf conftest* |
eval "ac_cv_header_$ac_safe=yes" |
else |
echo "$ac_err" >&5 |
echo "configure: failed program was:" >&5 |
cat conftest.$ac_ext >&5 |
rm -rf conftest* |
eval "ac_cv_header_$ac_safe=no" |
fi |
rm -f conftest* |
fi |
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then |
echo "$ac_t""yes" 1>&6 |
ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` |
cat >> confdefs.h <<EOF |
#define $ac_tr_hdr 1 |
EOF |
|
else |
echo "$ac_t""no" 1>&6 |
fi |
done |
|
for ac_func in getpagesize |
do |
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 |
echo "configure:1116: checking for $ac_func" >&5 |
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
cat > conftest.$ac_ext <<EOF |
#line 1121 "configure" |
#include "confdefs.h" |
/* System header to define __stub macros and hopefully few prototypes, |
which can conflict with char $ac_func(); below. */ |
#include <assert.h> |
/* Override any gcc2 internal prototype to avoid an error. */ |
/* We use char because int might match the return type of a gcc2 |
builtin and then its argument prototype would still apply. */ |
char $ac_func(); |
|
int main() { |
|
/* The GNU C library defines this for functions which it implements |
to always fail with ENOSYS. Some functions are actually named |
something starting with __ and the normal name is an alias. */ |
#if defined (__stub_$ac_func) || defined (__stub___$ac_func) |
choke me |
#else |
$ac_func(); |
#endif |
|
; return 0; } |
EOF |
if { (eval echo configure:1144: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then |
rm -rf conftest* |
eval "ac_cv_func_$ac_func=yes" |
else |
echo "configure: failed program was:" >&5 |
cat conftest.$ac_ext >&5 |
rm -rf conftest* |
eval "ac_cv_func_$ac_func=no" |
fi |
rm -f conftest* |
fi |
|
if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then |
echo "$ac_t""yes" 1>&6 |
ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` |
cat >> confdefs.h <<EOF |
#define $ac_tr_func 1 |
EOF |
|
else |
echo "$ac_t""no" 1>&6 |
fi |
done |
|
echo $ac_n "checking for working mmap""... $ac_c" 1>&6 |
echo "configure:1169: checking for working mmap" >&5 |
if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
if test "$cross_compiling" = yes; then |
ac_cv_func_mmap_fixed_mapped=no |
else |
cat > conftest.$ac_ext <<EOF |
#line 1177 "configure" |
#include "confdefs.h" |
|
/* Thanks to Mike Haertel and Jim Avera for this test. |
Here is a matrix of mmap possibilities: |
mmap private not fixed |
mmap private fixed at somewhere currently unmapped |
mmap private fixed at somewhere already mapped |
mmap shared not fixed |
mmap shared fixed at somewhere currently unmapped |
mmap shared fixed at somewhere already mapped |
For private mappings, we should verify that changes cannot be read() |
back from the file, nor mmap's back from the file at a different |
address. (There have been systems where private was not correctly |
implemented like the infamous i386 svr4.0, and systems where the |
VM page cache was not coherent with the filesystem buffer cache |
like early versions of FreeBSD and possibly contemporary NetBSD.) |
For shared mappings, we should conversely verify that changes get |
propogated back to all the places they're supposed to be. |
|
Grep wants private fixed already mapped. |
The main things grep needs to know about mmap are: |
* does it exist and is it safe to write into the mmap'd area |
* how to use it (BSD variants) */ |
#include <sys/types.h> |
#include <fcntl.h> |
#include <sys/mman.h> |
|
/* This mess was copied from the GNU getpagesize.h. */ |
#ifndef HAVE_GETPAGESIZE |
# ifdef HAVE_UNISTD_H |
# include <unistd.h> |
# endif |
|
/* Assume that all systems that can run configure have sys/param.h. */ |
# ifndef HAVE_SYS_PARAM_H |
# define HAVE_SYS_PARAM_H 1 |
# endif |
|
# ifdef _SC_PAGESIZE |
# define getpagesize() sysconf(_SC_PAGESIZE) |
# else /* no _SC_PAGESIZE */ |
# ifdef HAVE_SYS_PARAM_H |
# include <sys/param.h> |
# ifdef EXEC_PAGESIZE |
# define getpagesize() EXEC_PAGESIZE |
# else /* no EXEC_PAGESIZE */ |
# ifdef NBPG |
# define getpagesize() NBPG * CLSIZE |
# ifndef CLSIZE |
# define CLSIZE 1 |
# endif /* no CLSIZE */ |
# else /* no NBPG */ |
# ifdef NBPC |
# define getpagesize() NBPC |
# else /* no NBPC */ |
# ifdef PAGESIZE |
# define getpagesize() PAGESIZE |
# endif /* PAGESIZE */ |
# endif /* no NBPC */ |
# endif /* no NBPG */ |
# endif /* no EXEC_PAGESIZE */ |
# else /* no HAVE_SYS_PARAM_H */ |
# define getpagesize() 8192 /* punt totally */ |
# endif /* no HAVE_SYS_PARAM_H */ |
# endif /* no _SC_PAGESIZE */ |
|
#endif /* no HAVE_GETPAGESIZE */ |
|
#ifdef __cplusplus |
extern "C" { void *malloc(unsigned); } |
#else |
char *malloc(); |
#endif |
|
int |
main() |
{ |
char *data, *data2, *data3; |
int i, pagesize; |
int fd; |
|
pagesize = getpagesize(); |
|
/* |
* First, make a file with some known garbage in it. |
*/ |
data = malloc(pagesize); |
if (!data) |
exit(1); |
for (i = 0; i < pagesize; ++i) |
*(data + i) = rand(); |
umask(0); |
fd = creat("conftestmmap", 0600); |
if (fd < 0) |
exit(1); |
if (write(fd, data, pagesize) != pagesize) |
exit(1); |
close(fd); |
|
/* |
* Next, try to mmap the file at a fixed address which |
* already has something else allocated at it. If we can, |
* also make sure that we see the same garbage. |
*/ |
fd = open("conftestmmap", O_RDWR); |
if (fd < 0) |
exit(1); |
data2 = malloc(2 * pagesize); |
if (!data2) |
exit(1); |
data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1); |
if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE, |
MAP_PRIVATE | MAP_FIXED, fd, 0L)) |
exit(1); |
for (i = 0; i < pagesize; ++i) |
if (*(data + i) != *(data2 + i)) |
exit(1); |
|
/* |
* Finally, make sure that changes to the mapped area |
* do not percolate back to the file as seen by read(). |
* (This is a bug on some variants of i386 svr4.0.) |
*/ |
for (i = 0; i < pagesize; ++i) |
*(data2 + i) = *(data2 + i) + 1; |
data3 = malloc(pagesize); |
if (!data3) |
exit(1); |
if (read(fd, data3, pagesize) != pagesize) |
exit(1); |
for (i = 0; i < pagesize; ++i) |
if (*(data + i) != *(data3 + i)) |
exit(1); |
close(fd); |
unlink("conftestmmap"); |
exit(0); |
} |
|
EOF |
if { (eval echo configure:1317: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null |
then |
ac_cv_func_mmap_fixed_mapped=yes |
else |
echo "configure: failed program was:" >&5 |
cat conftest.$ac_ext >&5 |
rm -fr conftest* |
ac_cv_func_mmap_fixed_mapped=no |
fi |
rm -fr conftest* |
fi |
|
fi |
|
echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6 |
if test $ac_cv_func_mmap_fixed_mapped = yes; then |
cat >> confdefs.h <<\EOF |
#define HAVE_MMAP 1 |
EOF |
|
fi |
|
for ac_hdr in limits.h stddef.h unistd.h |
do |
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` |
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 |
echo "configure:1343: checking for $ac_hdr" >&5 |
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
cat > conftest.$ac_ext <<EOF |
#line 1348 "configure" |
#include "confdefs.h" |
#include <$ac_hdr> |
EOF |
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" |
{ (eval echo configure:1353: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } |
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` |
if test -z "$ac_err"; then |
rm -rf conftest* |
eval "ac_cv_header_$ac_safe=yes" |
else |
echo "$ac_err" >&5 |
echo "configure: failed program was:" >&5 |
cat conftest.$ac_ext >&5 |
rm -rf conftest* |
eval "ac_cv_header_$ac_safe=no" |
fi |
rm -f conftest* |
fi |
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then |
echo "$ac_t""yes" 1>&6 |
ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` |
cat >> confdefs.h <<EOF |
#define $ac_tr_hdr 1 |
EOF |
|
else |
echo "$ac_t""no" 1>&6 |
fi |
done |
|
|
echo $ac_n "checking whether sbrk must be declared""... $ac_c" 1>&6 |
echo "configure:1381: checking whether sbrk must be declared" >&5 |
if eval "test \"`echo '$''{'bfd_cv_decl_needed_sbrk'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
cat > conftest.$ac_ext <<EOF |
#line 1386 "configure" |
#include "confdefs.h" |
|
#include <stdio.h> |
#ifdef HAVE_STRING_H |
#include <string.h> |
#else |
#ifdef HAVE_STRINGS_H |
#include <strings.h> |
#endif |
#endif |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_UNISTD_H |
#include <unistd.h> |
#endif |
int main() { |
char *(*pfn) = (char *(*)) sbrk |
; return 0; } |
EOF |
if { (eval echo configure:1407: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then |
rm -rf conftest* |
bfd_cv_decl_needed_sbrk=no |
else |
echo "configure: failed program was:" >&5 |
cat conftest.$ac_ext >&5 |
rm -rf conftest* |
bfd_cv_decl_needed_sbrk=yes |
fi |
rm -f conftest* |
fi |
|
echo "$ac_t""$bfd_cv_decl_needed_sbrk" 1>&6 |
if test $bfd_cv_decl_needed_sbrk = yes; then |
cat >> confdefs.h <<\EOF |
#define NEED_DECLARATION_SBRK 1 |
EOF |
|
fi |
|
echo $ac_n "checking whether getpagesize must be declared""... $ac_c" 1>&6 |
echo "configure:1428: checking whether getpagesize must be declared" >&5 |
if eval "test \"`echo '$''{'bfd_cv_decl_needed_getpagesize'+set}'`\" = set"; then |
echo $ac_n "(cached) $ac_c" 1>&6 |
else |
cat > conftest.$ac_ext <<EOF |
#line 1433 "configure" |
#include "confdefs.h" |
|
#include <stdio.h> |
#ifdef HAVE_STRING_H |
#include <string.h> |
#else |
#ifdef HAVE_STRINGS_H |
#include <strings.h> |
#endif |
#endif |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_UNISTD_H |
#include <unistd.h> |
#endif |
int main() { |
char *(*pfn) = (char *(*)) getpagesize |
; return 0; } |
EOF |
if { (eval echo configure:1454: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then |
rm -rf conftest* |
bfd_cv_decl_needed_getpagesize=no |
else |
echo "configure: failed program was:" >&5 |
cat conftest.$ac_ext >&5 |
rm -rf conftest* |
bfd_cv_decl_needed_getpagesize=yes |
fi |
rm -f conftest* |
fi |
|
echo "$ac_t""$bfd_cv_decl_needed_getpagesize" 1>&6 |
if test $bfd_cv_decl_needed_getpagesize = yes; then |
cat >> confdefs.h <<\EOF |
#define NEED_DECLARATION_GETPAGESIZE 1 |
EOF |
|
fi |
|
|
trap '' 1 2 15 |
cat > confcache <<\EOF |
# This file is a shell script that caches the results of configure |
# tests run on this system so they can be shared between configure |
# scripts and configure runs. It is not useful on other systems. |
# If it contains results you don't want to keep, you may remove or edit it. |
# |
# By default, configure uses ./config.cache as the cache file, |
# creating it if it does not exist already. You can give configure |
# the --cache-file=FILE option to use a different cache file; that is |
# what configure does when it calls configure scripts in |
# subdirectories, so they share the cache. |
# Giving --cache-file=/dev/null disables caching, for debugging configure. |
# config.status only pays attention to the cache file if you give it the |
# --recheck option to rerun configure. |
# |
EOF |
# The following way of writing the cache mishandles newlines in values, |
# but we know of no workaround that is simple, portable, and efficient. |
# So, don't put newlines in cache variables' values. |
# Ultrix sh set writes to stderr and can't be redirected directly, |
# and sets the high bit in the cache file unless we assign to the vars. |
(set) 2>&1 | |
case `(ac_space=' '; set | grep ac_space) 2>&1` in |
*ac_space=\ *) |
# `set' does not quote correctly, so add quotes (double-quote substitution |
# turns \\\\ into \\, and sed turns \\ into \). |
sed -n \ |
-e "s/'/'\\\\''/g" \ |
-e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" |
;; |
*) |
# `set' quotes correctly as required by POSIX, so do not add quotes. |
sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' |
;; |
esac >> confcache |
if cmp -s $cache_file confcache; then |
: |
else |
if test -w $cache_file; then |
echo "updating cache $cache_file" |
cat confcache > $cache_file |
else |
echo "not updating unwritable cache $cache_file" |
fi |
fi |
rm -f confcache |
|
trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 |
|
test "x$prefix" = xNONE && prefix=$ac_default_prefix |
# Let make expand exec_prefix. |
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' |
|
# Any assignment to VPATH causes Sun make to only execute |
# the first set of double-colon rules, so remove it if not needed. |
# If there is a colon in the path, we need to keep it. |
if test "x$srcdir" = x.; then |
ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' |
fi |
|
trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 |
|
# Transform confdefs.h into DEFS. |
# Protect against shell expansion while executing Makefile rules. |
# Protect against Makefile macro expansion. |
cat > conftest.defs <<\EOF |
s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g |
s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g |
s%\[%\\&%g |
s%\]%\\&%g |
s%\$%$$%g |
EOF |
DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` |
rm -f conftest.defs |
|
|
# Without the "./", some shells look in PATH for config.status. |
: ${CONFIG_STATUS=./config.status} |
|
echo creating $CONFIG_STATUS |
rm -f $CONFIG_STATUS |
cat > $CONFIG_STATUS <<EOF |
#! /bin/sh |
# Generated automatically by configure. |
# Run this file to recreate the current configuration. |
# This directory was configured as follows, |
# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: |
# |
# $0 $ac_configure_args |
# |
# Compiler output produced by configure, useful for debugging |
# configure, is in ./config.log if it exists. |
|
ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" |
for ac_option |
do |
case "\$ac_option" in |
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) |
echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" |
exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; |
-version | --version | --versio | --versi | --vers | --ver | --ve | --v) |
echo "$CONFIG_STATUS generated by autoconf version 2.13" |
exit 0 ;; |
-help | --help | --hel | --he | --h) |
echo "\$ac_cs_usage"; exit 0 ;; |
*) echo "\$ac_cs_usage"; exit 1 ;; |
esac |
done |
|
ac_given_srcdir=$srcdir |
ac_given_INSTALL="$INSTALL" |
|
trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 |
EOF |
cat >> $CONFIG_STATUS <<EOF |
|
# Protect against being on the right side of a sed subst in config.status. |
sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; |
s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF |
$ac_vpsub |
$extrasub |
s%@SHELL@%$SHELL%g |
s%@CFLAGS@%$CFLAGS%g |
s%@CPPFLAGS@%$CPPFLAGS%g |
s%@CXXFLAGS@%$CXXFLAGS%g |
s%@FFLAGS@%$FFLAGS%g |
s%@DEFS@%$DEFS%g |
s%@LDFLAGS@%$LDFLAGS%g |
s%@LIBS@%$LIBS%g |
s%@exec_prefix@%$exec_prefix%g |
s%@prefix@%$prefix%g |
s%@program_transform_name@%$program_transform_name%g |
s%@bindir@%$bindir%g |
s%@sbindir@%$sbindir%g |
s%@libexecdir@%$libexecdir%g |
s%@datadir@%$datadir%g |
s%@sysconfdir@%$sysconfdir%g |
s%@sharedstatedir@%$sharedstatedir%g |
s%@localstatedir@%$localstatedir%g |
s%@libdir@%$libdir%g |
s%@includedir@%$includedir%g |
s%@oldincludedir@%$oldincludedir%g |
s%@infodir@%$infodir%g |
s%@mandir@%$mandir%g |
s%@CC@%$CC%g |
s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g |
s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g |
s%@INSTALL_DATA@%$INSTALL_DATA%g |
s%@host@%$host%g |
s%@host_alias@%$host_alias%g |
s%@host_cpu@%$host_cpu%g |
s%@host_vendor@%$host_vendor%g |
s%@host_os@%$host_os%g |
s%@build@%$build%g |
s%@build_alias@%$build_alias%g |
s%@build_cpu@%$build_cpu%g |
s%@build_vendor@%$build_vendor%g |
s%@build_os@%$build_os%g |
s%@AR@%$AR%g |
s%@RANLIB@%$RANLIB%g |
s%@CPP@%$CPP%g |
|
CEOF |
EOF |
|
cat >> $CONFIG_STATUS <<\EOF |
|
# Split the substitutions into bite-sized pieces for seds with |
# small command number limits, like on Digital OSF/1 and HP-UX. |
ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. |
ac_file=1 # Number of current file. |
ac_beg=1 # First line for current file. |
ac_end=$ac_max_sed_cmds # Line after last line for current file. |
ac_more_lines=: |
ac_sed_cmds="" |
while $ac_more_lines; do |
if test $ac_beg -gt 1; then |
sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file |
else |
sed "${ac_end}q" conftest.subs > conftest.s$ac_file |
fi |
if test ! -s conftest.s$ac_file; then |
ac_more_lines=false |
rm -f conftest.s$ac_file |
else |
if test -z "$ac_sed_cmds"; then |
ac_sed_cmds="sed -f conftest.s$ac_file" |
else |
ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" |
fi |
ac_file=`expr $ac_file + 1` |
ac_beg=$ac_end |
ac_end=`expr $ac_end + $ac_max_sed_cmds` |
fi |
done |
if test -z "$ac_sed_cmds"; then |
ac_sed_cmds=cat |
fi |
EOF |
|
cat >> $CONFIG_STATUS <<EOF |
|
CONFIG_FILES=\${CONFIG_FILES-"Makefile"} |
EOF |
cat >> $CONFIG_STATUS <<\EOF |
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then |
# Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". |
case "$ac_file" in |
*:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` |
ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; |
*) ac_file_in="${ac_file}.in" ;; |
esac |
|
# Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. |
|
# Remove last slash and all that follows it. Not all systems have dirname. |
ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` |
if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then |
# The file is in a subdirectory. |
test ! -d "$ac_dir" && mkdir "$ac_dir" |
ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" |
# A "../" for each directory in $ac_dir_suffix. |
ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` |
else |
ac_dir_suffix= ac_dots= |
fi |
|
case "$ac_given_srcdir" in |
.) srcdir=. |
if test -z "$ac_dots"; then top_srcdir=. |
else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; |
/*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; |
*) # Relative path. |
srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" |
top_srcdir="$ac_dots$ac_given_srcdir" ;; |
esac |
|
case "$ac_given_INSTALL" in |
[/$]*) INSTALL="$ac_given_INSTALL" ;; |
*) INSTALL="$ac_dots$ac_given_INSTALL" ;; |
esac |
|
echo creating "$ac_file" |
rm -f "$ac_file" |
configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." |
case "$ac_file" in |
*Makefile*) ac_comsub="1i\\ |
# $configure_input" ;; |
*) ac_comsub= ;; |
esac |
|
ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` |
sed -e "$ac_comsub |
s%@configure_input@%$configure_input%g |
s%@srcdir@%$srcdir%g |
s%@top_srcdir@%$top_srcdir%g |
s%@INSTALL@%$INSTALL%g |
" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file |
fi; done |
rm -f conftest.s* |
|
EOF |
cat >> $CONFIG_STATUS <<EOF |
|
EOF |
cat >> $CONFIG_STATUS <<\EOF |
|
exit 0 |
EOF |
chmod +x $CONFIG_STATUS |
rm -fr confdefs* $ac_clean_files |
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 |
|
configure
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: Makefile.in
===================================================================
--- Makefile.in (nonexistent)
+++ Makefile.in (revision 1765)
@@ -0,0 +1,245 @@
+# Copyright (C) 1992 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+
+# The GNU C Library 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
+# Library General Public License for more details.
+
+# You should have received a copy of the GNU Library General Public
+# License along with the GNU C Library; see the file COPYING.LIB. If
+# not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#
+# Makefile for mmalloc directory
+#
+
+# Directory containing source files. Don't clean up the spacing,
+# this exact string is matched for by the "configure" script.
+
+VPATH = @srcdir@
+srcdir = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+libdir = @libdir@
+
+datadir = @datadir@
+mandir = @mandir@
+man1dir = $(mandir)/man1
+man2dir = $(mandir)/man2
+man3dir = $(mandir)/man3
+man4dir = $(mandir)/man4
+man5dir = $(mandir)/man5
+man6dir = $(mandir)/man6
+man7dir = $(mandir)/man7
+man8dir = $(mandir)/man8
+man9dir = $(mandir)/man9
+infodir = @infodir@
+includedir = @includedir@
+
+SHELL = @SHELL@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM=@INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+AR = @AR@
+AR_FLAGS = qv
+CFLAGS = -g
+MAKEINFO = makeinfo
+RANLIB = @RANLIB@
+RM = rm
+
+# where to find makeinfo
+MAKEINFO=makeinfo
+
+SET_TEXINPUTS = TEXINPUTS=${TEXIDIR}:.:$(srcdir):$(READLINE_DIR):$$TEXINPUTS
+
+# Files which should be generated via 'info' and installed by 'install-info'
+INFO_DEPS = mmalloc.info
+
+# The TeX formatter
+TEX = tex
+
+TARGETLIB = libmmalloc.a
+
+CFILES = mcalloc.c mfree.c mmalloc.c mmcheck.c mmemalign.c mmstats.c \
+ mmtrace.c mrealloc.c mvalloc.c mmap-sup.c attach.c detach.c \
+ keys.c sbrk-sup.c mm.c
+
+HFILES = mmalloc.h
+
+OFILES = mcalloc.o mfree.o mmalloc.o mmcheck.o mmemalign.o mmstats.o \
+ mmtrace.o mrealloc.o mvalloc.o mmap-sup.o attach.o detach.o \
+ keys.o sbrk-sup.o
+
+DEFS = @DEFS@
+
+# The current default is to build a single object module with all the mmalloc
+# functions. To build a more traditional library, flip this macro definition.
+#TARGETOBJS = $(OFILES)
+TARGETOBJS = mm.o
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(DEFS) -I. -I$(srcdir)/../include $<
+
+# Do we want/need any config overrides?
+#
+
+STAGESTUFF = $(TARGETLIB) *.o
+
+all: $(TARGETLIB)
+
+info: $(INFO_DEPS)
+dvi: mmalloc.dvi
+clean-info:
+installcheck:
+
+mmalloc.info: mmalloc.texi
+ $(MAKEINFO) -I $(srcdir) -o ./mmalloc.info mmalloc.texi
+
+# This file doesn't need texindex currently.
+mmalloc.dvi: mmalloc.texi
+ $(SET_TEXINPUTS) $(TEX) mmalloc.texi
+ rm -f mmalloc.?? mmalloc.??s mmalloc.log mmalloc.aux mmalloc.toc
+
+install-info: info
+ @list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ for ifile in `cd $$d && echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \
+ if test -f $$d/$$ifile; then \
+ echo " $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile"; \
+ $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile; \
+ else : ; fi; \
+ done; \
+ done
+ $(POST_INSTALL)
+ @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file";\
+ install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file || :;\
+ done; \
+ else : ; fi
+
+uninstall-info:
+ $(PRE_UNINSTALL)
+ @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \
+ ii=yes; \
+ else ii=; fi; \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ test -z "$$ii" \
+ || install-info --info-dir=$(DESTDIR)$(infodir) --remove $$file; \
+ done
+ $(NORMAL_UNINSTALL)
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ (cd $(DESTDIR)$(infodir) && rm -f $$file $$file-[0-9] $$file-[0-9][0-9]); \
+ done
+
+check: test1.c
+# $(CC) -g $(srcdir)/test1.c libmmalloc.a
+# This loses for Canadian cross (building mmalloc with a cross-compiler).
+# There is probably some dejagnu-ish solution (such as what we are doing
+# for gdb, perhaps).
+# ./a.out
+
+install: all install-info
+ $(INSTALL_DATA) $(TARGETLIB) $(libdir)/$(TARGETLIB)n
+ $(RANLIB) $(libdir)/$(TARGETLIB)n
+ mv -f $(libdir)/$(TARGETLIB)n $(libdir)/$(TARGETLIB)
+
+uninstall: uninstall-info
+
+$(TARGETLIB): $(TARGETOBJS)
+ $(RM) -rf $@
+ $(AR) $(AR_FLAGS) $@ $(TARGETOBJS)
+ $(RANLIB) $@
+
+$(OFILES) : $(HFILES) Makefile
+
+mm.o: $(HFILES) $(CFILES)
+ $(CC) -c $(CFLAGS) $(DEFS) -I. -I$(srcdir)/../include $(srcdir)/mm.c
+
+.always.:
+# Do nothing.
+
+.PHONEY: all etags tags ls clean stage1 stage2 .always.
+
+stage1: force
+ -mkdir stage1
+ -mv -f $(STAGESTUFF) stage1
+
+stage2: force
+ -mkdir stage2
+ -mv -f $(STAGESTUFF) stage2
+
+stage3: force
+ -mkdir stage3
+ -mv -f $(STAGESTUFF) stage3
+
+stage4: force
+ -mkdir stage4
+ -mv -f $(STAGESTUFF) stage4
+
+against=stage2
+
+comparison: force
+ for i in *.o ; do cmp $$i $(against)/$$i || exit 1 ; done
+
+de-stage1: force
+ -(cd stage1 ; mv -f * ..)
+ -rmdir stage1
+
+de-stage2: force
+ -(cd stage2 ; mv -f * ..)
+ -rmdir stage2
+
+de-stage3: force
+ -(cd stage3 ; mv -f * ..)
+ -rmdir stage3
+
+de-stage4: force
+ -(cd stage4 ; mv -f * ..)
+ -rmdir stage4
+
+etags tags: TAGS
+
+TAGS: $(CFILES)
+ etags `for i in $(HFILES) $(CFILES); do echo $(srcdir)/$$i ; done`
+
+ls:
+ @echo Makefile $(HFILES) $(CFILES)
+
+# Need to deal with profiled libraries, too.
+
+mostlyclean clean:
+ rm -f *.a *.o core errs *~ \#* TAGS *.E a.out errors
+
+distclean: clean
+ rm -f config.cache config.log config.status
+ rm -f Makefile depend
+
+maintainer-clean realclean: distclean clean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f mmalloc.info
+
+force:
+
+Makefile: Makefile.in config.status
+ $(SHELL) config.status
+
+config.status: configure
+ $(SHELL) config.status --recheck
Index: attach.c
===================================================================
--- attach.c (nonexistent)
+++ attach.c (revision 1765)
@@ -0,0 +1,221 @@
+/* Initialization for access to a mmap'd malloc managed region.
+ Copyright 1992, 2000 Free Software Foundation, Inc.
+
+ Contributed by Fred Fish at Cygnus Support. fnf@cygnus.com
+
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include
+#include /* After sys/types.h, at least for dpx/2. */
+#include
+#include
+#ifdef HAVE_UNISTD_H
+#include /* Prototypes for lseek */
+#endif
+#include "mmprivate.h"
+
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+
+
+#if defined(HAVE_MMAP)
+
+/* Forward declarations/prototypes for local functions */
+
+static struct mdesc *reuse PARAMS ((int));
+
+/* 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. */
+
+PTR
+mmalloc_attach (fd, baseaddr)
+ int fd;
+ PTR baseaddr;
+{
+ struct mdesc mtemp;
+ struct mdesc *mdp;
+ PTR mbase;
+ struct stat sbuf;
+
+ /* First check to see if FD is a valid file descriptor, and if so, see
+ if the file has any current contents (size > 0). If it does, then
+ attempt to reuse the file. If we can't reuse the file, either
+ because it isn't a valid mmalloc produced file, was produced by an
+ obsolete version, or any other reason, then we fail to attach to
+ this file. */
+
+ if (fd >= 0)
+ {
+ if (fstat (fd, &sbuf) < 0)
+ {
+ return (NULL);
+ }
+ else if (sbuf.st_size > 0)
+ {
+ return ((PTR) reuse (fd));
+ }
+ }
+
+ /* We start off with the malloc descriptor allocated on the stack, until
+ we build it up enough to call _mmalloc_mmap_morecore() to allocate the
+ first page of the region and copy it there. Ensure that it is zero'd and
+ then initialize the fields that we know values for. */
+
+ mdp = &mtemp;
+ memset ((char *) mdp, 0, sizeof (mtemp));
+ strncpy (mdp -> magic, MMALLOC_MAGIC, MMALLOC_MAGIC_SIZE);
+ mdp -> headersize = sizeof (mtemp);
+ mdp -> version = MMALLOC_VERSION;
+ mdp -> morecore = __mmalloc_mmap_morecore;
+ mdp -> fd = fd;
+ mdp -> base = mdp -> breakval = mdp -> top = baseaddr;
+
+ /* If we have not been passed a valid open file descriptor for the file
+ to map to, then open /dev/zero and use that to map to. */
+
+ if (mdp -> fd < 0)
+ {
+ if ((mdp -> fd = open ("/dev/zero", O_RDWR)) < 0)
+ {
+ return (NULL);
+ }
+ else
+ {
+ mdp -> flags |= MMALLOC_DEVZERO;
+ }
+ }
+
+ /* Now try to map in the first page, copy the malloc descriptor structure
+ there, and arrange to return a pointer to this new copy. If the mapping
+ fails, then close the file descriptor if it was opened by us, and arrange
+ to return a NULL. */
+
+ if ((mbase = mdp -> morecore (mdp, sizeof (mtemp))) != NULL)
+ {
+ memcpy (mbase, mdp, sizeof (mtemp));
+ mdp = (struct mdesc *) mbase;
+ }
+ else
+ {
+ if (mdp -> flags & MMALLOC_DEVZERO)
+ {
+ close (mdp -> fd);
+ }
+ mdp = NULL;
+ }
+
+ return ((PTR) mdp);
+}
+
+/* Given an valid file descriptor on an open file, test to see if that file
+ is a valid mmalloc produced file, and if so, attempt to remap it into the
+ current process at the same address to which it was previously mapped.
+
+ Note that we have to update the file descriptor number in the malloc-
+ descriptor read from the file to match the current valid one, before
+ trying to map the file in, and again after a successful mapping and
+ after we've switched over to using the mapped in malloc descriptor
+ rather than the temporary one on the stack.
+
+ Once we've switched over to using the mapped in malloc descriptor, we
+ have to update the pointer to the morecore function, since it almost
+ certainly will be at a different address if the process reusing the
+ mapped region is from a different executable.
+
+ Also note that if the heap being remapped previously used the mmcheckf()
+ routines, we need to update the hooks since their target functions
+ will have certainly moved if the executable has changed in any way.
+ We do this by calling mmcheckf() internally.
+
+ Returns a pointer to the malloc descriptor if successful, or NULL if
+ unsuccessful for some reason. */
+
+static struct mdesc *
+reuse (fd)
+ int fd;
+{
+ struct mdesc mtemp;
+ struct mdesc *mdp = NULL;
+
+ if ((lseek (fd, 0L, SEEK_SET) == 0) &&
+ (read (fd, (char *) &mtemp, sizeof (mtemp)) == sizeof (mtemp)) &&
+ (mtemp.headersize == sizeof (mtemp)) &&
+ (strcmp (mtemp.magic, MMALLOC_MAGIC) == 0) &&
+ (mtemp.version <= MMALLOC_VERSION))
+ {
+ mtemp.fd = fd;
+ if (__mmalloc_remap_core (&mtemp) == mtemp.base)
+ {
+ mdp = (struct mdesc *) mtemp.base;
+ mdp -> fd = fd;
+ mdp -> morecore = __mmalloc_mmap_morecore;
+ if (mdp -> mfree_hook != NULL)
+ {
+ mmcheckf ((PTR) mdp, (void (*) PARAMS ((void))) NULL, 1);
+ }
+ }
+ }
+ return (mdp);
+}
+
+#else /* !defined (HAVE_MMAP) */
+
+/* For systems without mmap, the library still supplies an entry point
+ to link to, but trying to initialize access to an mmap'd managed region
+ always fails. */
+
+/* ARGSUSED */
+PTR
+mmalloc_attach (fd, baseaddr)
+ int fd;
+ PTR baseaddr;
+{
+ return (NULL);
+}
+
+#endif /* defined (HAVE_MMAP) */
+
Index: configure.in
===================================================================
--- configure.in (nonexistent)
+++ configure.in (revision 1765)
@@ -0,0 +1,35 @@
+dnl Autoconf configure script for MMALLOC, the GNU mmemory allocator.
+dnl Copyright 2000 Free Software Foundation, Inc.
+dnl
+dnl This file is part of GDB.
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+dnl GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+dnl Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.12.1)dnl
+AC_INIT(mmalloc.c)
+
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_CHECK_TOOL(AR, ar)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+
+AC_FUNC_MMAP
+AC_CHECK_HEADERS(limits.h stddef.h unistd.h)
+
+BFD_NEED_DECLARATION(sbrk)
+BFD_NEED_DECLARATION(getpagesize)
+
+AC_OUTPUT(Makefile)
Index: mmemalign.c
===================================================================
--- mmemalign.c (nonexistent)
+++ mmemalign.c (revision 1765)
@@ -0,0 +1,62 @@
+/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include "mmprivate.h"
+
+PTR
+mmemalign (md, alignment, size)
+ PTR md;
+ size_t alignment;
+ size_t size;
+{
+ PTR result;
+ unsigned long int adj;
+ struct alignlist *l;
+ struct mdesc *mdp;
+
+ if ((result = mmalloc (md, size + alignment - 1)) != NULL)
+ {
+ adj = RESIDUAL (result, alignment);
+ if (adj != 0)
+ {
+ mdp = MD_TO_MDP (md);
+ for (l = mdp -> aligned_blocks; l != NULL; l = l -> next)
+ {
+ if (l -> aligned == NULL)
+ {
+ /* This slot is free. Use it. */
+ break;
+ }
+ }
+ if (l == NULL)
+ {
+ l = (struct alignlist *) mmalloc (md, sizeof (struct alignlist));
+ if (l == NULL)
+ {
+ mfree (md, result);
+ return (NULL);
+ }
+ l -> next = mdp -> aligned_blocks;
+ mdp -> aligned_blocks = l;
+ }
+ l -> exact = result;
+ result = l -> aligned = (char *) result + alignment - adj;
+ }
+ }
+ return (result);
+}
Index: sbrk-sup.c
===================================================================
--- sbrk-sup.c (nonexistent)
+++ sbrk-sup.c (revision 1765)
@@ -0,0 +1,102 @@
+/* Support for sbrk() regions.
+ Copyright 1992, 2000 Free Software Foundation, Inc.
+ Contributed by Fred Fish at Cygnus Support. fnf@cygnus.com
+
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_UNISTD_H
+#include /* Prototypes for sbrk (maybe) */
+#endif
+#include /* Prototypes for memcpy, memmove, memset, etc */
+
+#include "mmprivate.h"
+
+static PTR sbrk_morecore PARAMS ((struct mdesc *, int));
+#if NEED_DECLARATION_SBRK
+extern PTR sbrk PARAMS ((int));
+#endif
+
+/* The mmalloc() package can use a single implicit malloc descriptor
+ for mmalloc/mrealloc/mfree operations which do not supply an explicit
+ descriptor. For these operations, sbrk() is used to obtain more core
+ from the system, or return core. This allows mmalloc() to provide
+ backwards compatibility with the non-mmap'd version. */
+
+struct mdesc *__mmalloc_default_mdp;
+
+/* Use sbrk() to get more core. */
+
+static PTR
+sbrk_morecore (mdp, size)
+ struct mdesc *mdp;
+ int size;
+{
+ PTR result;
+
+ if ((result = sbrk (size)) == (PTR) -1)
+ {
+ result = NULL;
+ }
+ else
+ {
+ mdp -> breakval += size;
+ mdp -> top += size;
+ }
+ return (result);
+}
+
+/* Initialize the default malloc descriptor if this is the first time
+ a request has been made to use the default sbrk'd region.
+
+ Since no alignment guarantees are made about the initial value returned
+ by sbrk, test the initial value and (if necessary) sbrk enough additional
+ memory to start off with alignment to BLOCKSIZE. We actually only need
+ it aligned to an alignment suitable for any object, so this is overkill.
+ But at most it wastes just part of one BLOCKSIZE chunk of memory and
+ minimizes portability problems by avoiding us having to figure out
+ what the actual minimal alignment is. The rest of the malloc code
+ avoids this as well, by always aligning to the minimum of the requested
+ size rounded up to a power of two, or to BLOCKSIZE.
+
+ Note that we are going to use some memory starting at this initial sbrk
+ address for the sbrk region malloc descriptor, which is a struct, so the
+ base address must be suitably aligned. */
+
+struct mdesc *
+__mmalloc_sbrk_init ()
+{
+ PTR base;
+ unsigned int adj;
+
+ base = sbrk (0);
+ adj = RESIDUAL (base, BLOCKSIZE);
+ if (adj != 0)
+ {
+ sbrk (BLOCKSIZE - adj);
+ base = sbrk (0);
+ }
+ __mmalloc_default_mdp = (struct mdesc *) sbrk (sizeof (struct mdesc));
+ memset ((char *) __mmalloc_default_mdp, 0, sizeof (struct mdesc));
+ __mmalloc_default_mdp -> morecore = sbrk_morecore;
+ __mmalloc_default_mdp -> base = base;
+ __mmalloc_default_mdp -> breakval = __mmalloc_default_mdp -> top = sbrk (0);
+ __mmalloc_default_mdp -> fd = -1;
+ return (__mmalloc_default_mdp);
+}
+
+
Index: ChangeLog
===================================================================
--- ChangeLog (nonexistent)
+++ ChangeLog (revision 1765)
@@ -0,0 +1,486 @@
+2002-11-28 Elena Zannoni
+
+ * Makefile.in (install): Move install-info to here...
+ (all): ...from here.
+
+2002-11-26 Elena Zannoni
+
+ * Makefile.in (INFO_DEPS): Define.
+ (all): Add install-info to the rule.
+ (info): Unse INFO_DEPS.
+ (install-info): Rewrite.
+ (uninstall-info): New.
+ (uninstall): New.
+
+2002-04-07 Andrew Cagney
+
+ From 2002-03-05 Scott Pakin
+ * mmap-sup.c (MAP_PRIVATE_OR_SHARED): Define.
+ (__mmalloc_mmap_morecore): Use.
+ (__mmalloc_remap_core): Use.
+
+2000-05-17 Eli Zaretskii
+
+ * Makefile.in (install-info): Make sure $(infodir) exists. Run
+ install-info program on the installed Info files.
+
+2000-03-20 Eli Zaretskii
+
+ * Makefile.in (install): Append "n", not ".n" to libmmalloc.a,
+ since the latter loses on DOS 8+3 filesystems.
+
+Mon Feb 28 10:33:51 2000 Andrew Cagney
+
+ * MAINTAINERS: New file.
+
+2000-02-18 Frank Ch. Eigler
+
+ From Jason "crash" Molenda :
+ * configure.in: Check for getpagesize declaration.
+ * mvmalloc.c, mmap-sup.c: Conditionally declare getpagesize.
+ * configure: Regenerated.
+
+Fri Feb 18 11:42:21 2000 Andrew Cagney
+
+ * configure.in: Check for .
+ * configure: Regenerate.
+
+ From 2000-02-17 RodneyBrown@pmsc.com:
+ * mm.c, attach.c, mmap-sup.c, sbrk-sup.c: Include for
+ sbrk and lseek declarations. Update copyright.
+
+2000-02-04 Kevin Buettner (kevinb@cygnus.com)
+
+ * acinclude.m4, aclocal.m4: New files.
+ * configure.in (sbrk): Use BFD_NEED_DECLARATION to test for
+ presence of a suitable declaration in the system headers.
+ * configure: Regenerated.
+ * sbrk-sup.c (sbrk): Ifdef'd with NEED_DECLARATION_SBRK.
+
+1999-01-04 Jason Molenda (jsm@bugshack.cygnus.com)
+
+ * configure.in: Requires autoconf 2.12.1 or higher.
+ * configure: Regenerated.
+
+1998-07-24 Jim Blandy
+
+ * mcalloc.c: #include before . HP/UX 11.0
+ needs this.
+
+Thu Apr 23 12:19:22 1998 Philippe De Muyter
+
+ * mmalloc.h: Include sys/types.h and stdio.h #ifndef HAVE_STDDEF_H.
+ * mmprivate.h: Do not handle HAVE_STDDEF_H here, since we include
+ mmalloc.h.
+
+Tue Mar 24 17:07:02 1998 Stu Grossman
+
+ * Makefile.in: Get SHELL from configure.
+ * configure: Regenerate with autoconf 2.12.1 to fix shell issues for
+ NT native builds.
+
+Mon Feb 7 13:06:45 1997 Philippe De Muyter
+
+ * mmalloc/detach.c: Do not include fcntl.h.
+
+Thu Aug 28 13:15:07 1997 Andrew Cagney
+
+ * mrealloc.c (realloc): Store result in local variable before
+ returning it. Makes debugging much easier at negligible cost.
+
+Tue Feb 4 16:30:59 1997 Ian Lance Taylor
+
+ * mvalloc.c (cache_pagesize): Rename from pagesize, so that if we
+ are building mm.o, it does not conflict with the variable of the
+ same name in mmap-sup.c.
+
+Sat Dec 28 12:48:32 1996 Fred Fish
+
+ * Makefile.in (mm.o): New target that combines all the functions
+ into a single object module. This avoids client programs picking
+ up part of the allocation routines from mmalloc and part from libc,
+ which can lead to undefined behavior.
+ (CFILES): Add mm.c
+ (TARGETOBJS): Define to be either the individual objects or the
+ single combined object.
+ (TARGETLIB): Create the archive using TARGETOBJS.
+ * mm.c: New file that simply #includes the other source C files.
+
+Thu Oct 3 15:45:23 1996 Jason Molenda (crash@godzilla.cygnus.co.jp)
+
+ * Makefile.in (maintainer-clean): Depend on distclean, remove
+ duplication.
+
+Tue Sep 10 17:52:06 1996 Fred Fish
+
+ * mmcheck.c (checkhdr): Add prototype.
+ (mfree_check): Ditto.
+ (mmalloc_check): Ditto.
+ (mrealloc_check): Ditto.
+ * mmtrace.c (tr_break): Ditto.
+ (tr_freehook): Ditto.
+ (tr_mallochook): Ditto.
+ (tr_reallochook): Ditto.
+ * sbrk-sup.c (sbrk_morecore): Ditto.
+
+Wed Sep 4 18:02:45 1996 Stu Grossman (grossman@critters.cygnus.com)
+
+ * configure configure.in: Don't default CC to cc. It causes problems
+ when starting a compile in the mmalloc directory.
+
+Wed Jul 24 00:53:34 1996 Fred Fish
+
+ * mmalloc.h (mmalloc_findbase): Add prototype.
+
+Fri Jul 12 18:35:34 1996 Fred Fish
+
+ * mmap-sup.c (mmalloc_findbase): Change to not require /dev/zero
+ if MMAP_ANONYMOUS is available.
+
+Wed Jul 10 23:53:42 1996 Fred Fish
+
+ * detach.c (mmalloc_detach): Fix bug in computation of negative
+ brk value.
+ * mmcheck.c (mmcheckf): Renamed from mmcheck and new FORCE argument
+ added. Replaced hack that always allowed checking routines to be
+ installed and enforce restriction that they have to be installed
+ prior to allocating any memory on the used heap or the FORCE argument
+ has to be non-NULL.
+ (mmcheck): New function that calls mmcheckf with FORCE set to zero,
+ for backwards compatibility.
+ * mmalloc.c (malloc): Store result in local variable before
+ returning it. Makes debugging much easier at negligible cost.
+ * mmalloc.h (mmcheckf): Declare.
+ * attach.c (reuse): Call mmcheckf rather than mmcheck.
+ * mmap-sup.c (__mmalloc_mmap_morecore): Improve to allow mmap
+ to select a base mapping address if none is otherwise given.
+ (mmalloc_findbase): New function that user can call to find
+ an available mapping address of a given size.
+
+Tue Jun 25 22:54:06 1996 Jason Molenda (crash@godzilla.cygnus.co.jp)
+
+ * Makefile.in (bindir, libdir, datadir, mandir, infodir, includedir):
+ Use autoconf-set values.
+ (docdir): Removed.
+ * configure.in (AC_PREREQ): autoconf 2.5 or higher.
+ * configure: Rebuilt.
+
+Tue May 28 13:51:22 1996 Fred Fish
+
+ From: Thomas A Peterson
+ * Makefile.in (install-info): Apply patch to install
+ mmalloc.info from srcdir if not found in build dir.
+
+Sun Apr 7 20:55:30 1996 Fred Fish
+
+ From: Miles Bader
+ * configure.in: Use AC_CHECK_TOOL to find AR & RANLIB.
+ * configure: Regenerate with autoconf.
+ * Makefile.in: Use AR set by configure substitution.
+
+Fri Mar 29 09:57:36 1996 Fred Fish
+
+ * mmalloc.h (mmtrace): Add prototype.
+
+Sat Feb 3 12:41:00 1996 Fred Fish
+
+ From H.J. Lu (hjl@gnu.ai.mit.edu):
+ * mvalloc.c (valloc): new.
+ * mmemalign.c: Allocate (SIZE + ALIGNMENT - 1) and then trim
+ if possible.
+ (memalign): don't put the node on the _aligned_blocks list more
+ than once.
+
+Mon Nov 20 12:04:32 1995 Fred Fish
+
+ * Makefile.in (OFILES): Make objects depend upon Makefile,
+ since Makefile sets DEFS which can definitely affect how
+ objects are to be compiled.
+
+Mon Nov 6 14:12:13 1995 Jason Molenda (crash@phydeaux.cygnus.com)
+
+ * configure.in (AC_CHECK_HEADERS): add limits.h.
+ (AC_HEADER_STDC): remove.
+
+ * mmalloc.h: document necessity of defining size_t before
+ including mmalloc.h.
+
+ * mmprivate.h: add check for limits.h, remove definition of
+ NULL and size_t.
+
+Sun Nov 5 00:27:36 1995 Jason Molenda (crash@phydeaux.cygnus.com)
+
+ * configure.in: AC_CHECK_HEADERS, not AC_CHECK_HEADER.
+
+Sun Nov 5 00:14:13 1995 Jason Molenda (crash@phydeaux.cygnus.com)
+
+ * configure.in: add check for stddef.h
+ * mmalloc.h: include stddef.h if HAVE_STDDEF_H is defined.
+
+Sat Nov 4 19:10:13 1995 Jason Molenda (crash@phydeaux.cygnus.com)
+
+ * configure.in: add AC_HEADER_STDC check.
+
+ * mmalloc.h: check if STDC_HEADERS instead of __STDC__.
+
+ * mmprivate.h: check if STDC_HEADERS instead of __STDC__.
+
+Tue Oct 24 13:17:44 1995 Stan Shebs
+
+ * mmprivate.h: Remove declarations (PTR, etc) that are already
+ provided by ansidecl.h, include mmalloc.h earlier in file.
+
+Tue Oct 10 11:04:47 1995 Fred Fish
+
+ * Makefile.in (BISON): Remove macro.
+
+Wed Sep 20 12:51:13 1995 Ian Lance Taylor
+
+ * Makefile.in (maintainer-clean): New target, synonym for
+ realclean. Add GNU standard maintainer-clean echos.
+
+Thu Aug 3 10:45:37 1995 Fred Fish
+
+ * Update all FSF addresses except those in COPYING* files
+ and shar archive of original FSF files.
+
+Mon Jun 12 12:11:57 1995 J.T. Conklin
+
+ * Makefile.in (distclean, realclean): Remove config.cache and
+ config.log.
+
+Wed May 17 17:47:44 1995 J.T. Conklin
+
+ * Makefile.in (Makefile): Added config.status to dependency list.
+ (config.status): New target.
+
+Fri May 5 15:17:53 1995 J.T. Conklin
+
+ * mmap-sup.c: Removed munmap prototype. Some systems have a
+ slightly different prototype.
+
+Wed May 3 17:18:13 1995 J.T. Conklin
+
+ * Makefile.in, configure.in: Converted to use autoconf.
+ * configure: New file, generated with autoconf 2.3.
+ * config/{mh-go32, mh-irix, mh-ncr3000, mh-sunos4,
+ mh-sysv4}: Removed.
+
+Thu Nov 3 23:55:21 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com)
+
+ * Makefile.in (install-info): Name destination file correctly,
+ rather than using undefined shell variable.
+
+Fri Oct 28 16:46:58 1994 Stan Shebs (shebs@andros.cygnus.com)
+
+ * mmprivate.h: New file, was mmalloc.h.
+ (mmalloc.h): Include.
+ * mmalloc.h: Remove all but declarations of mmalloc functions.
+ (ansidecl.h): Include.
+ * attach.c, et al: Include mmprivate.h instead of mmalloc.h.
+
+Wed Aug 24 12:55:33 1994 Ian Lance Taylor (ian@sanguine.cygnus.com)
+
+ * configure.in: Change i[34]86 to i[345]86.
+
+Mon Aug 22 11:36:40 1994 Stan Shebs (shebs@andros.cygnus.com)
+
+ * Makefile.in (distclean): Separate from realclean.
+ (realclean): Remove mmalloc.info.
+
+Fri May 6 13:04:25 1994 Steve Chamberlain (sac@cygnus.com)
+
+ * config/go32.mh: New file
+ * configure.in (host==go32): Use new fragment.
+
+Tue Feb 8 00:32:28 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
+
+ * mmtrace.c (tr_freehook, tr_mallochook, tr_reallochook):
+ Cast addresses put out via fprintf to unsigned long and use %lx.
+
+Tue Nov 16 20:33:17 1993 Jim Kingdon (kingdon@deneb.cygnus.com)
+
+ * COPYING.LIB: New file (standard version 2 LGPL, as already cited
+ by the source files).
+
+Fri Nov 5 11:47:33 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
+
+ * Makefile.in (info dvi install-info): Actually make the manual.
+
+Mon Nov 1 14:20:25 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
+
+ * mmalloc.texi: Fix typo ("for for" -> "for").
+
+Fri Jul 16 15:27:08 1993 Jim Kingdon (kingdon@rtl.cygnus.com)
+
+ * test1.c: New file which tests for bug fixed below.
+ * Makefile.in (check): Put in commands to run it (but commented out
+ because it won't work for Canadian cross).
+
+ * mmalloc.c (mmalloc): When extending a free block at the end of the
+ heap, check whether which block is at the end changed.
+
+ * Makefile.in (TAGS): make work when srcdir != objdir.
+
+Thu Jul 15 07:56:47 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
+
+ * attach.c, detach.c: Include before .
+
+Wed Jun 30 11:00:53 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
+
+ * Makefile.in: Add mostlyclean and realclean targets.
+
+Wed Mar 24 01:58:12 1993 david d `zoo' zuhn (zoo at poseidon.cygnus.com)
+
+ * Makefile.in: add dvi and installcheck targets
+
+Fri Mar 12 18:35:43 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com)
+
+ * configure.in: recognize *-*-solaris2* instead of *-*-solaris* (a
+ number of people want to call SunOS 4.1.2 "solaris1.0" and get it right)
+
+Mon Feb 22 18:08:53 1993 John Gilmore (gnu@cygnus.com)
+
+ * Makefile.in (distclean): Add.
+
+Tue Feb 16 08:09:15 1993 Fred Fish (fnf@cygnus.com)
+
+ * Makefile.in, attach.c, detach.c, keys.c, mmap-sup.c, mmtrace.c,
+ sbrk-sup.c: Use GNU Library General Public License, like other
+ files.
+
+Wed Nov 18 19:18:59 1992 John Gilmore (gnu@cygnus.com)
+
+ * configure.in: Regularize list of host configs.
+
+Fri Oct 30 00:59:46 1992 John Gilmore (gnu@cygnus.com)
+
+ * mmalloc.texi: Add missing doubled @. Bugfix by Paul Eggert.
+
+Fri Oct 23 01:50:52 1992 Stu Grossman (grossman at cygnus.com)
+
+ * configure.in: Handle solaris same as sysv4.
+
+Thu Oct 1 23:34:20 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com)
+
+ * configure.in: use cpu-vendor-os triple instead of nested cases
+
+Sun Aug 23 11:09:46 1992 Fred Fish (fnf@cygnus.com)
+
+ * sbrk-sup.c (__mmalloc_brk_init): Ensure base of sbrk'd region
+ is aligned. Bug reported by Andrew Heybey (ath@lcs.mit.edu).
+
+Wed Aug 19 14:49:23 1992 Ian Lance Taylor (ian@cygnus.com)
+
+ * Makefile.in: always create installation directories.
+
+Mon Jul 20 21:15:44 1992 Fred Fish (fnf@cygnus.com)
+
+ * mrealloc.c: Minor code format style changes for consistency.
+
+Fri Jul 3 20:25:30 1992 Fred Fish (fnf@cygnus.com)
+
+ * attach.c, detach.c, mcalloc.c, mmalloc.c, mmtrace.c, mrealloc.c,
+ sbrk-sup.c: Remove "(void)" casts from function calls where the
+ return value is ignored, in accordance with GNU coding standards.
+
+Tue Jun 30 16:44:41 1992 Fred Fish (fnf@cygnus.com)
+
+ * mmalloc.h (struct mdesc): Add FIXME comments to point out the
+ need to save some data on a per-process basis for mapped regions
+ that are shared.
+ * attach.c (reuse): Update the morecore field for reused mapped
+ regions to be correct for the current process.
+
+Mon Jun 29 10:45:25 1992 Fred Fish (fnf at cygnus.com)
+
+ * mmtrace.c: Lint.
+
+Mon Jun 15 12:20:16 1992 Fred Fish (fnf@cygnus.com)
+
+ * mmalloc.h (struct mdesc): Change member "errno" to
+ "saved_errno" to avoid possible conflict with ANSI C environments,
+ where it is allowed to be a macro.
+ * config/mh-ncr3000 (INSTALL): Don't use /usr/ucb/install,
+ it is broken on ncr 3000's.
+ * config/mh-ncr3000 (RANLIB): Use RANLIB=true.
+
+Fri Jun 12 21:34:21 1992 John Gilmore (gnu at cygnus.com)
+
+ * mmap-sup.c: Avoid ANSI C "empty translation unit" idiocy.
+
+Tue Jun 9 17:29:04 1992 Fred Fish (fnf@cygnus.com)
+
+ * config/{mh-ncr3000, mh-sysv4}: Add definition for INSTALL using
+ /usr/ucb/install.
+
+Thu Apr 30 22:36:31 1992 Fred Fish (fnf@cygnus.com)
+
+ * sbrk-sup.c (sbrk_morecore): Fix sbrk() error return test.
+
+Mon Apr 20 21:03:30 1992 K. Richard Pixley (rich@cygnus.com)
+
+ * Makefile.in: rework CFLAGS so that they can be passed from the
+ command line. remove MINUS_G. Default CFLAGS to -g.
+
+Thu Apr 16 20:00:21 1992 Fred Fish (fnf@cygnus.com)
+
+ * TODO: New file.
+ * attach.c, mcalloc.c, mfree.c, mmalloc.c, mmalloc.h, mmap-sup.c,
+ mmcheck.c, mtrace.c, mrealloc.c, mvalloc.c, sbrk-sup.c: Lint.
+
+Fri Apr 10 22:59:17 1992 Fred Fish (fnf@cygnus.com)
+
+ * configure.in: Recognize new ncr3000 config.
+ * config/mh-ncr3000: New config file.
+ * Makefile.in (MINUS_G): Add macro and default to -g.
+
+Wed Apr 8 09:34:53 1992 Fred Fish (fnf@cygnus.com)
+
+ * mmalloc.c: Minor fix to comment.
+ * mmalloc.texi: Update to match actual implementation
+ * mmalloc.h (morecore): Change prototype's 2nd arg to int.
+
+Tue Apr 7 22:16:09 1992 Fred Fish (fnf@cygnus.com)
+
+ * mmalloc.h (size_t, CHAR_BIT): Only redefine if not already
+ defined.
+
+Mon Apr 6 20:49:33 1992 Fred Fish (fnf@cygnus.com)
+
+ * mmalloc.h: Remove include of . This also gets rid
+ of the ugly kludge installed on 1-Apr-92.
+
+Mon Apr 6 16:33:37 1992 Stu Grossman (grossman at cygnus.com)
+
+ * detach.c (mmalloc_detach): Arg should be PTR, not void *.
+ Fixes complaints from non __STDC__ systems.
+
+Wed Apr 1 11:47:02 1992 Fred Fish (fnf@cygnus.com)
+
+ * mcalloc.c, mfree.c, mmalloc.c, mrealloc.c: Minor comment
+ change.
+ * mmalloc.h: Add ugly kludge to band-aid over problems with
+ bogus vendor files.
+
+Sun Mar 29 12:41:31 1992 John Gilmore (gnu at cygnus.com)
+
+ * attach.c, mmalloc.c, mmcheck.c: Lint.
+
+Thu Mar 26 17:06:04 1992 Fred Fish (fnf@cygnus.com)
+
+ * attach.c (reuse): Explicitly discard return value of mmcheck.
+ * mmcheck.c (mmcheck): Document requirements for installing
+ corruption checking hooks and set up to enforce restrictions.
+
+Tue Mar 24 23:41:10 1992 K. Richard Pixley (rich@cygnus.com)
+
+ * config/mh-irix4: new file.
+
+ * Makefile.in: added standard targets, fixed install directories.
+
+Sat Mar 14 17:34:59 1992 Fred Fish (fnf@cygnus.com)
+
+ * Initial release, incorporated into gdb.
+
+
Index: mmcheck.c
===================================================================
--- mmcheck.c (nonexistent)
+++ mmcheck.c (revision 1765)
@@ -0,0 +1,223 @@
+/* Standard debugging hooks for `mmalloc'.
+ Copyright 1990, 1991, 1992 Free Software Foundation
+
+ Written May 1989 by Mike Haertel.
+ Heavily modified Mar 1992 by Fred Fish (fnf@cygnus.com)
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+
+ The author may be reached (Email) at the address mike@ai.mit.edu,
+ or (US mail) as Mike Haertel c/o Free Software Foundation. */
+
+#include "mmprivate.h"
+
+/* Default function to call when something awful happens. The application
+ can specify an alternate function to be called instead (and probably will
+ want to). */
+
+extern void abort PARAMS ((void));
+
+/* Arbitrary magical numbers. */
+
+#define MAGICWORD (unsigned int) 0xfedabeeb /* Active chunk */
+#define MAGICWORDFREE (unsigned int) 0xdeadbeef /* Inactive chunk */
+#define MAGICBYTE ((char) 0xd7)
+
+/* Each memory allocation is bounded by a header structure and a trailer
+ byte. I.E.
+
+
+
+ The pointer returned to the user points to the first byte in the
+ user's allocation area. The magic word can be tested to detect
+ buffer underruns and the magic byte can be tested to detect overruns. */
+
+struct hdr
+ {
+ size_t size; /* Exact size requested by user. */
+ unsigned long int magic; /* Magic number to check header integrity. */
+ };
+
+static void checkhdr PARAMS ((struct mdesc *, CONST struct hdr *));
+static void mfree_check PARAMS ((PTR, PTR));
+static PTR mmalloc_check PARAMS ((PTR, size_t));
+static PTR mrealloc_check PARAMS ((PTR, PTR, size_t));
+
+/* Check the magicword and magicbyte, and if either is corrupted then
+ call the emergency abort function specified for the heap in use. */
+
+static void
+checkhdr (mdp, hdr)
+ struct mdesc *mdp;
+ CONST struct hdr *hdr;
+{
+ if (hdr -> magic != MAGICWORD ||
+ ((char *) &hdr[1])[hdr -> size] != MAGICBYTE)
+ {
+ (*mdp -> abortfunc)();
+ }
+}
+
+static void
+mfree_check (md, ptr)
+ PTR md;
+ PTR ptr;
+{
+ struct hdr *hdr = ((struct hdr *) ptr) - 1;
+ struct mdesc *mdp;
+
+ mdp = MD_TO_MDP (md);
+ checkhdr (mdp, hdr);
+ hdr -> magic = MAGICWORDFREE;
+ mdp -> mfree_hook = NULL;
+ mfree (md, (PTR)hdr);
+ mdp -> mfree_hook = mfree_check;
+}
+
+static PTR
+mmalloc_check (md, size)
+ PTR md;
+ size_t size;
+{
+ struct hdr *hdr;
+ struct mdesc *mdp;
+ size_t nbytes;
+
+ mdp = MD_TO_MDP (md);
+ mdp -> mmalloc_hook = NULL;
+ nbytes = sizeof (struct hdr) + size + 1;
+ hdr = (struct hdr *) mmalloc (md, nbytes);
+ mdp -> mmalloc_hook = mmalloc_check;
+ if (hdr != NULL)
+ {
+ hdr -> size = size;
+ hdr -> magic = MAGICWORD;
+ hdr++;
+ *((char *) hdr + size) = MAGICBYTE;
+ }
+ return ((PTR) hdr);
+}
+
+static PTR
+mrealloc_check (md, ptr, size)
+ PTR md;
+ PTR ptr;
+ size_t size;
+{
+ struct hdr *hdr = ((struct hdr *) ptr) - 1;
+ struct mdesc *mdp;
+ size_t nbytes;
+
+ mdp = MD_TO_MDP (md);
+ checkhdr (mdp, hdr);
+ mdp -> mfree_hook = NULL;
+ mdp -> mmalloc_hook = NULL;
+ mdp -> mrealloc_hook = NULL;
+ nbytes = sizeof (struct hdr) + size + 1;
+ hdr = (struct hdr *) mrealloc (md, (PTR) hdr, nbytes);
+ mdp -> mfree_hook = mfree_check;
+ mdp -> mmalloc_hook = mmalloc_check;
+ mdp -> mrealloc_hook = mrealloc_check;
+ if (hdr != NULL)
+ {
+ hdr -> size = size;
+ hdr++;
+ *((char *) hdr + size) = MAGICBYTE;
+ }
+ return ((PTR) hdr);
+}
+
+/* Turn on default checking for mmalloc/mrealloc/mfree, for the heap specified
+ by MD. If FUNC is non-NULL, it is a pointer to the function to call
+ to abort whenever memory corruption is detected. By default, this is the
+ standard library function abort().
+
+ Note that we disallow installation of initial checking hooks if mmalloc
+ has been called at any time for this particular heap, since if any region
+ that is allocated prior to installation of the hooks is subsequently
+ reallocated or freed after installation of the hooks, it is guaranteed
+ to trigger a memory corruption error. We do this by checking the state
+ of the MMALLOC_INITIALIZED flag. If the FORCE argument is non-zero, this
+ checking is disabled and it is allowed to install the checking hooks at any
+ time. This is useful on systems where the C runtime makes one or more
+ malloc calls before the user code had a chance to call mmcheck or mmcheckf,
+ but never calls free with these values. Thus if we are certain that only
+ values obtained from mallocs after an mmcheck/mmcheckf will ever be passed
+ to free(), we can go ahead and force installation of the useful checking
+ hooks.
+
+ However, we can call this function at any time after the initial call,
+ to update the function pointers to the checking routines and to the
+ user defined corruption handler routine, as long as these function pointers
+ have been previously extablished by the initial call. Note that we
+ do this automatically when remapping a previously used heap, to ensure
+ that the hooks get updated to the correct values, although the corruption
+ handler pointer gets set back to the default. The application can then
+ call mmcheck to use a different corruption handler if desired.
+
+ Returns non-zero if checking is successfully enabled, zero otherwise. */
+
+int
+mmcheckf (md, func, force)
+ PTR md;
+ void (*func) PARAMS ((void));
+ int force;
+{
+ struct mdesc *mdp;
+ int rtnval;
+
+ mdp = MD_TO_MDP (md);
+
+ /* We can safely set or update the abort function at any time, regardless
+ of whether or not we successfully do anything else. */
+
+ mdp -> abortfunc = (func != NULL ? func : abort);
+
+ /* If we haven't yet called mmalloc the first time for this heap, or if we
+ have hooks that were previously installed, then allow the hooks to be
+ initialized or updated. */
+
+ if (force ||
+ !(mdp -> flags & MMALLOC_INITIALIZED) ||
+ (mdp -> mfree_hook != NULL))
+ {
+ mdp -> mfree_hook = mfree_check;
+ mdp -> mmalloc_hook = mmalloc_check;
+ mdp -> mrealloc_hook = mrealloc_check;
+ mdp -> flags |= MMALLOC_MMCHECK_USED;
+ rtnval = 1;
+ }
+ else
+ {
+ rtnval = 0;
+ }
+
+ return (rtnval);
+}
+
+/* This routine is for backwards compatibility only, in case there are
+ still callers to the original mmcheck function. */
+
+int
+mmcheck (md, func)
+ PTR md;
+ void (*func) PARAMS ((void));
+{
+ int rtnval;
+
+ rtnval = mmcheckf (md, func, 0);
+ return (rtnval);
+}
Index: mmprivate.h
===================================================================
--- mmprivate.h (nonexistent)
+++ mmprivate.h (revision 1765)
@@ -0,0 +1,343 @@
+/* Declarations for `mmalloc' and friends.
+ Copyright 1990, 1991, 1992 Free Software Foundation
+
+ Written May 1989 by Mike Haertel.
+ Heavily modified Mar 1992 by Fred Fish. (fnf@cygnus.com)
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+
+ The author may be reached (Email) at the address mike@ai.mit.edu,
+ or (US mail) as Mike Haertel c/o Free Software Foundation. */
+
+
+#ifndef __MMPRIVATE_H
+#define __MMPRIVATE_H 1
+
+#include "mmalloc.h"
+
+#ifdef HAVE_LIMITS_H
+# include
+#else
+# ifndef CHAR_BIT
+# define CHAR_BIT 8
+# endif
+#endif
+
+#ifndef MIN
+# define MIN(A, B) ((A) < (B) ? (A) : (B))
+#endif
+
+#define MMALLOC_MAGIC "mmalloc" /* Mapped file magic number */
+#define MMALLOC_MAGIC_SIZE 8 /* Size of magic number buf */
+#define MMALLOC_VERSION 1 /* Current mmalloc version */
+#define MMALLOC_KEYS 16 /* Keys for application use */
+
+/* The allocator divides the heap into blocks of fixed size; large
+ requests receive one or more whole blocks, and small requests
+ receive a fragment of a block. Fragment sizes are powers of two,
+ and all fragments of a block are the same size. When all the
+ fragments in a block have been freed, the block itself is freed. */
+
+#define INT_BIT (CHAR_BIT * sizeof(int))
+#define BLOCKLOG (INT_BIT > 16 ? 12 : 9)
+#define BLOCKSIZE ((unsigned int) 1 << BLOCKLOG)
+#define BLOCKIFY(SIZE) (((SIZE) + BLOCKSIZE - 1) / BLOCKSIZE)
+
+/* The difference between two pointers is a signed int. On machines where
+ the data addresses have the high bit set, we need to ensure that the
+ difference becomes an unsigned int when we are using the address as an
+ integral value. In addition, when using with the '%' operator, the
+ sign of the result is machine dependent for negative values, so force
+ it to be treated as an unsigned int. */
+
+#define ADDR2UINT(addr) ((unsigned int) ((char *) (addr) - (char *) NULL))
+#define RESIDUAL(addr,bsize) ((unsigned int) (ADDR2UINT (addr) % (bsize)))
+
+/* Determine the amount of memory spanned by the initial heap table
+ (not an absolute limit). */
+
+#define HEAP (INT_BIT > 16 ? 4194304 : 65536)
+
+/* Number of contiguous free blocks allowed to build up at the end of
+ memory before they will be returned to the system. */
+
+#define FINAL_FREE_BLOCKS 8
+
+/* Where to start searching the free list when looking for new memory.
+ The two possible values are 0 and heapindex. Starting at 0 seems
+ to reduce total memory usage, while starting at heapindex seems to
+ run faster. */
+
+#define MALLOC_SEARCH_START mdp -> heapindex
+
+/* Address to block number and vice versa. */
+
+#define BLOCK(A) (((char *) (A) - mdp -> heapbase) / BLOCKSIZE + 1)
+
+#define ADDRESS(B) ((PTR) (((B) - 1) * BLOCKSIZE + mdp -> heapbase))
+
+/* Data structure giving per-block information. */
+
+typedef union
+ {
+ /* Heap information for a busy block. */
+ struct
+ {
+ /* Zero for a large block, or positive giving the
+ logarithm to the base two of the fragment size. */
+ int type;
+ union
+ {
+ struct
+ {
+ size_t nfree; /* Free fragments in a fragmented block. */
+ size_t first; /* First free fragment of the block. */
+ } frag;
+ /* Size (in blocks) of a large cluster. */
+ size_t size;
+ } info;
+ } busy;
+ /* Heap information for a free block (that may be the first of
+ a free cluster). */
+ struct
+ {
+ size_t size; /* Size (in blocks) of a free cluster. */
+ size_t next; /* Index of next free cluster. */
+ size_t prev; /* Index of previous free cluster. */
+ } free;
+ } malloc_info;
+
+/* List of blocks allocated with `mmemalign' (or `mvalloc'). */
+
+struct alignlist
+ {
+ struct alignlist *next;
+ PTR aligned; /* The address that mmemaligned returned. */
+ PTR exact; /* The address that malloc returned. */
+ };
+
+/* Doubly linked lists of free fragments. */
+
+struct list
+ {
+ struct list *next;
+ struct list *prev;
+ };
+
+/* Statistics available to the user.
+ FIXME: By design, the internals of the malloc package are no longer
+ exported to the user via an include file, so access to this data needs
+ to be via some other mechanism, such as mmstat_ where the
+ return value is the the user is interested in. */
+
+struct mstats
+ {
+ size_t bytes_total; /* Total size of the heap. */
+ size_t chunks_used; /* Chunks allocated by the user. */
+ size_t bytes_used; /* Byte total of user-allocated chunks. */
+ size_t chunks_free; /* Chunks in the free list. */
+ size_t bytes_free; /* Byte total of chunks in the free list. */
+ };
+
+/* Internal structure that defines the format of the malloc-descriptor.
+ This gets written to the base address of the region that mmalloc is
+ managing, and thus also becomes the file header for the mapped file,
+ if such a file exists. */
+
+struct mdesc
+{
+ /* The "magic number" for an mmalloc file. */
+
+ char magic[MMALLOC_MAGIC_SIZE];
+
+ /* The size in bytes of this structure, used as a sanity check when reusing
+ a previously created mapped file. */
+
+ unsigned int headersize;
+
+ /* The version number of the mmalloc package that created this file. */
+
+ unsigned char version;
+
+ /* Some flag bits to keep track of various internal things. */
+
+ unsigned int flags;
+
+ /* If a system call made by the mmalloc package fails, the errno is
+ preserved for future examination. */
+
+ int saved_errno;
+
+ /* Pointer to the function that is used to get more core, or return core
+ to the system, for requests using this malloc descriptor. For memory
+ mapped regions, this is the mmap() based routine. There may also be
+ a single malloc descriptor that points to an sbrk() based routine
+ for systems without mmap() or for applications that call the mmalloc()
+ package with a NULL malloc descriptor.
+
+ FIXME: For mapped regions shared by more than one process, this
+ needs to be maintained on a per-process basis. */
+
+ PTR (*morecore) PARAMS ((struct mdesc *, int));
+
+ /* Pointer to the function that causes an abort when the memory checking
+ features are activated. By default this is set to abort(), but can
+ be set to another function by the application using mmalloc().
+
+ FIXME: For mapped regions shared by more than one process, this
+ needs to be maintained on a per-process basis. */
+
+ void (*abortfunc) PARAMS ((void));
+
+ /* Debugging hook for free.
+
+ FIXME: For mapped regions shared by more than one process, this
+ needs to be maintained on a per-process basis. */
+
+ void (*mfree_hook) PARAMS ((PTR, PTR));
+
+ /* Debugging hook for `malloc'.
+
+ FIXME: For mapped regions shared by more than one process, this
+ needs to be maintained on a per-process basis. */
+
+ PTR (*mmalloc_hook) PARAMS ((PTR, size_t));
+
+ /* Debugging hook for realloc.
+
+ FIXME: For mapped regions shared by more than one process, this
+ needs to be maintained on a per-process basis. */
+
+ PTR (*mrealloc_hook) PARAMS ((PTR, PTR, size_t));
+
+ /* Number of info entries. */
+
+ size_t heapsize;
+
+ /* Pointer to first block of the heap (base of the first block). */
+
+ char *heapbase;
+
+ /* Current search index for the heap table. */
+ /* Search index in the info table. */
+
+ size_t heapindex;
+
+ /* Limit of valid info table indices. */
+
+ size_t heaplimit;
+
+ /* Block information table.
+ Allocated with malign/__mmalloc_free (not mmalloc/mfree). */
+ /* Table indexed by block number giving per-block information. */
+
+ malloc_info *heapinfo;
+
+ /* Instrumentation. */
+
+ struct mstats heapstats;
+
+ /* Free list headers for each fragment size. */
+ /* Free lists for each fragment size. */
+
+ struct list fraghead[BLOCKLOG];
+
+ /* List of blocks allocated by memalign. */
+
+ struct alignlist *aligned_blocks;
+
+ /* The base address of the memory region for this malloc heap. This
+ is the location where the bookkeeping data for mmap and for malloc
+ begins. */
+
+ char *base;
+
+ /* The current location in the memory region for this malloc heap which
+ represents the end of memory in use. */
+
+ char *breakval;
+
+ /* The end of the current memory region for this malloc heap. This is
+ the first location past the end of mapped memory. */
+
+ char *top;
+
+ /* Open file descriptor for the file to which this malloc heap is mapped.
+ This will always be a valid file descriptor, since /dev/zero is used
+ by default if no open file is supplied by the client. Also note that
+ it may change each time the region is mapped and unmapped. */
+
+ int fd;
+
+ /* An array of keys to data within the mapped region, for use by the
+ application. */
+
+ PTR keys[MMALLOC_KEYS];
+
+};
+
+/* Bits to look at in the malloc descriptor flags word */
+
+#define MMALLOC_DEVZERO (1 << 0) /* Have mapped to /dev/zero */
+#define MMALLOC_INITIALIZED (1 << 1) /* Initialized mmalloc */
+#define MMALLOC_MMCHECK_USED (1 << 2) /* mmcheckf() called already */
+
+/* Internal version of `mfree' used in `morecore'. */
+
+extern void __mmalloc_free PARAMS ((struct mdesc *, PTR));
+
+/* Hooks for debugging versions. */
+
+extern void (*__mfree_hook) PARAMS ((PTR, PTR));
+extern PTR (*__mmalloc_hook) PARAMS ((PTR, size_t));
+extern PTR (*__mrealloc_hook) PARAMS ((PTR, PTR, size_t));
+
+/* A default malloc descriptor for the single sbrk() managed region. */
+
+extern struct mdesc *__mmalloc_default_mdp;
+
+/* Initialize the first use of the default malloc descriptor, which uses
+ an sbrk() region. */
+
+extern struct mdesc *__mmalloc_sbrk_init PARAMS ((void));
+
+/* Grow or shrink a contiguous mapped region using mmap().
+ Works much like sbrk() */
+
+#if defined(HAVE_MMAP)
+
+extern PTR __mmalloc_mmap_morecore PARAMS ((struct mdesc *, int));
+
+#endif
+
+/* Remap a mmalloc region that was previously mapped. */
+
+extern PTR __mmalloc_remap_core PARAMS ((struct mdesc *));
+
+/* Macro to convert from a user supplied malloc descriptor to pointer to the
+ internal malloc descriptor. If the user supplied descriptor is NULL, then
+ use the default internal version, initializing it if necessary. Otherwise
+ just cast the user supplied version (which is void *) to the proper type
+ (struct mdesc *). */
+
+#define MD_TO_MDP(md) \
+ ((md) == NULL \
+ ? (__mmalloc_default_mdp == NULL \
+ ? __mmalloc_sbrk_init () \
+ : __mmalloc_default_mdp) \
+ : (struct mdesc *) (md))
+
+#endif /* __MMPRIVATE_H */
Index: mm.c
===================================================================
--- mm.c (nonexistent)
+++ mm.c (revision 1765)
@@ -0,0 +1,40 @@
+/* Build the entire mmalloc library as a single object module. This
+ avoids having clients pick up part of their allocation routines
+ from mmalloc and part from libc, which results in undefined
+ behavior. It should also still be possible to build the library
+ as a standard library with multiple objects.
+
+ Copyright 1996, 2000 Free Software Foundation
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_UNISTD_H
+#include /* Prototypes for lseek, sbrk (maybe) */
+#endif
+#include "mcalloc.c"
+#include "mfree.c"
+#include "mmalloc.c"
+#include "mmcheck.c"
+#include "mmemalign.c"
+#include "mmstats.c"
+#include "mmtrace.c"
+#include "mrealloc.c"
+#include "mvalloc.c"
+#include "mmap-sup.c"
+#include "attach.c"
+#include "detach.c"
+#include "keys.c"
+#include "sbrk-sup.c"
Index: mcalloc.c
===================================================================
--- mcalloc.c (nonexistent)
+++ mcalloc.c (revision 1765)
@@ -0,0 +1,54 @@
+/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include /* GCC on HP/UX needs this before string.h. */
+#include /* Prototypes for memcpy, memmove, memset, etc */
+
+#include "mmprivate.h"
+
+/* Allocate an array of NMEMB elements each SIZE bytes long.
+ The entire array is initialized to zeros. */
+
+PTR
+mcalloc (md, nmemb, size)
+ PTR md;
+ register size_t nmemb;
+ register size_t size;
+{
+ register PTR result;
+
+ if ((result = mmalloc (md, nmemb * size)) != NULL)
+ {
+ memset (result, 0, nmemb * size);
+ }
+ return (result);
+}
+
+/* When using this package, provide a version of malloc/realloc/free built
+ on top of it, so that if we use the default sbrk() region we will not
+ collide with another malloc package trying to do the same thing, if
+ the application contains any "hidden" calls to malloc/realloc/free (such
+ as inside a system library). */
+
+PTR
+calloc (nmemb, size)
+ size_t nmemb;
+ size_t size;
+{
+ return (mcalloc ((PTR) NULL, nmemb, size));
+}
Index: keys.c
===================================================================
--- keys.c (nonexistent)
+++ keys.c (revision 1765)
@@ -0,0 +1,66 @@
+/* Access for application keys in mmap'd malloc managed region.
+ Copyright 1992 Free Software Foundation, Inc.
+
+ Contributed by Fred Fish at Cygnus Support. fnf@cygnus.com
+
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* This module provides access to some keys that the application can use to
+ provide persistent access to locations in the mapped memory section.
+ The intent is that these keys are to be used sparingly as sort of
+ persistent global variables which the application can use to reinitialize
+ access to data in the mapped region.
+
+ For the moment, these keys are simply stored in the malloc descriptor
+ itself, in an array of fixed length. This should be fixed so that there
+ can be an unlimited number of keys, possibly using a multilevel access
+ scheme of some sort. */
+
+#include "mmprivate.h"
+
+int
+mmalloc_setkey (md, keynum, key)
+ PTR md;
+ int keynum;
+ PTR key;
+{
+ struct mdesc *mdp = (struct mdesc *) md;
+ int result = 0;
+
+ if ((mdp != NULL) && (keynum >= 0) && (keynum < MMALLOC_KEYS))
+ {
+ mdp -> keys [keynum] = key;
+ result++;
+ }
+ return (result);
+}
+
+PTR
+mmalloc_getkey (md, keynum)
+ PTR md;
+ int keynum;
+{
+ struct mdesc *mdp = (struct mdesc *) md;
+ PTR keyval = NULL;
+
+ if ((mdp != NULL) && (keynum >= 0) && (keynum < MMALLOC_KEYS))
+ {
+ keyval = mdp -> keys [keynum];
+ }
+ return (keyval);
+}
Index: mmalloc.c
===================================================================
--- mmalloc.c (nonexistent)
+++ mmalloc.c (revision 1765)
@@ -0,0 +1,337 @@
+/* Memory allocator `malloc'.
+ Copyright 1990, 1991, 1992 Free Software Foundation
+
+ Written May 1989 by Mike Haertel.
+ Heavily modified Mar 1992 by Fred Fish for mmap'd version.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+
+ The author may be reached (Email) at the address mike@ai.mit.edu,
+ or (US mail) as Mike Haertel c/o Free Software Foundation. */
+
+#include /* Prototypes for memcpy, memmove, memset, etc */
+
+#include "mmprivate.h"
+
+/* Prototypes for local functions */
+
+static int initialize PARAMS ((struct mdesc *));
+static PTR morecore PARAMS ((struct mdesc *, size_t));
+static PTR align PARAMS ((struct mdesc *, size_t));
+
+/* Aligned allocation. */
+
+static PTR
+align (mdp, size)
+ struct mdesc *mdp;
+ size_t size;
+{
+ PTR result;
+ unsigned long int adj;
+
+ result = mdp -> morecore (mdp, size);
+ adj = RESIDUAL (result, BLOCKSIZE);
+ if (adj != 0)
+ {
+ adj = BLOCKSIZE - adj;
+ mdp -> morecore (mdp, adj);
+ result = (char *) result + adj;
+ }
+ return (result);
+}
+
+/* Set everything up and remember that we have. */
+
+static int
+initialize (mdp)
+ struct mdesc *mdp;
+{
+ mdp -> heapsize = HEAP / BLOCKSIZE;
+ mdp -> heapinfo = (malloc_info *)
+ align (mdp, mdp -> heapsize * sizeof (malloc_info));
+ if (mdp -> heapinfo == NULL)
+ {
+ return (0);
+ }
+ memset ((PTR)mdp -> heapinfo, 0, mdp -> heapsize * sizeof (malloc_info));
+ mdp -> heapinfo[0].free.size = 0;
+ mdp -> heapinfo[0].free.next = mdp -> heapinfo[0].free.prev = 0;
+ mdp -> heapindex = 0;
+ mdp -> heapbase = (char *) mdp -> heapinfo;
+ mdp -> flags |= MMALLOC_INITIALIZED;
+ return (1);
+}
+
+/* Get neatly aligned memory, initializing or
+ growing the heap info table as necessary. */
+
+static PTR
+morecore (mdp, size)
+ struct mdesc *mdp;
+ size_t size;
+{
+ PTR result;
+ malloc_info *newinfo, *oldinfo;
+ size_t newsize;
+
+ result = align (mdp, size);
+ if (result == NULL)
+ {
+ return (NULL);
+ }
+
+ /* Check if we need to grow the info table. */
+ if ((size_t) BLOCK ((char *) result + size) > mdp -> heapsize)
+ {
+ newsize = mdp -> heapsize;
+ while ((size_t) BLOCK ((char *) result + size) > newsize)
+ {
+ newsize *= 2;
+ }
+ newinfo = (malloc_info *) align (mdp, newsize * sizeof (malloc_info));
+ if (newinfo == NULL)
+ {
+ mdp -> morecore (mdp, -size);
+ return (NULL);
+ }
+ memset ((PTR) newinfo, 0, newsize * sizeof (malloc_info));
+ memcpy ((PTR) newinfo, (PTR) mdp -> heapinfo,
+ mdp -> heapsize * sizeof (malloc_info));
+ oldinfo = mdp -> heapinfo;
+ newinfo[BLOCK (oldinfo)].busy.type = 0;
+ newinfo[BLOCK (oldinfo)].busy.info.size
+ = BLOCKIFY (mdp -> heapsize * sizeof (malloc_info));
+ mdp -> heapinfo = newinfo;
+ __mmalloc_free (mdp, (PTR)oldinfo);
+ mdp -> heapsize = newsize;
+ }
+
+ mdp -> heaplimit = BLOCK ((char *) result + size);
+ return (result);
+}
+
+/* Allocate memory from the heap. */
+
+PTR
+mmalloc (md, size)
+ PTR md;
+ size_t size;
+{
+ struct mdesc *mdp;
+ PTR result;
+ size_t block, blocks, lastblocks, start;
+ register size_t i;
+ struct list *next;
+ register size_t log;
+
+ if (size == 0)
+ {
+ return (NULL);
+ }
+
+ mdp = MD_TO_MDP (md);
+
+ if (mdp -> mmalloc_hook != NULL)
+ {
+ return ((*mdp -> mmalloc_hook) (md, size));
+ }
+
+ if (!(mdp -> flags & MMALLOC_INITIALIZED))
+ {
+ if (!initialize (mdp))
+ {
+ return (NULL);
+ }
+ }
+
+ if (size < sizeof (struct list))
+ {
+ size = sizeof (struct list);
+ }
+
+ /* Determine the allocation policy based on the request size. */
+ if (size <= BLOCKSIZE / 2)
+ {
+ /* Small allocation to receive a fragment of a block.
+ Determine the logarithm to base two of the fragment size. */
+ log = 1;
+ --size;
+ while ((size /= 2) != 0)
+ {
+ ++log;
+ }
+
+ /* Look in the fragment lists for a
+ free fragment of the desired size. */
+ next = mdp -> fraghead[log].next;
+ if (next != NULL)
+ {
+ /* There are free fragments of this size.
+ Pop a fragment out of the fragment list and return it.
+ Update the block's nfree and first counters. */
+ result = (PTR) next;
+ next -> prev -> next = next -> next;
+ if (next -> next != NULL)
+ {
+ next -> next -> prev = next -> prev;
+ }
+ block = BLOCK (result);
+ if (--mdp -> heapinfo[block].busy.info.frag.nfree != 0)
+ {
+ mdp -> heapinfo[block].busy.info.frag.first =
+ RESIDUAL (next -> next, BLOCKSIZE) >> log;
+ }
+
+ /* Update the statistics. */
+ mdp -> heapstats.chunks_used++;
+ mdp -> heapstats.bytes_used += 1 << log;
+ mdp -> heapstats.chunks_free--;
+ mdp -> heapstats.bytes_free -= 1 << log;
+ }
+ else
+ {
+ /* No free fragments of the desired size, so get a new block
+ and break it into fragments, returning the first. */
+ result = mmalloc (md, BLOCKSIZE);
+ if (result == NULL)
+ {
+ return (NULL);
+ }
+
+ /* Link all fragments but the first into the free list. */
+ for (i = 1; i < (size_t) (BLOCKSIZE >> log); ++i)
+ {
+ next = (struct list *) ((char *) result + (i << log));
+ next -> next = mdp -> fraghead[log].next;
+ next -> prev = &mdp -> fraghead[log];
+ next -> prev -> next = next;
+ if (next -> next != NULL)
+ {
+ next -> next -> prev = next;
+ }
+ }
+
+ /* Initialize the nfree and first counters for this block. */
+ block = BLOCK (result);
+ mdp -> heapinfo[block].busy.type = log;
+ mdp -> heapinfo[block].busy.info.frag.nfree = i - 1;
+ mdp -> heapinfo[block].busy.info.frag.first = i - 1;
+
+ mdp -> heapstats.chunks_free += (BLOCKSIZE >> log) - 1;
+ mdp -> heapstats.bytes_free += BLOCKSIZE - (1 << log);
+ mdp -> heapstats.bytes_used -= BLOCKSIZE - (1 << log);
+ }
+ }
+ else
+ {
+ /* Large allocation to receive one or more blocks.
+ Search the free list in a circle starting at the last place visited.
+ If we loop completely around without finding a large enough
+ space we will have to get more memory from the system. */
+ blocks = BLOCKIFY(size);
+ start = block = MALLOC_SEARCH_START;
+ while (mdp -> heapinfo[block].free.size < blocks)
+ {
+ block = mdp -> heapinfo[block].free.next;
+ if (block == start)
+ {
+ /* Need to get more from the system. Check to see if
+ the new core will be contiguous with the final free
+ block; if so we don't need to get as much. */
+ block = mdp -> heapinfo[0].free.prev;
+ lastblocks = mdp -> heapinfo[block].free.size;
+ if (mdp -> heaplimit != 0 &&
+ block + lastblocks == mdp -> heaplimit &&
+ mdp -> morecore (mdp, 0) == ADDRESS(block + lastblocks) &&
+ (morecore (mdp, (blocks - lastblocks) * BLOCKSIZE)) != NULL)
+ {
+ /* Which block we are extending (the `final free
+ block' referred to above) might have changed, if
+ it got combined with a freed info table. */
+ block = mdp -> heapinfo[0].free.prev;
+
+ mdp -> heapinfo[block].free.size += (blocks - lastblocks);
+ mdp -> heapstats.bytes_free +=
+ (blocks - lastblocks) * BLOCKSIZE;
+ continue;
+ }
+ result = morecore(mdp, blocks * BLOCKSIZE);
+ if (result == NULL)
+ {
+ return (NULL);
+ }
+ block = BLOCK (result);
+ mdp -> heapinfo[block].busy.type = 0;
+ mdp -> heapinfo[block].busy.info.size = blocks;
+ mdp -> heapstats.chunks_used++;
+ mdp -> heapstats.bytes_used += blocks * BLOCKSIZE;
+ return (result);
+ }
+ }
+
+ /* At this point we have found a suitable free list entry.
+ Figure out how to remove what we need from the list. */
+ result = ADDRESS(block);
+ if (mdp -> heapinfo[block].free.size > blocks)
+ {
+ /* The block we found has a bit left over,
+ so relink the tail end back into the free list. */
+ mdp -> heapinfo[block + blocks].free.size
+ = mdp -> heapinfo[block].free.size - blocks;
+ mdp -> heapinfo[block + blocks].free.next
+ = mdp -> heapinfo[block].free.next;
+ mdp -> heapinfo[block + blocks].free.prev
+ = mdp -> heapinfo[block].free.prev;
+ mdp -> heapinfo[mdp -> heapinfo[block].free.prev].free.next
+ = mdp -> heapinfo[mdp -> heapinfo[block].free.next].free.prev
+ = mdp -> heapindex = block + blocks;
+ }
+ else
+ {
+ /* The block exactly matches our requirements,
+ so just remove it from the list. */
+ mdp -> heapinfo[mdp -> heapinfo[block].free.next].free.prev
+ = mdp -> heapinfo[block].free.prev;
+ mdp -> heapinfo[mdp -> heapinfo[block].free.prev].free.next
+ = mdp -> heapindex = mdp -> heapinfo[block].free.next;
+ mdp -> heapstats.chunks_free--;
+ }
+
+ mdp -> heapinfo[block].busy.type = 0;
+ mdp -> heapinfo[block].busy.info.size = blocks;
+ mdp -> heapstats.chunks_used++;
+ mdp -> heapstats.bytes_used += blocks * BLOCKSIZE;
+ mdp -> heapstats.bytes_free -= blocks * BLOCKSIZE;
+ }
+
+ return (result);
+}
+
+/* When using this package, provide a version of malloc/realloc/free built
+ on top of it, so that if we use the default sbrk() region we will not
+ collide with another malloc package trying to do the same thing, if
+ the application contains any "hidden" calls to malloc/realloc/free (such
+ as inside a system library). */
+
+PTR
+malloc (size)
+ size_t size;
+{
+ PTR result;
+
+ result = mmalloc ((PTR) NULL, size);
+ return (result);
+}
Index: TODO
===================================================================
--- TODO (nonexistent)
+++ TODO (revision 1765)
@@ -0,0 +1,17 @@
+Things that still need attention:
+
+ * Make implementation changes necessary to allow multiple processes
+ to use the mmalloc managed region simultaneously. This requires,
+ at the minimum, some sort of cooperative locking that ensures that
+ only one process at a time is changing any of the mmalloc managed
+ data structures (its ok for the mmalloc managed data regions to be
+ changed at any time since we don't care about their contents).
+
+ * In order to support multiple processes using the mmalloc managed
+ region, the malloc descriptor needs to be broken into two parts,
+ one part which is specific to the given process and is maintained
+ separately on a per process basis, and another part which is common
+ to all processes. As an example, the file descriptor is specific
+ to a given process, as are the morecore and abortfunc pointers.
+ However magic[], the version number, the flags field, etc are
+ common to all processes.
Index: acinclude.m4
===================================================================
--- acinclude.m4 (nonexistent)
+++ acinclude.m4 (revision 1765)
@@ -0,0 +1 @@
+sinclude(../bfd/acinclude.m4)
Index: mmstats.c
===================================================================
--- mmstats.c (nonexistent)
+++ mmstats.c (revision 1765)
@@ -0,0 +1,46 @@
+/* Access the statistics maintained by `mmalloc'.
+ Copyright 1990, 1991, 1992 Free Software Foundation
+
+ Written May 1989 by Mike Haertel.
+ Modified Mar 1992 by Fred Fish. (fnf@cygnus.com)
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+
+ The author may be reached (Email) at the address mike@ai.mit.edu,
+ or (US mail) as Mike Haertel c/o Free Software Foundation. */
+
+#include "mmprivate.h"
+
+/* FIXME: See the comment in mmprivate.h where struct mstats is defined.
+ None of the internal mmalloc structures should be externally visible
+ outside the library. */
+
+struct mstats
+mmstats (md)
+ PTR md;
+{
+ struct mstats result;
+ struct mdesc *mdp;
+
+ mdp = MD_TO_MDP (md);
+ result.bytes_total =
+ (char *) mdp -> morecore (mdp, 0) - mdp -> heapbase;
+ result.chunks_used = mdp -> heapstats.chunks_used;
+ result.bytes_used = mdp -> heapstats.bytes_used;
+ result.chunks_free = mdp -> heapstats.chunks_free;
+ result.bytes_free = mdp -> heapstats.bytes_free;
+ return (result);
+}
Index: mmtrace.awk
===================================================================
--- mmtrace.awk (nonexistent)
+++ mmtrace.awk (revision 1765)
@@ -0,0 +1,36 @@
+#
+# Awk program to analyze mtrace.c output.
+#
+$1 == "+" { if (allocated[$2] != "")
+ print "+", $2, "Alloc", NR, "duplicate:", allocated[$2];
+ else
+ allocated[$2] = $3;
+ }
+$1 == "-" { if (allocated[$2] != "") {
+ allocated[$2] = "";
+ if (allocated[$2] != "")
+ print "DELETE FAILED", $2, allocated[$2];
+ } else
+ print "-", $2, "Free", NR, "was never alloc'd";
+ }
+$1 == "<" { if (allocated[$2] != "")
+ allocated[$2] = "";
+ else
+ print "-", $2, "Realloc", NR, "was never alloc'd";
+ }
+$1 == ">" { if (allocated[$2] != "")
+ print "+", $2, "Realloc", NR, "duplicate:", allocated[$2];
+ else
+ allocated[$2] = $3;
+ }
+
+# Ignore "= Start"
+$1 == "=" { }
+# Ignore failed realloc attempts for now
+$1 == "!" { }
+
+
+END { for (x in allocated)
+ if (allocated[x] != "")
+ print "+", x, allocated[x];
+ }
Index: mmtrace.c
===================================================================
--- mmtrace.c (nonexistent)
+++ mmtrace.c (revision 1765)
@@ -0,0 +1,171 @@
+/* More debugging hooks for `mmalloc'.
+ Copyright 1991, 1992, 1994 Free Software Foundation
+
+ Written April 2, 1991 by John Gilmore of Cygnus Support
+ Based on mcheck.c by Mike Haertel.
+ Modified Mar 1992 by Fred Fish. (fnf@cygnus.com)
+
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include
+#include "mmprivate.h"
+
+static void tr_break PARAMS ((void));
+static void tr_freehook PARAMS ((PTR, PTR));
+static PTR tr_mallochook PARAMS ((PTR, size_t));
+static PTR tr_reallochook PARAMS ((PTR, PTR, size_t));
+
+#ifndef __GNU_LIBRARY__
+extern char *getenv ();
+#endif
+
+static FILE *mallstream;
+
+#if 0 /* FIXME: Disabled for now. */
+static char mallenv[] = "MALLOC_TRACE";
+static char mallbuf[BUFSIZ]; /* Buffer for the output. */
+#endif
+
+/* Address to breakpoint on accesses to... */
+static PTR mallwatch;
+
+/* Old hook values. */
+
+static void (*old_mfree_hook) PARAMS ((PTR, PTR));
+static PTR (*old_mmalloc_hook) PARAMS ((PTR, size_t));
+static PTR (*old_mrealloc_hook) PARAMS ((PTR, PTR, size_t));
+
+/* This function is called when the block being alloc'd, realloc'd, or
+ freed has an address matching the variable "mallwatch". In a debugger,
+ set "mallwatch" to the address of interest, then put a breakpoint on
+ tr_break. */
+
+static void
+tr_break ()
+{
+}
+
+static void
+tr_freehook (md, ptr)
+ PTR md;
+ PTR ptr;
+{
+ struct mdesc *mdp;
+
+ mdp = MD_TO_MDP (md);
+ /* Be sure to print it first. */
+ fprintf (mallstream, "- %08lx\n", (unsigned long) ptr);
+ if (ptr == mallwatch)
+ tr_break ();
+ mdp -> mfree_hook = old_mfree_hook;
+ mfree (md, ptr);
+ mdp -> mfree_hook = tr_freehook;
+}
+
+static PTR
+tr_mallochook (md, size)
+ PTR md;
+ size_t size;
+{
+ PTR hdr;
+ struct mdesc *mdp;
+
+ mdp = MD_TO_MDP (md);
+ mdp -> mmalloc_hook = old_mmalloc_hook;
+ hdr = (PTR) mmalloc (md, size);
+ mdp -> mmalloc_hook = tr_mallochook;
+
+ /* We could be printing a NULL here; that's OK. */
+ fprintf (mallstream, "+ %08lx %x\n", (unsigned long) hdr, size);
+
+ if (hdr == mallwatch)
+ tr_break ();
+
+ return (hdr);
+}
+
+static PTR
+tr_reallochook (md, ptr, size)
+ PTR md;
+ PTR ptr;
+ size_t size;
+{
+ PTR hdr;
+ struct mdesc *mdp;
+
+ mdp = MD_TO_MDP (md);
+
+ if (ptr == mallwatch)
+ tr_break ();
+
+ mdp -> mfree_hook = old_mfree_hook;
+ mdp -> mmalloc_hook = old_mmalloc_hook;
+ mdp -> mrealloc_hook = old_mrealloc_hook;
+ hdr = (PTR) mrealloc (md, ptr, size);
+ mdp -> mfree_hook = tr_freehook;
+ mdp -> mmalloc_hook = tr_mallochook;
+ mdp -> mrealloc_hook = tr_reallochook;
+ if (hdr == NULL)
+ /* Failed realloc. */
+ fprintf (mallstream, "! %08lx %x\n", (unsigned long) ptr, size);
+ else
+ fprintf (mallstream, "< %08lx\n> %08lx %x\n", (unsigned long) ptr,
+ (unsigned long) hdr, size);
+
+ if (hdr == mallwatch)
+ tr_break ();
+
+ return hdr;
+}
+
+/* We enable tracing if either the environment variable MALLOC_TRACE
+ is set, or if the variable mallwatch has been patched to an address
+ that the debugging user wants us to stop on. When patching mallwatch,
+ don't forget to set a breakpoint on tr_break! */
+
+int
+mmtrace ()
+{
+#if 0 /* FIXME! This is disabled for now until we figure out how to
+ maintain a stack of hooks per heap, since we might have other
+ hooks (such as set by mmcheck/mmcheckf) active also. */
+ char *mallfile;
+
+ mallfile = getenv (mallenv);
+ if (mallfile != NULL || mallwatch != NULL)
+ {
+ mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "w");
+ if (mallstream != NULL)
+ {
+ /* Be sure it doesn't mmalloc its buffer! */
+ setbuf (mallstream, mallbuf);
+ fprintf (mallstream, "= Start\n");
+ old_mfree_hook = mdp -> mfree_hook;
+ mdp -> mfree_hook = tr_freehook;
+ old_mmalloc_hook = mdp -> mmalloc_hook;
+ mdp -> mmalloc_hook = tr_mallochook;
+ old_mrealloc_hook = mdp -> mrealloc_hook;
+ mdp -> mrealloc_hook = tr_reallochook;
+ }
+ }
+
+#endif /* 0 */
+
+ return (1);
+}
+
Index: detach.c
===================================================================
--- detach.c (nonexistent)
+++ detach.c (revision 1765)
@@ -0,0 +1,71 @@
+/* Finish access to a mmap'd malloc managed region.
+ Copyright 1992 Free Software Foundation, Inc.
+
+ Contributed by Fred Fish at Cygnus Support. fnf@cygnus.com
+
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include
+#include "mmprivate.h"
+
+/* Terminate access to a mmalloc managed region by unmapping all memory pages
+ associated with the region, and closing the file descriptor if it is one
+ that we opened.
+
+ 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 by examining the preserved errno value.
+
+ Note that the malloc descriptor that we are using is currently located in
+ region we are about to unmap, so we first make a local copy of it on the
+ stack and use the copy. */
+
+PTR
+mmalloc_detach (md)
+ PTR md;
+{
+ struct mdesc mtemp;
+
+ if (md != NULL)
+ {
+
+ mtemp = *(struct mdesc *) md;
+
+ /* Now unmap all the pages associated with this region by asking for a
+ negative increment equal to the current size of the region. */
+
+ if ((mtemp.morecore (&mtemp, mtemp.base - mtemp.breakval)) == NULL)
+ {
+ /* Deallocating failed. Update the original malloc descriptor
+ with any changes */
+ *(struct mdesc *) md = mtemp;
+ }
+ else
+ {
+ if (mtemp.flags & MMALLOC_DEVZERO)
+ {
+ close (mtemp.fd);
+ }
+ md = NULL;
+ }
+ }
+
+ return (md);
+}
Index: mmalloc.h
===================================================================
--- mmalloc.h (nonexistent)
+++ mmalloc.h (revision 1765)
@@ -0,0 +1,62 @@
+#ifndef MMALLOC_H
+#define MMALLOC_H 1
+
+#ifdef HAVE_STDDEF_H
+# include
+#else
+# include /* for size_t */
+# include /* for NULL */
+#endif
+
+#include "ansidecl.h"
+
+/* Allocate SIZE bytes of memory. */
+
+extern PTR mmalloc PARAMS ((PTR, size_t));
+
+/* Re-allocate the previously allocated block in PTR, making the new block
+ SIZE bytes long. */
+
+extern PTR mrealloc PARAMS ((PTR, PTR, size_t));
+
+/* Allocate NMEMB elements of SIZE bytes each, all initialized to 0. */
+
+extern PTR mcalloc PARAMS ((PTR, size_t, size_t));
+
+/* Free a block allocated by `mmalloc', `mrealloc' or `mcalloc'. */
+
+extern void mfree PARAMS ((PTR, PTR));
+
+/* Allocate SIZE bytes allocated to ALIGNMENT bytes. */
+
+extern PTR mmemalign PARAMS ((PTR, size_t, size_t));
+
+/* Allocate SIZE bytes on a page boundary. */
+
+extern PTR mvalloc PARAMS ((PTR, size_t));
+
+/* Activate a standard collection of debugging hooks. */
+
+extern int mmcheck PARAMS ((PTR, void (*) (void)));
+
+extern int mmcheckf PARAMS ((PTR, void (*) (void), int));
+
+/* Pick up the current statistics. (see FIXME elsewhere) */
+
+extern struct mstats mmstats PARAMS ((PTR));
+
+extern PTR mmalloc_attach PARAMS ((int, PTR));
+
+extern PTR mmalloc_detach PARAMS ((PTR));
+
+extern int mmalloc_setkey PARAMS ((PTR, int, PTR));
+
+extern PTR mmalloc_getkey PARAMS ((PTR, int));
+
+extern int mmalloc_errno PARAMS ((PTR));
+
+extern int mmtrace PARAMS ((void));
+
+extern PTR mmalloc_findbase PARAMS ((int));
+
+#endif /* MMALLOC_H */
Index: MAINTAINERS
===================================================================
--- MAINTAINERS (nonexistent)
+++ MAINTAINERS (revision 1765)
@@ -0,0 +1,5 @@
+The mmalloc directory is maintained by the GDB group's Host
+maintainers.
+
+This code is in a maintain-only phase - only configury patches fixing
+host compile problems are generally accepted.
Index: COPYING.LIB
===================================================================
--- COPYING.LIB (nonexistent)
+++ COPYING.LIB (revision 1765)
@@ -0,0 +1,481 @@
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ , 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
Index: aclocal.m4
===================================================================
--- aclocal.m4 (nonexistent)
+++ aclocal.m4 (revision 1765)
@@ -0,0 +1,14 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4
+
+dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+sinclude(../bfd/acinclude.m4)
+
Index: mmalloc.info
===================================================================
--- mmalloc.info (nonexistent)
+++ mmalloc.info (revision 1765)
@@ -0,0 +1,219 @@
+This is ./mmalloc.info, produced by makeinfo version 4.1 from
+mmalloc.texi.
+
+START-INFO-DIR-ENTRY
+* Mmalloc: (mmalloc). The GNU mapped-malloc package.
+END-INFO-DIR-ENTRY
+
+ This file documents the GNU mmalloc (mapped-malloc) package, written
+by fnf@cygnus.com, based on GNU malloc written by mike@ai.mit.edu.
+
+ Copyright (C) 1992 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the entire resulting derived work is distributed under the terms
+of a permission notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions.
+
+
+File: mmalloc.info, Node: Top, Next: Overview, Prev: (dir), Up: (dir)
+
+mmalloc
+*******
+
+ This file documents the GNU memory-mapped malloc package mmalloc.
+
+* Menu:
+
+* Overview:: Overall Description
+* Implementation:: Implementation
+
+ --- The Detailed Node Listing ---
+
+Implementation
+
+* Compatibility:: Backwards Compatibility
+* Functions:: Function Descriptions
+
+
+File: mmalloc.info, Node: Overview, Next: Implementation, Prev: Top, Up: Top
+
+Overall Description
+*******************
+
+ This is a heavily modified version of GNU `malloc'. It uses `mmap'
+as the basic mechanism for obtaining memory from the system, rather
+than `sbrk'. This gives it several advantages over the more
+traditional malloc:
+
+ * Several different heaps can be used, each of them growing or
+ shinking under control of `mmap', with the `mmalloc' functions
+ using a specific heap on a call by call basis.
+
+ * By using `mmap', it is easy to create heaps which are intended to
+ be persistent and exist as a filesystem object after the creating
+ process has gone away.
+
+ * Because multiple heaps can be managed, data used for a specific
+ purpose can be allocated into its own heap, making it easier to
+ allow applications to "dump" and "restore" initialized
+ malloc-managed memory regions. For example, the "unexec" hack
+ popularized by GNU Emacs could potentially go away.
+
+
+File: mmalloc.info, Node: Implementation, Prev: Overview, Up: Top
+
+Implementation
+**************
+
+ The `mmalloc' functions contain no internal static state. All
+`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 `mmalloc' which memory region it
+is dealing with (along with other information). This parameter is
+called the "malloc descriptor".
+
+ 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);
+
+* Menu:
+
+* Compatibility:: Backwards Compatibility
+* Functions:: Function Descriptions
+
+
+File: mmalloc.info, Node: Compatibility, Next: Functions, Prev: Implementation, Up: Implementation
+
+Backwards Compatibility
+=======================
+
+ To allow a single malloc package to be used in a given application,
+provision is made for the traditional `malloc', `realloc', and `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 `sbrk' managed region. The
+`mmalloc' package provides compatible `malloc', `realloc', and `free'
+functions using this mechanism internally. Applications can avoid this
+extra interface layer by simply including the following defines:
+
+ #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', and `free' calls with the
+above patterns if using `#define' causes problems.
+
+
+File: mmalloc.info, Node: Functions, Prev: Compatibility, Up: Implementation
+
+Function Descriptions
+=====================
+
+ These are the details on the functions that make up the `mmalloc'
+package.
+
+`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 its 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 identified by the
+ descriptor MD, 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.
+
+`*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. (This function is
+ not yet implemented).
+
+
+
+Tag Table:
+Node: Top937
+Node: Overview1373
+Node: Implementation2401
+Node: Compatibility3794
+Node: Functions4868
+
+End Tag Table
Index: mvalloc.c
===================================================================
--- mvalloc.c (nonexistent)
+++ mvalloc.c (revision 1765)
@@ -0,0 +1,50 @@
+/* Allocate memory on a page boundary.
+ Copyright (C) 1991 Free Software Foundation, Inc.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include "mmprivate.h"
+
+/* Cache the pagesize for the current host machine. Note that if the host
+ does not readily provide a getpagesize() function, we need to emulate it
+ elsewhere, not clutter up this file with lots of kluges to try to figure
+ it out. */
+
+static size_t cache_pagesize;
+#if NEED_DECLARATION_GETPAGESIZE
+extern int getpagesize PARAMS ((void));
+#endif
+
+PTR
+mvalloc (md, size)
+ PTR md;
+ size_t size;
+{
+ if (cache_pagesize == 0)
+ {
+ cache_pagesize = getpagesize ();
+ }
+
+ return (mmemalign (md, cache_pagesize, size));
+}
+
+
+PTR
+valloc (size)
+ size_t size;
+{
+ return mvalloc ((PTR) NULL, size);
+}