summaryrefslogtreecommitdiff
path: root/acorn/src
diff options
context:
space:
mode:
Diffstat (limited to 'acorn/src')
-rw-r--r--acorn/src/malloc_wrapper.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/acorn/src/malloc_wrapper.c b/acorn/src/malloc_wrapper.c
new file mode 100644
index 0000000..3b5f9df
--- /dev/null
+++ b/acorn/src/malloc_wrapper.c
@@ -0,0 +1,41 @@
+#include <malloc.h>
+#include <FreeRTOS.h>
+#include <semphr.h>
+
+static xSemaphoreHandle malloc_sem = NULL;
+static malloc_t old_malloc;
+static realloc_t old_realloc;
+static free_t old_free;
+
+static void * malloc_wrap(size_t s) {
+ void * r;
+ xSemaphoreTakeRecursive(malloc_sem, portMAX_DELAY);
+ r = old_malloc(s);
+ xSemaphoreGiveRecursive(malloc_sem);
+ return r;
+}
+
+static void * realloc_wrap(void * p, size_t s) {
+ void * r;
+ xSemaphoreTakeRecursive(malloc_sem, portMAX_DELAY);
+ r = old_realloc(p, s);
+ xSemaphoreGiveRecursive(malloc_sem);
+ return r;
+}
+
+static void free_wrap(void * p) {
+ xSemaphoreTakeRecursive(malloc_sem, portMAX_DELAY);
+ old_free(p);
+ xSemaphoreGiveRecursive(malloc_sem);
+}
+
+void init_malloc_wrapper() {
+ malloc_sem = xSemaphoreCreateRecursiveMutex();
+ old_malloc = malloc;
+ old_realloc = realloc;
+ old_free = free;
+ malloc = malloc_wrap;
+ realloc = realloc_wrap;
+ free = free_wrap;
+}
+