diff options
-rw-r--r-- | extras/mini-os/include/xmalloc.h | 3 | ||||
-rw-r--r-- | extras/mini-os/lib/xmalloc.c | 21 |
2 files changed, 24 insertions, 0 deletions
diff --git a/extras/mini-os/include/xmalloc.h b/extras/mini-os/include/xmalloc.h index f5e721fa16..e8052ac68d 100644 --- a/extras/mini-os/include/xmalloc.h +++ b/extras/mini-os/include/xmalloc.h @@ -9,12 +9,15 @@ #define malloc(size) _xmalloc(size, 4) #define free(ptr) xfree(ptr) +#define realloc(ptr, size) _realloc(ptr, size) /* Free any of the above. */ extern void xfree(const void *); /* Underlying functions */ extern void *_xmalloc(size_t size, size_t align); +extern void *_realloc(void *ptr, size_t size); + static inline void *_xmalloc_array(size_t size, size_t align, size_t num) { /* Check for overflow. */ diff --git a/extras/mini-os/lib/xmalloc.c b/extras/mini-os/lib/xmalloc.c index 3246d57b32..de0001b31d 100644 --- a/extras/mini-os/lib/xmalloc.c +++ b/extras/mini-os/lib/xmalloc.c @@ -223,3 +223,24 @@ void xfree(const void *p) /* spin_unlock_irqrestore(&freelist_lock, flags); */ } +void *_realloc(void *ptr, size_t size) +{ + void *new; + struct xmalloc_hdr *hdr; + + if (ptr == NULL) + return _xmalloc(size, 4); + + hdr = (struct xmalloc_hdr *)ptr - 1; + if (hdr->size >= size) + return ptr; + + new = _xmalloc(size, 4); + if (new == NULL) + return NULL; + + memcpy(new, ptr, hdr->size); + xfree(ptr); + + return new; +} |