From 1b89f334e396cf2d097605ac56629d8d7e709585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Kijewski?= <rene.kijewski@fu-berlin.de> Date: Thu, 15 May 2014 16:30:47 +0200 Subject: [PATCH] msp430: provide oneway-malloc implicitly For MSP430 boards oneway-malloc is already used *if* `malloc.h` was included. The problem is that `malloc.h` is not a standard header, even though it is common. `stdlib.h` in the right place to look for `malloc()` and friends. This change removes this discrepancy. `malloc()` is just named like that, without the leading underscore. The symbols now are weak, which means that they won't override library functions if MSP's standard library will provide these functions at some point. (Unlikely, since using `malloc()` on tiny systems is less then optimal ...) Closes #1061 and #863. --- core/include/oneway_malloc.h | 75 ---------------------------- core/oneway_malloc.c | 67 ------------------------- cpu/msp430-common/Makefile.include | 2 + cpu/msp430-common/include/malloc.h | 11 ----- sys/Makefile | 3 ++ sys/Makefile.include | 4 ++ sys/oneway-malloc/Makefile | 3 ++ sys/oneway-malloc/include/malloc.h | 11 +++++ sys/oneway-malloc/oneway-malloc.c | 78 ++++++++++++++++++++++++++++++ 9 files changed, 101 insertions(+), 153 deletions(-) delete mode 100644 core/include/oneway_malloc.h delete mode 100644 core/oneway_malloc.c delete mode 100644 cpu/msp430-common/include/malloc.h create mode 100644 sys/oneway-malloc/Makefile create mode 100644 sys/oneway-malloc/include/malloc.h create mode 100644 sys/oneway-malloc/oneway-malloc.c diff --git a/core/include/oneway_malloc.h b/core/include/oneway_malloc.h deleted file mode 100644 index 3f24ff3075..0000000000 --- a/core/include/oneway_malloc.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2013 Freie Universität Berlin - * - * This file is subject to the terms and conditions of the GNU Lesser General - * Public License. See the file LICENSE in the top level directory for more - * details. - */ - -/** - * @addtogroup core_util - * @{ - * - * @file oneway_malloc.h - * @brief Simple malloc wrapper for sbrk - * - * @author Freie Universität Berlin, Computer Systems & Telematics - * @author Kaspar Schleiser <kaspar@schleiser.de> - * - * @detail Simple malloc implementation for plattforms - * without malloc in libc, e.g. msb430. - */ - -#ifndef _MALLOC_H_ -#define _MALLOC_H_ - -#include <stddef.h> - -/** - * @brief Allocates a block of `size` bytes of memory - * - * @param[in] Size of the memory block, in bytes. - * - * @return On success, a pointer to the memory block allocated by the function. - * @return NULL otherwise. - */ -void *_malloc(size_t size); - -/** - * @brief Changes the size of the memory block pointed to by ptr. - * - * @param[in] Pointer to a memory block previously allocated with malloc, - * calloc or realloc. - * - * @param[in] New size for the memory block, in bytes. - * - * @return A pointer to the reallocated memory block, which may be either - * the same as ptr or a new location. - */ -void *_realloc(void *ptr, size_t size); - -/** - * @brief Allocates a block of memory for an array of num elements, - * each of them size bytes long, and initializes all its bits to zero. - * - * @param[in] Number of elements to allocate. - * @param[in] Size of each element. - * - * @return On success, a pointer to the memory block allocated by the function. - * If the function failed to allocate the requested block of memory, - * a null pointer is returned. - */ -void *_calloc(int size, size_t cnt); - -/** - * @brief A block of memory previously allocated by a call to malloc, - * calloc or realloc is deallocated, making it available again - * for further allocations. - * - * @param[in] Pointer to a memory block previously allocated with malloc, - * calloc or realloc. - */ -void _free(void *ptr); - -/** @} */ -#endif /* _MALLOC_H_ */ diff --git a/core/oneway_malloc.c b/core/oneway_malloc.c deleted file mode 100644 index 348ab641de..0000000000 --- a/core/oneway_malloc.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2013 Freie Universität Berlin - * - * This file is subject to the terms and conditions of the GNU Lesser General - * Public License. See the file LICENSE in the top level directory for more - * details. - */ - -/** - * @ingroup core_util - * @{ - * - * @file oneway_malloc.c - * @brief Simple malloc wrapper for SBRK - - * @author Kaspar Schleiser <kaspar@schleiser.de> - * - * @} - */ - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#define ENABLE_DEBUG (0) -#include "debug.h" - -extern void *sbrk(int incr); - -void *_malloc(size_t size) -{ - void *ptr = sbrk(size); - - DEBUG("_malloc(): allocating block of size %u at 0x%X.\n", (unsigned int) size, (unsigned int)ptr); - - if (ptr != (void*) - 1) { - return ptr; - } - else { - return NULL; - } -} - -void *_realloc(void *ptr, size_t size) -{ - void *newptr = _malloc(size); - memcpy(newptr, ptr, size); - free(ptr); - return newptr; -} - -void *_calloc(int size, size_t cnt) -{ - void *mem = _malloc(size * cnt); - if (mem) { - memset(mem, 0, size * cnt); - } - return mem; -} - -void _free(void *ptr) -{ - /* who cares about pointers? */ - (void) ptr; - - DEBUG("_free(): block at 0x%X lost.\n", (unsigned int)ptr); -} diff --git a/cpu/msp430-common/Makefile.include b/cpu/msp430-common/Makefile.include index caa62451a9..02ed2b915e 100644 --- a/cpu/msp430-common/Makefile.include +++ b/cpu/msp430-common/Makefile.include @@ -1 +1,3 @@ INCLUDES += -I$(RIOTBASE)/cpu/msp430-common/include/ + +DEFAULT_MODULE += oneway_malloc diff --git a/cpu/msp430-common/include/malloc.h b/cpu/msp430-common/include/malloc.h deleted file mode 100644 index f465d2c11b..0000000000 --- a/cpu/msp430-common/include/malloc.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef __MALLOC_H -#define __MALLOC_H - -#include "oneway_malloc.h" - -#define malloc _malloc -#define calloc _calloc -#define realloc _realloc -#define free _free - -#endif /* __MALLOC_H */ diff --git a/sys/Makefile b/sys/Makefile index e9e61c1ccf..c20e4781f9 100644 --- a/sys/Makefile +++ b/sys/Makefile @@ -89,6 +89,9 @@ endif ifneq (,$(filter quad_math,$(USEMODULE))) DIRS += quad_math endif +ifneq (,$(filter oneway_malloc,$(USEMODULE))) + DIRS += oneway-malloc +endif all: $(BINDIR)$(MODULE).a @for i in $(DIRS) ; do "$(MAKE)" -C $$i || exit 1; done ; diff --git a/sys/Makefile.include b/sys/Makefile.include index ddf496ce1b..2073b310a7 100644 --- a/sys/Makefile.include +++ b/sys/Makefile.include @@ -43,3 +43,7 @@ endif ifneq (,$(filter pthread,$(USEMODULE))) USEMODULE_INCLUDES += $(RIOTBASE)/sys/posix/pthread/include endif + +ifneq (,$(filter oneway_malloc,$(USEMODULE))) + USEMODULE_INCLUDES += $(RIOTBASE)/sys/oneway-malloc/include +endif diff --git a/sys/oneway-malloc/Makefile b/sys/oneway-malloc/Makefile new file mode 100644 index 0000000000..c5eae4a3c0 --- /dev/null +++ b/sys/oneway-malloc/Makefile @@ -0,0 +1,3 @@ +MODULE = oneway_malloc + +include $(RIOTBASE)/Makefile.base diff --git a/sys/oneway-malloc/include/malloc.h b/sys/oneway-malloc/include/malloc.h new file mode 100644 index 0000000000..0212e0c758 --- /dev/null +++ b/sys/oneway-malloc/include/malloc.h @@ -0,0 +1,11 @@ +#ifndef __MALLOC_H +#define __MALLOC_H + +#include <stdlib.h> + +void *malloc(size_t size); +void *realloc(void *ptr, size_t size); +void *calloc(int size, size_t cnt); +void free(void *ptr); + +#endif /* __MALLOC_H */ diff --git a/sys/oneway-malloc/oneway-malloc.c b/sys/oneway-malloc/oneway-malloc.c new file mode 100644 index 0000000000..35024717e3 --- /dev/null +++ b/sys/oneway-malloc/oneway-malloc.c @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2013 Freie Universität Berlin + * + * This file is subject to the terms and conditions of the GNU Lesser General + * Public License. See the file LICENSE in the top level directory for more + * details. + */ + +/** + * @addtogroup oneway_malloc + * @ingroup sys + * @{ + * + * @file oneway_malloc.c + * @brief Simple malloc wrapper for SBRK + + * @author Kaspar Schleiser <kaspar@schleiser.de> + * + * @} + */ + +#include <string.h> + +#include "malloc.h" + +#define ENABLE_DEBUG (0) +#include "debug.h" + +extern void *sbrk(int incr); + +void __attribute__((weak)) *malloc(size_t size) +{ + if (size != 0) { + void *ptr = sbrk(size); + + DEBUG("malloc(): allocating block of size %u at %p.\n", (unsigned int) size, ptr); + + if (ptr != (void*) -1) { + return ptr; + } + } + return NULL; +} + +void __attribute__((weak)) *realloc(void *ptr, size_t size) +{ + if (ptr == NULL) { + return malloc(size); + } + else if (size == 0) { + free(ptr); + return NULL; + } + else { + void *newptr = malloc(size); + if (newptr) { + memcpy(newptr, ptr, size); + } + return newptr; + } +} + +void __attribute__((weak)) *calloc(int size, size_t cnt) +{ + void *mem = malloc(size * cnt); + if (mem) { + memset(mem, 0, size * cnt); + } + return mem; +} + +void __attribute__((weak)) free(void *ptr) +{ + /* who cares about pointers? */ + (void) ptr; + + DEBUG("free(): block at %p lost.\n", ptr); +} -- GitLab