Changeset 7ad3c2f in mainline


Ignore:
Timestamp:
2006-03-14T16:34:17Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
00c4994
Parents:
79522a7
Message:

Added malloc implementation.

Location:
libc
Files:
4 added
10 edited

Legend:

Unmodified
Added
Removed
  • libc/Makefile

    r79522a7 r7ad3c2f  
    4444        generic/mmap.c \
    4545        generic/io/io.c \
    46         generic/io/print.c
     46        generic/io/print.c \
     47        malloc/malloc.c
    4748
    4849ARCH_SOURCES += \
  • libc/arch/amd64/_link.ld.in

    r79522a7 r7ad3c2f  
    2424                *(COMMON);
    2525                *(.bss);
     26                _heap = .;
     27                QUAD(0xdeadbeef);
    2628        } :data
    2729
  • libc/arch/ia32/_link.ld.in

    r79522a7 r7ad3c2f  
    2424                *(COMMON);
    2525                *(.bss);
     26                _heap = .;
     27                LONG(0xdeadbeef);
    2628        } :data
    2729       
  • libc/arch/ia64/_link.ld.in

    r79522a7 r7ad3c2f  
    3232                *(COMMON);
    3333                *(.bss);
     34                _heap = .;
     35                QUAD(0xdeadbeef);
    3436        } :data
    3537 
  • libc/arch/mips32/_link.ld.in

    r79522a7 r7ad3c2f  
    2525                *(.sbss);
    2626                *(COMMON);
     27                _heap = .;
     28                LONG(0xdeadbeef);
    2729        } :data
    2830       
  • libc/generic/mmap.c

    r79522a7 r7ad3c2f  
    3030#include <unistd.h>
    3131
     32/** Mremap syscall */
    3233void *mremap(void *address, size_t size, unsigned long flags)
    3334{
    3435        return (void *) __SYSCALL3(SYS_MREMAP, (sysarg_t ) address, (sysarg_t) size, (sysarg_t) flags);
    3536}
     37
     38
     39static size_t heapsize = 0;
     40/* Start of heap linker symbol */
     41extern char _heap;
     42
     43/** Sbrk emulation
     44 *
     45 * @param size New area that should be allocated or negative,
     46               if it should be shrinked
     47 * @return Pointer to newly allocated area
     48 */
     49void *sbrk(ssize_t incr)
     50{
     51        void *res;
     52        /* Check for invalid values */
     53        if (incr < 0 && -incr > heapsize)
     54                return NULL;
     55        /* Check for too large value */
     56        if (incr > 0 && incr+heapsize < heapsize)
     57                return NULL;
     58        /* Check for too small values */
     59        if (incr < 0 && incr+heapsize > heapsize)
     60                return NULL;
     61
     62        res = mremap(&_heap, heapsize + incr,0);
     63        if (!res)
     64                return NULL;
     65        res = (void *)&_heap + incr;
     66        heapsize += incr;
     67        return res;
     68}
  • libc/include/malloc.h

    r79522a7 r7ad3c2f  
    4848#define dlmalloc_usable_size   malloc_usable_size
    4949#define dlmalloc_footprint     malloc_footprint
     50#define dlmalloc_max_footprint malloc_max_footprint
    5051#define dlindependent_calloc   independent_calloc
    5152#define dlindependent_comalloc independent_comalloc
     
    163164  so results might not be up to date.
    164165*/
    165 size_t dlmalloc_footprint();
     166size_t dlmalloc_footprint(void);
     167size_t dlmalloc_max_footprint(void);
    166168
    167169#if !NO_MALLINFO
     
    392394  More information can be obtained by calling mallinfo.
    393395*/
    394 void  dlmalloc_stats();
     396void  dlmalloc_stats(void);
    395397
    396398#endif /* !ONLY_MSPACES */
  • libc/include/stdio.h

    r79522a7 r7ad3c2f  
    3737
    3838extern int printf(const char *fmt, ...);
     39#define fprintf(f, fmt, ...) printf(fmt, ##__VA_ARGS__)
    3940
    4041#endif
  • libc/include/unistd.h

    r79522a7 r7ad3c2f  
    3737extern void _exit(int status);
    3838void * mremap(void *address, size_t size, unsigned long flags);
     39void *sbrk(ssize_t incr);
    3940
    4041#endif
  • libc/malloc/malloc.c

    r79522a7 r7ad3c2f  
    584584#define M_MMAP_THRESHOLD     (-3)
    585585
    586 /* ------------------------ Mallinfo declarations ------------------------ */
    587 
    588 #if !NO_MALLINFO
    589 /*
    590   This version of malloc supports the standard SVID/XPG mallinfo
    591   routine that returns a struct containing usage properties and
    592   statistics. It should work on any system that has a
    593   /usr/include/malloc.h defining struct mallinfo.  The main
    594   declaration needed is the mallinfo struct that is returned (by-copy)
    595   by mallinfo().  The malloinfo struct contains a bunch of fields that
    596   are not even meaningful in this version of malloc.  These fields are
    597   are instead filled by mallinfo() with other numbers that might be of
    598   interest.
    599 
    600   HAVE_USR_INCLUDE_MALLOC_H should be set if you have a
    601   /usr/include/malloc.h file that includes a declaration of struct
    602   mallinfo.  If so, it is included; else a compliant version is
    603   declared below.  These must be precisely the same for mallinfo() to
    604   work.  The original SVID version of this struct, defined on most
    605   systems with mallinfo, declares all fields as ints. But some others
    606   define as unsigned long. If your system defines the fields using a
    607   type of different width than listed here, you MUST #include your
    608   system version and #define HAVE_USR_INCLUDE_MALLOC_H.
    609 */
    610 
    611 /* #define HAVE_USR_INCLUDE_MALLOC_H */
    612 
    613 #ifdef HAVE_USR_INCLUDE_MALLOC_H
    614 #include "/usr/include/malloc.h"
    615 #else /* HAVE_USR_INCLUDE_MALLOC_H */
    616 
    617 struct mallinfo {
    618   MALLINFO_FIELD_TYPE arena;    /* non-mmapped space allocated from system */
    619   MALLINFO_FIELD_TYPE ordblks;  /* number of free chunks */
    620   MALLINFO_FIELD_TYPE smblks;   /* always 0 */
    621   MALLINFO_FIELD_TYPE hblks;    /* always 0 */
    622   MALLINFO_FIELD_TYPE hblkhd;   /* space in mmapped regions */
    623   MALLINFO_FIELD_TYPE usmblks;  /* maximum total allocated space */
    624   MALLINFO_FIELD_TYPE fsmblks;  /* always 0 */
    625   MALLINFO_FIELD_TYPE uordblks; /* total allocated space */
    626   MALLINFO_FIELD_TYPE fordblks; /* total free space */
    627   MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */
    628 };
    629 
    630 #endif /* HAVE_USR_INCLUDE_MALLOC_H */
    631 #endif /* NO_MALLINFO */
    632 
    633 #ifdef __cplusplus
    634 extern "C" {
    635 #endif /* __cplusplus */
    636 
    637 #if !ONLY_MSPACES
    638 
    639 /* ------------------- Declarations of public routines ------------------- */
    640 
    641 #ifndef USE_DL_PREFIX
    642 #define dlcalloc               calloc
    643 #define dlfree                 free
    644 #define dlmalloc               malloc
    645 #define dlmemalign             memalign
    646 #define dlrealloc              realloc
    647 #define dlvalloc               valloc
    648 #define dlpvalloc              pvalloc
    649 #define dlmallinfo             mallinfo
    650 #define dlmallopt              mallopt
    651 #define dlmalloc_trim          malloc_trim
    652 #define dlmalloc_stats         malloc_stats
    653 #define dlmalloc_usable_size   malloc_usable_size
    654 #define dlmalloc_footprint     malloc_footprint
    655 #define dlmalloc_max_footprint malloc_max_footprint
    656 #define dlindependent_calloc   independent_calloc
    657 #define dlindependent_comalloc independent_comalloc
    658 #endif /* USE_DL_PREFIX */
    659 
    660 
    661 /*
    662   malloc(size_t n)
    663   Returns a pointer to a newly allocated chunk of at least n bytes, or
    664   null if no space is available, in which case errno is set to ENOMEM
    665   on ANSI C systems.
    666 
    667   If n is zero, malloc returns a minimum-sized chunk. (The minimum
    668   size is 16 bytes on most 32bit systems, and 32 bytes on 64bit
    669   systems.)  Note that size_t is an unsigned type, so calls with
    670   arguments that would be negative if signed are interpreted as
    671   requests for huge amounts of space, which will often fail. The
    672   maximum supported value of n differs across systems, but is in all
    673   cases less than the maximum representable value of a size_t.
    674 */
    675 void* dlmalloc(size_t);
    676 
    677 /*
    678   free(void* p)
    679   Releases the chunk of memory pointed to by p, that had been previously
    680   allocated using malloc or a related routine such as realloc.
    681   It has no effect if p is null. If p was not malloced or already
    682   freed, free(p) will by default cause the current program to abort.
    683 */
    684 void  dlfree(void*);
    685 
    686 /*
    687   calloc(size_t n_elements, size_t element_size);
    688   Returns a pointer to n_elements * element_size bytes, with all locations
    689   set to zero.
    690 */
    691 void* dlcalloc(size_t, size_t);
    692 
    693 /*
    694   realloc(void* p, size_t n)
    695   Returns a pointer to a chunk of size n that contains the same data
    696   as does chunk p up to the minimum of (n, p's size) bytes, or null
    697   if no space is available.
    698 
    699   The returned pointer may or may not be the same as p. The algorithm
    700   prefers extending p in most cases when possible, otherwise it
    701   employs the equivalent of a malloc-copy-free sequence.
    702 
    703   If p is null, realloc is equivalent to malloc.
    704 
    705   If space is not available, realloc returns null, errno is set (if on
    706   ANSI) and p is NOT freed.
    707 
    708   if n is for fewer bytes than already held by p, the newly unused
    709   space is lopped off and freed if possible.  realloc with a size
    710   argument of zero (re)allocates a minimum-sized chunk.
    711 
    712   The old unix realloc convention of allowing the last-free'd chunk
    713   to be used as an argument to realloc is not supported.
    714 */
    715 
    716 void* dlrealloc(void*, size_t);
    717 
    718 /*
    719   memalign(size_t alignment, size_t n);
    720   Returns a pointer to a newly allocated chunk of n bytes, aligned
    721   in accord with the alignment argument.
    722 
    723   The alignment argument should be a power of two. If the argument is
    724   not a power of two, the nearest greater power is used.
    725   8-byte alignment is guaranteed by normal malloc calls, so don't
    726   bother calling memalign with an argument of 8 or less.
    727 
    728   Overreliance on memalign is a sure way to fragment space.
    729 */
    730 void* dlmemalign(size_t, size_t);
    731 
    732 /*
    733   valloc(size_t n);
    734   Equivalent to memalign(pagesize, n), where pagesize is the page
    735   size of the system. If the pagesize is unknown, 4096 is used.
    736 */
    737 void* dlvalloc(size_t);
    738 
    739 /*
    740   mallopt(int parameter_number, int parameter_value)
    741   Sets tunable parameters The format is to provide a
    742   (parameter-number, parameter-value) pair.  mallopt then sets the
    743   corresponding parameter to the argument value if it can (i.e., so
    744   long as the value is meaningful), and returns 1 if successful else
    745   0.  SVID/XPG/ANSI defines four standard param numbers for mallopt,
    746   normally defined in malloc.h.  None of these are use in this malloc,
    747   so setting them has no effect. But this malloc also supports other
    748   options in mallopt. See below for details.  Briefly, supported
    749   parameters are as follows (listed defaults are for "typical"
    750   configurations).
    751 
    752   Symbol            param #  default    allowed param values
    753   M_TRIM_THRESHOLD     -1   2*1024*1024   any   (MAX_SIZE_T disables)
    754   M_GRANULARITY        -2     page size   any power of 2 >= page size
    755   M_MMAP_THRESHOLD     -3      256*1024   any   (or 0 if no MMAP support)
    756 */
    757 int dlmallopt(int, int);
    758 
    759 /*
    760   malloc_footprint();
    761   Returns the number of bytes obtained from the system.  The total
    762   number of bytes allocated by malloc, realloc etc., is less than this
    763   value. Unlike mallinfo, this function returns only a precomputed
    764   result, so can be called frequently to monitor memory consumption.
    765   Even if locks are otherwise defined, this function does not use them,
    766   so results might not be up to date.
    767 */
    768 size_t dlmalloc_footprint(void);
    769 
    770 /*
    771   malloc_max_footprint();
    772   Returns the maximum number of bytes obtained from the system. This
    773   value will be greater than current footprint if deallocated space
    774   has been reclaimed by the system. The peak number of bytes allocated
    775   by malloc, realloc etc., is less than this value. Unlike mallinfo,
    776   this function returns only a precomputed result, so can be called
    777   frequently to monitor memory consumption.  Even if locks are
    778   otherwise defined, this function does not use them, so results might
    779   not be up to date.
    780 */
    781 size_t dlmalloc_max_footprint(void);
    782 
    783 #if !NO_MALLINFO
    784 /*
    785   mallinfo()
    786   Returns (by copy) a struct containing various summary statistics:
    787 
    788   arena:     current total non-mmapped bytes allocated from system
    789   ordblks:   the number of free chunks
    790   smblks:    always zero.
    791   hblks:     current number of mmapped regions
    792   hblkhd:    total bytes held in mmapped regions
    793   usmblks:   the maximum total allocated space. This will be greater
    794                 than current total if trimming has occurred.
    795   fsmblks:   always zero
    796   uordblks:  current total allocated space (normal or mmapped)
    797   fordblks:  total free space
    798   keepcost:  the maximum number of bytes that could ideally be released
    799                back to system via malloc_trim. ("ideally" means that
    800                it ignores page restrictions etc.)
    801 
    802   Because these fields are ints, but internal bookkeeping may
    803   be kept as longs, the reported values may wrap around zero and
    804   thus be inaccurate.
    805 */
    806 struct mallinfo dlmallinfo(void);
    807 #endif /* NO_MALLINFO */
    808 
    809 /*
    810   independent_calloc(size_t n_elements, size_t element_size, void* chunks[]);
    811 
    812   independent_calloc is similar to calloc, but instead of returning a
    813   single cleared space, it returns an array of pointers to n_elements
    814   independent elements that can hold contents of size elem_size, each
    815   of which starts out cleared, and can be independently freed,
    816   realloc'ed etc. The elements are guaranteed to be adjacently
    817   allocated (this is not guaranteed to occur with multiple callocs or
    818   mallocs), which may also improve cache locality in some
    819   applications.
    820 
    821   The "chunks" argument is optional (i.e., may be null, which is
    822   probably the most typical usage). If it is null, the returned array
    823   is itself dynamically allocated and should also be freed when it is
    824   no longer needed. Otherwise, the chunks array must be of at least
    825   n_elements in length. It is filled in with the pointers to the
    826   chunks.
    827 
    828   In either case, independent_calloc returns this pointer array, or
    829   null if the allocation failed.  If n_elements is zero and "chunks"
    830   is null, it returns a chunk representing an array with zero elements
    831   (which should be freed if not wanted).
    832 
    833   Each element must be individually freed when it is no longer
    834   needed. If you'd like to instead be able to free all at once, you
    835   should instead use regular calloc and assign pointers into this
    836   space to represent elements.  (In this case though, you cannot
    837   independently free elements.)
    838 
    839   independent_calloc simplifies and speeds up implementations of many
    840   kinds of pools.  It may also be useful when constructing large data
    841   structures that initially have a fixed number of fixed-sized nodes,
    842   but the number is not known at compile time, and some of the nodes
    843   may later need to be freed. For example:
    844 
    845   struct Node { int item; struct Node* next; };
    846 
    847   struct Node* build_list() {
    848     struct Node** pool;
    849     int n = read_number_of_nodes_needed();
    850     if (n <= 0) return 0;
    851     pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0);
    852     if (pool == 0) die();
    853     // organize into a linked list...
    854     struct Node* first = pool[0];
    855     for (i = 0; i < n-1; ++i)
    856       pool[i]->next = pool[i+1];
    857     free(pool);     // Can now free the array (or not, if it is needed later)
    858     return first;
    859   }
    860 */
    861 void** dlindependent_calloc(size_t, size_t, void**);
    862 
    863 /*
    864   independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]);
    865 
    866   independent_comalloc allocates, all at once, a set of n_elements
    867   chunks with sizes indicated in the "sizes" array.    It returns
    868   an array of pointers to these elements, each of which can be
    869   independently freed, realloc'ed etc. The elements are guaranteed to
    870   be adjacently allocated (this is not guaranteed to occur with
    871   multiple callocs or mallocs), which may also improve cache locality
    872   in some applications.
    873 
    874   The "chunks" argument is optional (i.e., may be null). If it is null
    875   the returned array is itself dynamically allocated and should also
    876   be freed when it is no longer needed. Otherwise, the chunks array
    877   must be of at least n_elements in length. It is filled in with the
    878   pointers to the chunks.
    879 
    880   In either case, independent_comalloc returns this pointer array, or
    881   null if the allocation failed.  If n_elements is zero and chunks is
    882   null, it returns a chunk representing an array with zero elements
    883   (which should be freed if not wanted).
    884 
    885   Each element must be individually freed when it is no longer
    886   needed. If you'd like to instead be able to free all at once, you
    887   should instead use a single regular malloc, and assign pointers at
    888   particular offsets in the aggregate space. (In this case though, you
    889   cannot independently free elements.)
    890 
    891   independent_comallac differs from independent_calloc in that each
    892   element may have a different size, and also that it does not
    893   automatically clear elements.
    894 
    895   independent_comalloc can be used to speed up allocation in cases
    896   where several structs or objects must always be allocated at the
    897   same time.  For example:
    898 
    899   struct Head { ... }
    900   struct Foot { ... }
    901 
    902   void send_message(char* msg) {
    903     int msglen = strlen(msg);
    904     size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) };
    905     void* chunks[3];
    906     if (independent_comalloc(3, sizes, chunks) == 0)
    907       die();
    908     struct Head* head = (struct Head*)(chunks[0]);
    909     char*        body = (char*)(chunks[1]);
    910     struct Foot* foot = (struct Foot*)(chunks[2]);
    911     // ...
    912   }
    913 
    914   In general though, independent_comalloc is worth using only for
    915   larger values of n_elements. For small values, you probably won't
    916   detect enough difference from series of malloc calls to bother.
    917 
    918   Overuse of independent_comalloc can increase overall memory usage,
    919   since it cannot reuse existing noncontiguous small chunks that
    920   might be available for some of the elements.
    921 */
    922 void** dlindependent_comalloc(size_t, size_t*, void**);
    923 
    924 
    925 /*
    926   pvalloc(size_t n);
    927   Equivalent to valloc(minimum-page-that-holds(n)), that is,
    928   round up n to nearest pagesize.
    929  */
    930 void*  dlpvalloc(size_t);
    931 
    932 /*
    933   malloc_trim(size_t pad);
    934 
    935   If possible, gives memory back to the system (via negative arguments
    936   to sbrk) if there is unused memory at the `high' end of the malloc
    937   pool or in unused MMAP segments. You can call this after freeing
    938   large blocks of memory to potentially reduce the system-level memory
    939   requirements of a program. However, it cannot guarantee to reduce
    940   memory. Under some allocation patterns, some large free blocks of
    941   memory will be locked between two used chunks, so they cannot be
    942   given back to the system.
    943 
    944   The `pad' argument to malloc_trim represents the amount of free
    945   trailing space to leave untrimmed. If this argument is zero, only
    946   the minimum amount of memory to maintain internal data structures
    947   will be left. Non-zero arguments can be supplied to maintain enough
    948   trailing space to service future expected allocations without having
    949   to re-obtain memory from the system.
    950 
    951   Malloc_trim returns 1 if it actually released any memory, else 0.
    952 */
    953 int  dlmalloc_trim(size_t);
    954 
    955 /*
    956   malloc_usable_size(void* p);
    957 
    958   Returns the number of bytes you can actually use in
    959   an allocated chunk, which may be more than you requested (although
    960   often not) due to alignment and minimum size constraints.
    961   You can use this many bytes without worrying about
    962   overwriting other allocated objects. This is not a particularly great
    963   programming practice. malloc_usable_size can be more useful in
    964   debugging and assertions, for example:
    965 
    966   p = malloc(n);
    967   assert(malloc_usable_size(p) >= 256);
    968 */
    969 size_t dlmalloc_usable_size(void*);
    970 
    971 /*
    972   malloc_stats();
    973   Prints on stderr the amount of space obtained from the system (both
    974   via sbrk and mmap), the maximum amount (which may be more than
    975   current if malloc_trim and/or munmap got called), and the current
    976   number of bytes allocated via malloc (or realloc, etc) but not yet
    977   freed. Note that this is the number of bytes allocated, not the
    978   number requested. It will be larger than the number requested
    979   because of alignment and bookkeeping overhead. Because it includes
    980   alignment wastage as being in use, this figure may be greater than
    981   zero even when no user-level chunks are allocated.
    982 
    983   The reported current and maximum system memory can be inaccurate if
    984   a program makes other calls to system memory allocation functions
    985   (normally sbrk) outside of malloc.
    986 
    987   malloc_stats prints only the most commonly interesting statistics.
    988   More information can be obtained by calling mallinfo.
    989 */
    990 void  dlmalloc_stats(void);
    991 
    992 #endif /* ONLY_MSPACES */
    993 
    994 #if MSPACES
    995 
    996 /*
    997   mspace is an opaque type representing an independent
    998   region of space that supports mspace_malloc, etc.
    999 */
    1000 typedef void* mspace;
    1001 
    1002 /*
    1003   create_mspace creates and returns a new independent space with the
    1004   given initial capacity, or, if 0, the default granularity size.  It
    1005   returns null if there is no system memory available to create the
    1006   space.  If argument locked is non-zero, the space uses a separate
    1007   lock to control access. The capacity of the space will grow
    1008   dynamically as needed to service mspace_malloc requests.  You can
    1009   control the sizes of incremental increases of this space by
    1010   compiling with a different DEFAULT_GRANULARITY or dynamically
    1011   setting with mallopt(M_GRANULARITY, value).
    1012 */
    1013 mspace create_mspace(size_t capacity, int locked);
    1014 
    1015 /*
    1016   destroy_mspace destroys the given space, and attempts to return all
    1017   of its memory back to the system, returning the total number of
    1018   bytes freed. After destruction, the results of access to all memory
    1019   used by the space become undefined.
    1020 */
    1021 size_t destroy_mspace(mspace msp);
    1022 
    1023 /*
    1024   create_mspace_with_base uses the memory supplied as the initial base
    1025   of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this
    1026   space is used for bookkeeping, so the capacity must be at least this
    1027   large. (Otherwise 0 is returned.) When this initial space is
    1028   exhausted, additional memory will be obtained from the system.
    1029   Destroying this space will deallocate all additionally allocated
    1030   space (if possible) but not the initial base.
    1031 */
    1032 mspace create_mspace_with_base(void* base, size_t capacity, int locked);
    1033 
    1034 /*
    1035   mspace_malloc behaves as malloc, but operates within
    1036   the given space.
    1037 */
    1038 void* mspace_malloc(mspace msp, size_t bytes);
    1039 
    1040 /*
    1041   mspace_free behaves as free, but operates within
    1042   the given space.
    1043 
    1044   If compiled with FOOTERS==1, mspace_free is not actually needed.
    1045   free may be called instead of mspace_free because freed chunks from
    1046   any space are handled by their originating spaces.
    1047 */
    1048 void mspace_free(mspace msp, void* mem);
    1049 
    1050 /*
    1051   mspace_realloc behaves as realloc, but operates within
    1052   the given space.
    1053 
    1054   If compiled with FOOTERS==1, mspace_realloc is not actually
    1055   needed.  realloc may be called instead of mspace_realloc because
    1056   realloced chunks from any space are handled by their originating
    1057   spaces.
    1058 */
    1059 void* mspace_realloc(mspace msp, void* mem, size_t newsize);
    1060 
    1061 /*
    1062   mspace_calloc behaves as calloc, but operates within
    1063   the given space.
    1064 */
    1065 void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
    1066 
    1067 /*
    1068   mspace_memalign behaves as memalign, but operates within
    1069   the given space.
    1070 */
    1071 void* mspace_memalign(mspace msp, size_t alignment, size_t bytes);
    1072 
    1073 /*
    1074   mspace_independent_calloc behaves as independent_calloc, but
    1075   operates within the given space.
    1076 */
    1077 void** mspace_independent_calloc(mspace msp, size_t n_elements,
    1078                                  size_t elem_size, void* chunks[]);
    1079 
    1080 /*
    1081   mspace_independent_comalloc behaves as independent_comalloc, but
    1082   operates within the given space.
    1083 */
    1084 void** mspace_independent_comalloc(mspace msp, size_t n_elements,
    1085                                    size_t sizes[], void* chunks[]);
    1086 
    1087 /*
    1088   mspace_footprint() returns the number of bytes obtained from the
    1089   system for this space.
    1090 */
    1091 size_t mspace_footprint(mspace msp);
    1092 
    1093 /*
    1094   mspace_max_footprint() returns the peak number of bytes obtained from the
    1095   system for this space.
    1096 */
    1097 size_t mspace_max_footprint(mspace msp);
    1098 
    1099 
    1100 #if !NO_MALLINFO
    1101 /*
    1102   mspace_mallinfo behaves as mallinfo, but reports properties of
    1103   the given space.
    1104 */
    1105 struct mallinfo mspace_mallinfo(mspace msp);
    1106 #endif /* NO_MALLINFO */
    1107 
    1108 /*
    1109   mspace_malloc_stats behaves as malloc_stats, but reports
    1110   properties of the given space.
    1111 */
    1112 void mspace_malloc_stats(mspace msp);
    1113 
    1114 /*
    1115   mspace_trim behaves as malloc_trim, but
    1116   operates within the given space.
    1117 */
    1118 int mspace_trim(mspace msp, size_t pad);
    1119 
    1120 /*
    1121   An alias for mallopt.
    1122 */
    1123 int mspace_mallopt(int, int);
    1124 
    1125 #endif /* MSPACES */
    1126 
    1127 #ifdef __cplusplus
    1128 };  /* end of extern "C" */
    1129 #endif /* __cplusplus */
     586/** Non-default helenos customizations */
     587#define LACKS_FCNTL_H
     588#define LACKS_SYS_MMAN_H
     589#define LACKS_SYS_PARAM_H
     590#undef HAVE_MMAP
     591#define HAVE_MMAP 0
     592#define LACKS_ERRNO_H
     593/* Set errno? */
     594#undef MALLOC_FAILURE_ACTION
     595#define MALLOC_FAILURE_ACTION
     596
    1130597
    1131598/*
     
    1137604*/
    1138605
    1139 /* #include "malloc.h" */
     606#include "malloc.h"
    1140607
    1141608/*------------------------------ internal #includes ---------------------- */
Note: See TracChangeset for help on using the changeset viewer.