\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$}  % 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
