| /* VxWorks provides its own version of malloc, and we can't use this |
| one because VxWorks does not provide sbrk. So we have a hook to |
| not compile this code. */ |
| |
| /* The routines here are simple cover fns to the routines that do the real |
| work (the reentrant versions). */ |
| /* FIXME: Does the warning below (see WARNINGS) about non-reentrancy still |
| apply? A first guess would be "no", but how about reentrancy in the *same* |
| thread? */ |
| |
| #ifdef MALLOC_PROVIDED |
| |
| int _dummy_malloc = 1; |
| |
| #else |
| |
| /* |
| FUNCTION |
| <<malloc>>, <<realloc>>, <<free>>---manage memory |
| |
| INDEX |
| malloc |
| INDEX |
| realloc |
| INDEX |
| reallocf |
| INDEX |
| free |
| INDEX |
| memalign |
| INDEX |
| malloc_usable_size |
| INDEX |
| _malloc_r |
| INDEX |
| _realloc_r |
| INDEX |
| _reallocf_r |
| INDEX |
| _free_r |
| INDEX |
| _memalign_r |
| INDEX |
| _malloc_usable_size_r |
| |
| ANSI_SYNOPSIS |
| #include <stdlib.h> |
| void *malloc(size_t <[nbytes]>); |
| void *realloc(void *<[aptr]>, size_t <[nbytes]>); |
| void *reallocf(void *<[aptr]>, size_t <[nbytes]>); |
| void free(void *<[aptr]>); |
| |
| void *memalign(size_t <[align]>, size_t <[nbytes]>); |
| |
| size_t malloc_usable_size(void *<[aptr]>); |
| |
| void *_malloc_r(void *<[reent]>, size_t <[nbytes]>); |
| void *_realloc_r(void *<[reent]>, |
| void *<[aptr]>, size_t <[nbytes]>); |
| void *_reallocf_r(void *<[reent]>, |
| void *<[aptr]>, size_t <[nbytes]>); |
| void _free_r(void *<[reent]>, void *<[aptr]>); |
| |
| void *_memalign_r(void *<[reent]>, |
| size_t <[align]>, size_t <[nbytes]>); |
| |
| size_t _malloc_usable_size_r(void *<[reent]>, void *<[aptr]>); |
| |
| TRAD_SYNOPSIS |
| #include <stdlib.h> |
| char *malloc(<[nbytes]>) |
| size_t <[nbytes]>; |
| |
| char *realloc(<[aptr]>, <[nbytes]>) |
| char *<[aptr]>; |
| size_t <[nbytes]>; |
| |
| char *reallocf(<[aptr]>, <[nbytes]>) |
| char *<[aptr]>; |
| size_t <[nbytes]>; |
| |
| void free(<[aptr]>) |
| char *<[aptr]>; |
| |
| char *memalign(<[align]>, <[nbytes]>) |
| size_t <[align]>; |
| size_t <[nbytes]>; |
| |
| size_t malloc_usable_size(<[aptr]>) |
| char *<[aptr]>; |
| |
| char *_malloc_r(<[reent]>,<[nbytes]>) |
| char *<[reent]>; |
| size_t <[nbytes]>; |
| |
| char *_realloc_r(<[reent]>, <[aptr]>, <[nbytes]>) |
| char *<[reent]>; |
| char *<[aptr]>; |
| size_t <[nbytes]>; |
| |
| char *_reallocf_r(<[reent]>, <[aptr]>, <[nbytes]>) |
| char *<[reent]>; |
| char *<[aptr]>; |
| size_t <[nbytes]>; |
| |
| void _free_r(<[reent]>, <[aptr]>) |
| char *<[reent]>; |
| char *<[aptr]>; |
| |
| char *_memalign_r(<[reent]>, <[align]>, <[nbytes]>) |
| char *<[reent]>; |
| size_t <[align]>; |
| size_t <[nbytes]>; |
| |
| size_t malloc_usable_size(<[reent]>, <[aptr]>) |
| char *<[reent]>; |
| char *<[aptr]>; |
| |
| DESCRIPTION |
| These functions manage a pool of system memory. |
| |
| Use <<malloc>> to request allocation of an object with at least |
| <[nbytes]> bytes of storage available. If the space is available, |
| <<malloc>> returns a pointer to a newly allocated block as its result. |
| |
| If you already have a block of storage allocated by <<malloc>>, but |
| you no longer need all the space allocated to it, you can make it |
| smaller by calling <<realloc>> with both the object pointer and the |
| new desired size as arguments. <<realloc>> guarantees that the |
| contents of the smaller object match the beginning of the original object. |
| |
| Similarly, if you need more space for an object, use <<realloc>> to |
| request the larger size; again, <<realloc>> guarantees that the |
| beginning of the new, larger object matches the contents of the |
| original object. |
| |
| When you no longer need an object originally allocated by <<malloc>> |
| or <<realloc>> (or the related function <<calloc>>), return it to the |
| memory storage pool by calling <<free>> with the address of the object |
| as the argument. You can also use <<realloc>> for this purpose by |
| calling it with <<0>> as the <[nbytes]> argument. |
| |
| The <<reallocf>> function behaves just like <<realloc>> except if the |
| function is required to allocate new storage and this fails. In this |
| case <<reallocf>> will free the original object passed in whereas |
| <<realloc>> will not. |
| |
| The <<memalign>> function returns a block of size <[nbytes]> aligned |
| to a <[align]> boundary. The <[align]> argument must be a power of |
| two. |
| |
| The <<malloc_usable_size>> function takes a pointer to a block |
| allocated by <<malloc>>. It returns the amount of space that is |
| available in the block. This may or may not be more than the size |
| requested from <<malloc>>, due to alignment or minimum size |
| constraints. |
| |
| The alternate functions <<_malloc_r>>, <<_realloc_r>>, <<_reallocf_r>>, |
| <<_free_r>>, <<_memalign_r>>, and <<_malloc_usable_size_r>> are reentrant |
| versions. The extra argument <[reent]> is a pointer to a reentrancy structure. |
| |
| If you have multiple threads of execution which may call any of these |
| routines, or if any of these routines may be called reentrantly, then |
| you must provide implementations of the <<__malloc_lock>> and |
| <<__malloc_unlock>> functions for your system. See the documentation |
| for those functions. |
| |
| These functions operate by calling the function <<_sbrk_r>> or |
| <<sbrk>>, which allocates space. You may need to provide one of these |
| functions for your system. <<_sbrk_r>> is called with a positive |
| value to allocate more space, and with a negative value to release |
| previously allocated space if it is no longer required. |
| @xref{Stubs}. |
| |
| RETURNS |
| <<malloc>> returns a pointer to the newly allocated space, if |
| successful; otherwise it returns <<NULL>>. If your application needs |
| to generate empty objects, you may use <<malloc(0)>> for this purpose. |
| |
| <<realloc>> returns a pointer to the new block of memory, or <<NULL>> |
| if a new block could not be allocated. <<NULL>> is also the result |
| when you use `<<realloc(<[aptr]>,0)>>' (which has the same effect as |
| `<<free(<[aptr]>)>>'). You should always check the result of |
| <<realloc>>; successful reallocation is not guaranteed even when |
| you request a smaller object. |
| |
| <<free>> does not return a result. |
| |
| <<memalign>> returns a pointer to the newly allocated space. |
| |
| <<malloc_usable_size>> returns the usable size. |
| |
| PORTABILITY |
| <<malloc>>, <<realloc>>, and <<free>> are specified by the ANSI C |
| standard, but other conforming implementations of <<malloc>> may |
| behave differently when <[nbytes]> is zero. |
| |
| <<memalign>> is part of SVR4. |
| |
| <<malloc_usable_size>> is not portable. |
| |
| Supporting OS subroutines required: <<sbrk>>. */ |
| |
| #include <_ansi.h> |
| #include <reent.h> |
| #include <stdlib.h> |
| #include <malloc.h> |
| |
| #ifndef _REENT_ONLY |
| |
| _PTR |
| _DEFUN (malloc, (nbytes), |
| size_t nbytes) /* get a block */ |
| { |
| return _malloc_r (_REENT, nbytes); |
| } |
| |
| void |
| _DEFUN (free, (aptr), |
| _PTR aptr) |
| { |
| _free_r (_REENT, aptr); |
| } |
| |
| #endif |
| |
| #endif /* ! defined (MALLOC_PROVIDED) */ |