1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/sys/malloc_thread_safe/malloc_wrappers.c
Marian Buschsieweke c790e2eb6d
sys/malloc_thread_safety: use mutex
Disabling IRQs during malloc() provides mutually exclusive access and even is
safe from IRQ context, but is suboptimal for real time scenarios. Instead, the
implementation is changed to use a mutex to provide mutually exclusive access.

As a result, calls to malloc() and free() from IRQ context no longer is
possible. But this this is a really horrible idea to begin with, the impact
should be minimal and the improved real time properties of the system should
make it a good trade-off. An assert() is added to allow easy detection of
regressions and, hence, aid users to fix their code.
2020-12-17 15:39:05 +01:00

64 lines
1.3 KiB
C

/*
* Copyright (C) 2019 Gunar Schorcht
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @{
*
* @file
* @brief Implements various POSIX syscalls
* @author Gunar Schorcht <gunar@schorcht.net>
*/
#include "assert.h"
#include "irq.h"
#include "mutex.h"
extern void *__real_malloc(size_t size);
extern void __real_free(void *ptr);
extern void *__real_calloc(size_t nmemb, size_t size);
extern void *__real_realloc(void *ptr, size_t size);
static mutex_t _lock;
void *__wrap_malloc(size_t size)
{
assert(!irq_is_in());
mutex_lock(&_lock);
void *ptr = __real_malloc(size);
mutex_unlock(&_lock);
return ptr;
}
void __wrap_free(void *ptr)
{
assert(!irq_is_in());
mutex_lock(&_lock);
__real_free(ptr);
mutex_unlock(&_lock);
}
void *__wrap_calloc(size_t nmemb, size_t size)
{
assert(!irq_is_in());
mutex_lock(&_lock);
void *ptr = __real_calloc(nmemb, size);
mutex_unlock(&_lock);
return ptr;
}
void *__wrap_realloc(void *ptr, size_t size)
{
assert(!irq_is_in());
mutex_lock(&_lock);
void *new = __real_realloc(ptr, size);
mutex_unlock(&_lock);
return new;
}
/** @} */