casa  $Rev:20696$
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
malloc.h
Go to the documentation of this file.
00001 //# malloc.h: malloc functions from Doug Lea
00002 //# Copyright (C) 1996,1999,2001
00003 //# Associated Universities, Inc. Washington DC, USA.
00004 //#
00005 //# This library is free software; you can redistribute it and/or modify it
00006 //# under the terms of the GNU Library General Public License as published by
00007 //# the Free Software Foundation; either version 2 of the License, or (at your
00008 //# option) any later version.
00009 //#
00010 //# This library is distributed in the hope that it will be useful, but WITHOUT
00011 //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00012 //# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
00013 //# License for more details.
00014 //#
00015 //# You should have received a copy of the GNU Library General Public License
00016 //# along with this library; if not, write to the Free Software Foundation,
00017 //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
00018 //#
00019 //# Correspondence concerning AIPS++ should be addressed as follows:
00020 //#        Internet email: aips2-request@nrao.edu.
00021 //#        Postal address: AIPS++ Project Office
00022 //#                        National Radio Astronomy Observatory
00023 //#                        520 Edgemont Road
00024 //#                        Charlottesville, VA 22903-2475 USA
00025 //#
00026 //# $Id: malloc.h 21022 2011-03-01 10:07:47Z gervandiepen $
00027 
00028 #if !defined(AIPS_NO_LEA_MALLOC)
00029 
00030 #ifndef CASA_MALLOC_H
00031 #define CASA_MALLOC_H
00032 
00033 
00034 /* 
00035   A version of malloc/free/realloc written by Doug Lea and released to the 
00036   public domain.  Send questions/comments/complaints/performance data
00037   to dl@cs.oswego.edu
00038 
00039 * VERSION 2.6.5  Wed Jun 17 15:55:16 1998  Doug Lea  (dl at gee)
00040 */
00041 
00042 /* The only AIPS++ changes from the distribution are:
00043    1. Added AIPS++ copyright notice and guard.
00044    2. Compile to nothing for linux since we already get GNU malloc there.
00045    3. If AIPS_DEBUG is set compile this malloc with DEBUG on.
00046 */
00047 
00048 #if defined(AIPS_LINUX)
00049 /* IS linux. Include malloc.h so we only have to include casa/OS/malloc.h 
00050    without an ifdef on OS.
00051 */
00052 #include <malloc.h>
00053 #else
00054 /* NOT linux */
00055 
00056 #if defined(AIPS_DEBUG)
00057 /* Hopefully not too expensive. If so we can turn it off. */
00058 #define DEBUG 1
00059 #endif
00060 
00061 /*
00062   Default header file for malloc-2.8.x, written by Doug Lea
00063   and released to the public domain, as explained at
00064   http://creativecommons.org/licenses/publicdomain. 
00065  
00066   last update: Wed May 27 14:25:17 2009  Doug Lea  (dl at gee)
00067 
00068   This header is for ANSI C/C++ only.  You can set any of
00069   the following #defines before including:
00070 
00071   * If USE_DL_PREFIX is defined, it is assumed that malloc.c 
00072     was also compiled with this option, so all routines
00073     have names starting with "dl".
00074 
00075   * If HAVE_USR_INCLUDE_MALLOC_H is defined, it is assumed that this
00076     file will be #included AFTER <malloc.h>. This is needed only if
00077     your system defines a struct mallinfo that is incompatible with the
00078     standard one declared here.  Otherwise, you can include this file
00079     INSTEAD of your system system <malloc.h>.  At least on ANSI, all
00080     declarations should be compatible with system versions
00081 
00082   * If MSPACES is defined, declarations for mspace versions are included.
00083 */
00084 
00085 #ifndef MALLOC_280_H
00086 #define MALLOC_280_H
00087 
00088 #ifdef __cplusplus
00089 extern "C" {
00090 #endif
00091 
00092 #include <stddef.h>   /* for size_t */
00093 
00094 #ifndef ONLY_MSPACES
00095 #define ONLY_MSPACES 0     /* define to a value */
00096 #endif  /* ONLY_MSPACES */
00097 #ifndef NO_MALLINFO
00098 #define NO_MALLINFO 0
00099 #endif  /* NO_MALLINFO */
00100 
00101 
00102 #if !ONLY_MSPACES
00103 
00104 #ifndef USE_DL_PREFIX
00105 #define dlcalloc               calloc
00106 #define dlfree                 free
00107 #define dlmalloc               malloc
00108 #define dlmemalign             memalign
00109 #define dlrealloc              realloc
00110 #define dlvalloc               valloc
00111 #define dlpvalloc              pvalloc
00112 #define dlmallinfo             mallinfo
00113 #define dlmallopt              mallopt
00114 #define dlmalloc_trim          malloc_trim
00115 #define dlmalloc_stats         malloc_stats
00116 #define dlmalloc_usable_size   malloc_usable_size
00117 #define dlmalloc_footprint     malloc_footprint
00118 #define dlindependent_calloc   independent_calloc
00119 #define dlindependent_comalloc independent_comalloc
00120 #endif /* USE_DL_PREFIX */
00121 #if !NO_MALLINFO 
00122 #ifndef HAVE_USR_INCLUDE_MALLOC_H
00123 #ifndef _MALLOC_H
00124 #ifndef MALLINFO_FIELD_TYPE
00125 #define MALLINFO_FIELD_TYPE size_t
00126 #endif /* MALLINFO_FIELD_TYPE */
00127 #ifndef STRUCT_MALLINFO_DECLARED
00128 #define STRUCT_MALLINFO_DECLARED 1
00129 struct mallinfo {
00130   MALLINFO_FIELD_TYPE arena;    /* non-mmapped space allocated from system */
00131   MALLINFO_FIELD_TYPE ordblks;  /* number of free chunks */
00132   MALLINFO_FIELD_TYPE smblks;   /* always 0 */
00133   MALLINFO_FIELD_TYPE hblks;    /* always 0 */
00134   MALLINFO_FIELD_TYPE hblkhd;   /* space in mmapped regions */
00135   MALLINFO_FIELD_TYPE usmblks;  /* maximum total allocated space */
00136   MALLINFO_FIELD_TYPE fsmblks;  /* always 0 */
00137   MALLINFO_FIELD_TYPE uordblks; /* total allocated space */
00138   MALLINFO_FIELD_TYPE fordblks; /* total free space */
00139   MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */
00140 };
00141 #endif /* STRUCT_MALLINFO_DECLARED */
00142 #endif  /* _MALLOC_H */
00143 #endif  /* HAVE_USR_INCLUDE_MALLOC_H */
00144 #endif  /* !NO_MALLINFO */
00145 
00146 /*
00147   malloc(size_t n)
00148   Returns a pointer to a newly allocated chunk of at least n bytes, or
00149   null if no space is available, in which case errno is set to ENOMEM
00150   on ANSI C systems.
00151 
00152   If n is zero, malloc returns a minimum-sized chunk. (The minimum
00153   size is 16 bytes on most 32bit systems, and 32 bytes on 64bit
00154   systems.)  Note that size_t is an unsigned type, so calls with
00155   arguments that would be negative if signed are interpreted as
00156   requests for huge amounts of space, which will often fail. The
00157   maximum supported value of n differs across systems, but is in all
00158   cases less than the maximum representable value of a size_t.
00159 */
00160 void* dlmalloc(size_t);
00161 
00162 /*
00163   free(void* p)
00164   Releases the chunk of memory pointed to by p, that had been previously
00165   allocated using malloc or a related routine such as realloc.
00166   It has no effect if p is null. If p was not malloced or already
00167   freed, free(p) will by default cuase the current program to abort.
00168 */
00169 void  dlfree(void*);
00170 
00171 /*
00172   calloc(size_t n_elements, size_t element_size);
00173   Returns a pointer to n_elements * element_size bytes, with all locations
00174   set to zero.
00175 */
00176 void* dlcalloc(size_t, size_t);
00177 
00178 /*
00179   realloc(void* p, size_t n)
00180   Returns a pointer to a chunk of size n that contains the same data
00181   as does chunk p up to the minimum of (n, p's size) bytes, or null
00182   if no space is available.
00183 
00184   The returned pointer may or may not be the same as p. The algorithm
00185   prefers extending p in most cases when possible, otherwise it
00186   employs the equivalent of a malloc-copy-free sequence.
00187 
00188   If p is null, realloc is equivalent to malloc.
00189 
00190   If space is not available, realloc returns null, errno is set (if on
00191   ANSI) and p is NOT freed.
00192 
00193   if n is for fewer bytes than already held by p, the newly unused
00194   space is lopped off and freed if possible.  realloc with a size
00195   argument of zero (re)allocates a minimum-sized chunk.
00196 
00197   The old unix realloc convention of allowing the last-free'd chunk
00198   to be used as an argument to realloc is not supported.
00199 */
00200 
00201 void* dlrealloc(void*, size_t);
00202 
00203 /*
00204   memalign(size_t alignment, size_t n);
00205   Returns a pointer to a newly allocated chunk of n bytes, aligned
00206   in accord with the alignment argument.
00207 
00208   The alignment argument should be a power of two. If the argument is
00209   not a power of two, the nearest greater power is used.
00210   8-byte alignment is guaranteed by normal malloc calls, so don't
00211   bother calling memalign with an argument of 8 or less.
00212 
00213   Overreliance on memalign is a sure way to fragment space.
00214 */
00215 void* dlmemalign(size_t, size_t);
00216 
00217 /*
00218   valloc(size_t n);
00219   Equivalent to memalign(pagesize, n), where pagesize is the page
00220   size of the system. If the pagesize is unknown, 4096 is used.
00221 */
00222 void* dlvalloc(size_t);
00223 
00224 /*
00225   mallopt(int parameter_number, int parameter_value)
00226   Sets tunable parameters The format is to provide a
00227   (parameter-number, parameter-value) pair.  mallopt then sets the
00228   corresponding parameter to the argument value if it can (i.e., so
00229   long as the value is meaningful), and returns 1 if successful else
00230   0.  SVID/XPG/ANSI defines four standard param numbers for mallopt,
00231   normally defined in malloc.h.  None of these are use in this malloc,
00232   so setting them has no effect. But this malloc also supports other
00233   options in mallopt:
00234 
00235   Symbol            param #  default    allowed param values
00236   M_TRIM_THRESHOLD     -1   2*1024*1024   any   (-1U disables trimming)
00237   M_GRANULARITY        -2     page size   any power of 2 >= page size
00238   M_MMAP_THRESHOLD     -3      256*1024   any   (or 0 if no MMAP support)
00239 */
00240 int dlmallopt(int, int);
00241 
00242 #define M_TRIM_THRESHOLD     (-1)
00243 #define M_GRANULARITY        (-2)
00244 #define M_MMAP_THRESHOLD     (-3)
00245 
00246 
00247 /*
00248   malloc_footprint();
00249   Returns the number of bytes obtained from the system.  The total
00250   number of bytes allocated by malloc, realloc etc., is less than this
00251   value. Unlike mallinfo, this function returns only a precomputed
00252   result, so can be called frequently to monitor memory consumption.
00253   Even if locks are otherwise defined, this function does not use them,
00254   so results might not be up to date.
00255 */
00256 size_t dlmalloc_footprint();
00257 
00258 #if !NO_MALLINFO
00259 /*
00260   mallinfo()
00261   Returns (by copy) a struct containing various summary statistics:
00262 
00263   arena:     current total non-mmapped bytes allocated from system
00264   ordblks:   the number of free chunks
00265   smblks:    always zero.
00266   hblks:     current number of mmapped regions
00267   hblkhd:    total bytes held in mmapped regions
00268   usmblks:   the maximum total allocated space. This will be greater
00269                 than current total if trimming has occurred.
00270   fsmblks:   always zero
00271   uordblks:  current total allocated space (normal or mmapped)
00272   fordblks:  total free space
00273   keepcost:  the maximum number of bytes that could ideally be released
00274                back to system via malloc_trim. ("ideally" means that
00275                it ignores page restrictions etc.)
00276 
00277   Because these fields are ints, but internal bookkeeping may
00278   be kept as longs, the reported values may wrap around zero and
00279   thus be inaccurate.
00280 */
00281 
00282 struct mallinfo dlmallinfo(void);
00283 #endif  /* NO_MALLINFO */
00284 
00285 /*
00286   independent_calloc(size_t n_elements, size_t element_size, void* chunks[]);
00287 
00288   independent_calloc is similar to calloc, but instead of returning a
00289   single cleared space, it returns an array of pointers to n_elements
00290   independent elements that can hold contents of size elem_size, each
00291   of which starts out cleared, and can be independently freed,
00292   realloc'ed etc. The elements are guaranteed to be adjacently
00293   allocated (this is not guaranteed to occur with multiple callocs or
00294   mallocs), which may also improve cache locality in some
00295   applications.
00296 
00297   The "chunks" argument is optional (i.e., may be null, which is
00298   probably the most typical usage). If it is null, the returned array
00299   is itself dynamically allocated and should also be freed when it is
00300   no longer needed. Otherwise, the chunks array must be of at least
00301   n_elements in length. It is filled in with the pointers to the
00302   chunks.
00303 
00304   In either case, independent_calloc returns this pointer array, or
00305   null if the allocation failed.  If n_elements is zero and "chunks"
00306   is null, it returns a chunk representing an array with zero elements
00307   (which should be freed if not wanted).
00308 
00309   Each element must be individually freed when it is no longer
00310   needed. If you'd like to instead be able to free all at once, you
00311   should instead use regular calloc and assign pointers into this
00312   space to represent elements.  (In this case though, you cannot
00313   independently free elements.)
00314 
00315   independent_calloc simplifies and speeds up implementations of many
00316   kinds of pools.  It may also be useful when constructing large data
00317   structures that initially have a fixed number of fixed-sized nodes,
00318   but the number is not known at compile time, and some of the nodes
00319   may later need to be freed. For example:
00320 
00321   struct Node { int item; struct Node* next; };
00322 
00323   struct Node* build_list() {
00324     struct Node** pool;
00325     int n = read_number_of_nodes_needed();
00326     if (n <= 0) return 0;
00327     pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0);
00328     if (pool == 0) die();
00329     // organize into a linked list...
00330     struct Node* first = pool[0];
00331     for (i = 0; i < n-1; ++i)
00332       pool[i]->next = pool[i+1];
00333     free(pool);     // Can now free the array (or not, if it is needed later)
00334     return first;
00335   }
00336 */
00337 void** dlindependent_calloc(size_t, size_t, void**);
00338 
00339 /*
00340   independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]);
00341 
00342   independent_comalloc allocates, all at once, a set of n_elements
00343   chunks with sizes indicated in the "sizes" array.    It returns
00344   an array of pointers to these elements, each of which can be
00345   independently freed, realloc'ed etc. The elements are guaranteed to
00346   be adjacently allocated (this is not guaranteed to occur with
00347   multiple callocs or mallocs), which may also improve cache locality
00348   in some applications.
00349 
00350   The "chunks" argument is optional (i.e., may be null). If it is null
00351   the returned array is itself dynamically allocated and should also
00352   be freed when it is no longer needed. Otherwise, the chunks array
00353   must be of at least n_elements in length. It is filled in with the
00354   pointers to the chunks.
00355 
00356   In either case, independent_comalloc returns this pointer array, or
00357   null if the allocation failed.  If n_elements is zero and chunks is
00358   null, it returns a chunk representing an array with zero elements
00359   (which should be freed if not wanted).
00360 
00361   Each element must be individually freed when it is no longer
00362   needed. If you'd like to instead be able to free all at once, you
00363   should instead use a single regular malloc, and assign pointers at
00364   particular offsets in the aggregate space. (In this case though, you
00365   cannot independently free elements.)
00366 
00367   independent_comallac differs from independent_calloc in that each
00368   element may have a different size, and also that it does not
00369   automatically clear elements.
00370 
00371   independent_comalloc can be used to speed up allocation in cases
00372   where several structs or objects must always be allocated at the
00373   same time.  For example:
00374 
00375   struct Head { ... }
00376   struct Foot { ... }
00377 
00378   void send_message(char* msg) {
00379     int msglen = strlen(msg);
00380     size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) };
00381     void* chunks[3];
00382     if (independent_comalloc(3, sizes, chunks) == 0)
00383       die();
00384     struct Head* head = (struct Head*)(chunks[0]);
00385     char*        body = (char*)(chunks[1]);
00386     struct Foot* foot = (struct Foot*)(chunks[2]);
00387     // ...
00388   }
00389 
00390   In general though, independent_comalloc is worth using only for
00391   larger values of n_elements. For small values, you probably won't
00392   detect enough difference from series of malloc calls to bother.
00393 
00394   Overuse of independent_comalloc can increase overall memory usage,
00395   since it cannot reuse existing noncontiguous small chunks that
00396   might be available for some of the elements.
00397 */
00398 void** dlindependent_comalloc(size_t, size_t*, void**);
00399 
00400 
00401 /*
00402   pvalloc(size_t n);
00403   Equivalent to valloc(minimum-page-that-holds(n)), that is,
00404   round up n to nearest pagesize.
00405  */
00406 void*  dlpvalloc(size_t);
00407 
00408 /*
00409   malloc_trim(size_t pad);
00410 
00411   If possible, gives memory back to the system (via negative arguments
00412   to sbrk) if there is unused memory at the `high' end of the malloc
00413   pool or in unused MMAP segments. You can call this after freeing
00414   large blocks of memory to potentially reduce the system-level memory
00415   requirements of a program. However, it cannot guarantee to reduce
00416   memory. Under some allocation patterns, some large free blocks of
00417   memory will be locked between two used chunks, so they cannot be
00418   given back to the system.
00419 
00420   The `pad' argument to malloc_trim represents the amount of free
00421   trailing space to leave untrimmed. If this argument is zero, only
00422   the minimum amount of memory to maintain internal data structures
00423   will be left. Non-zero arguments can be supplied to maintain enough
00424   trailing space to service future expected allocations without having
00425   to re-obtain memory from the system.
00426 
00427   Malloc_trim returns 1 if it actually released any memory, else 0.
00428 */
00429 int  dlmalloc_trim(size_t);
00430 
00431 /*
00432   malloc_stats();
00433   Prints on stderr the amount of space obtained from the system (both
00434   via sbrk and mmap), the maximum amount (which may be more than
00435   current if malloc_trim and/or munmap got called), and the current
00436   number of bytes allocated via malloc (or realloc, etc) but not yet
00437   freed. Note that this is the number of bytes allocated, not the
00438   number requested. It will be larger than the number requested
00439   because of alignment and bookkeeping overhead. Because it includes
00440   alignment wastage as being in use, this figure may be greater than
00441   zero even when no user-level chunks are allocated.
00442 
00443   The reported current and maximum system memory can be inaccurate if
00444   a program makes other calls to system memory allocation functions
00445   (normally sbrk) outside of malloc.
00446 
00447   malloc_stats prints only the most commonly interesting statistics.
00448   More information can be obtained by calling mallinfo.
00449 */
00450 void  dlmalloc_stats();
00451 
00452 #endif /* !ONLY_MSPACES */
00453 
00454 /*
00455   malloc_usable_size(void* p);
00456 
00457   Returns the number of bytes you can actually use in
00458   an allocated chunk, which may be more than you requested (although
00459   often not) due to alignment and minimum size constraints.
00460   You can use this many bytes without worrying about
00461   overwriting other allocated objects. This is not a particularly great
00462   programming practice. malloc_usable_size can be more useful in
00463   debugging and assertions, for example:
00464 
00465   p = malloc(n);
00466   assert(malloc_usable_size(p) >= 256);
00467 */
00468 size_t dlmalloc_usable_size(void*);
00469 
00470 
00471 #if MSPACES
00472 
00473 /*
00474   mspace is an opaque type representing an independent
00475   region of space that supports mspace_malloc, etc.
00476 */
00477 typedef void* mspace;
00478 
00479 /*
00480   create_mspace creates and returns a new independent space with the
00481   given initial capacity, or, if 0, the default granularity size.  It
00482   returns null if there is no system memory available to create the
00483   space.  If argument locked is non-zero, the space uses a separate
00484   lock to control access. The capacity of the space will grow
00485   dynamically as needed to service mspace_malloc requests.  You can
00486   control the sizes of incremental increases of this space by
00487   compiling with a different DEFAULT_GRANULARITY or dynamically
00488   setting with mallopt(M_GRANULARITY, value).
00489 */
00490 mspace create_mspace(size_t capacity, int locked);
00491 
00492 /*
00493   destroy_mspace destroys the given space, and attempts to return all
00494   of its memory back to the system, returning the total number of
00495   bytes freed. After destruction, the results of access to all memory
00496   used by the space become undefined.
00497 */
00498 size_t destroy_mspace(mspace msp);
00499 
00500 /*
00501   create_mspace_with_base uses the memory supplied as the initial base
00502   of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this
00503   space is used for bookkeeping, so the capacity must be at least this
00504   large. (Otherwise 0 is returned.) When this initial space is
00505   exhausted, additional memory will be obtained from the system.
00506   Destroying this space will deallocate all additionally allocated
00507   space (if possible) but not the initial base.
00508 */
00509 mspace create_mspace_with_base(void* base, size_t capacity, int locked);
00510 
00511 /*
00512   mspace_track_large_chunks controls whether requests for large chunks
00513   are allocated in their own untracked mmapped regions, separate from
00514   others in this mspace. By default large chunks are not tracked,
00515   which reduces fragmentation. However, such chunks are not
00516   necessarily released to the system upon destroy_mspace.  Enabling
00517   tracking by setting to true may increase fragmentation, but avoids
00518   leakage when relying on destroy_mspace to release all memory
00519   allocated using this space.  The function returns the previous
00520   setting.
00521 */
00522 int mspace_track_large_chunks(mspace msp, int enable);
00523 
00524 /*
00525   mspace_malloc behaves as malloc, but operates within
00526   the given space.
00527 */
00528 void* mspace_malloc(mspace msp, size_t bytes);
00529 
00530 /*
00531   mspace_free behaves as free, but operates within
00532   the given space.
00533 
00534   If compiled with FOOTERS==1, mspace_free is not actually needed.
00535   free may be called instead of mspace_free because freed chunks from
00536   any space are handled by their originating spaces.
00537 */
00538 void mspace_free(mspace msp, void* mem);
00539 
00540 /*
00541   mspace_realloc behaves as realloc, but operates within
00542   the given space.
00543 
00544   If compiled with FOOTERS==1, mspace_realloc is not actually
00545   needed.  realloc may be called instead of mspace_realloc because
00546   realloced chunks from any space are handled by their originating
00547   spaces.
00548 */
00549 void* mspace_realloc(mspace msp, void* mem, size_t newsize);
00550 
00551 /*
00552   mspace_calloc behaves as calloc, but operates within
00553   the given space.
00554 */
00555 void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
00556 
00557 /*
00558   mspace_memalign behaves as memalign, but operates within
00559   the given space.
00560 */
00561 void* mspace_memalign(mspace msp, size_t alignment, size_t bytes);
00562 
00563 /*
00564   mspace_independent_calloc behaves as independent_calloc, but
00565   operates within the given space.
00566 */
00567 void** mspace_independent_calloc(mspace msp, size_t n_elements,
00568                                  size_t elem_size, void* chunks[]);
00569 
00570 /*
00571   mspace_independent_comalloc behaves as independent_comalloc, but
00572   operates within the given space.
00573 */
00574 void** mspace_independent_comalloc(mspace msp, size_t n_elements,
00575                                    size_t sizes[], void* chunks[]);
00576 
00577 /*
00578   mspace_footprint() returns the number of bytes obtained from the
00579   system for this space.
00580 */
00581 size_t mspace_footprint(mspace msp);
00582 
00583 
00584 #if !NO_MALLINFO
00585 /*
00586   mspace_mallinfo behaves as mallinfo, but reports properties of
00587   the given space.
00588 */
00589 struct mallinfo mspace_mallinfo(mspace msp);
00590 #endif /* NO_MALLINFO */
00591 
00592 /*
00593   malloc_usable_size(void* p) behaves the same as malloc_usable_size;
00594 */
00595  size_t mspace_usable_size(void* mem);
00596 
00597 /*
00598   mspace_malloc_stats behaves as malloc_stats, but reports
00599   properties of the given space.
00600 */
00601 void mspace_malloc_stats(mspace msp);
00602 
00603 /*
00604   mspace_trim behaves as malloc_trim, but
00605   operates within the given space.
00606 */
00607 int mspace_trim(mspace msp, size_t pad);
00608 
00609 /*
00610   An alias for mallopt.
00611 */
00612 int mspace_mallopt(int, int);
00613 
00614 #endif  /* MSPACES */
00615 
00616 #ifdef __cplusplus
00617 };  /* end of extern "C" */
00618 #endif
00619 
00620 #endif /* MALLOC_280_H */
00621 
00622 #endif
00623 /* AIPS_LINUX */
00624 
00625 #endif
00626 /* AIPS_MALLOC */
00627 
00628 #endif
00629 /* AIPS_NO_LEA_MALLOC */