|
|
@@ -15,6 +15,12 @@
|
|
|
#include "heap_private.h"
|
|
|
#include "esp_system.h"
|
|
|
|
|
|
+#define CALL_HOOK(hook, ...) { \
|
|
|
+ if (hook != NULL) { \
|
|
|
+ hook(__VA_ARGS__); \
|
|
|
+ } \
|
|
|
+}
|
|
|
+
|
|
|
/* Forward declaration for base function, put in IRAM.
|
|
|
* These functions don't check for errors after trying to allocate memory. */
|
|
|
static void *heap_caps_realloc_base( void *ptr, size_t size, uint32_t caps );
|
|
|
@@ -31,8 +37,6 @@ possible. This should optimize the amount of RAM accessible to the code without
|
|
|
*/
|
|
|
|
|
|
static esp_alloc_failed_hook_t alloc_failed_callback;
|
|
|
-static esp_heap_trace_alloc_hook_t trace_alloc_callback;
|
|
|
-static esp_heap_trace_free_hook_t trace_free_callback;
|
|
|
|
|
|
#ifdef CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS
|
|
|
IRAM_ATTR static void hex_to_str(char buf[8], uint32_t n)
|
|
|
@@ -100,28 +104,6 @@ esp_err_t heap_caps_register_failed_alloc_callback(esp_alloc_failed_hook_t callb
|
|
|
return ESP_OK;
|
|
|
}
|
|
|
|
|
|
-esp_err_t heap_caps_register_trace_alloc_callback(esp_heap_trace_alloc_hook_t callback)
|
|
|
-{
|
|
|
- if (callback == NULL) {
|
|
|
- return ESP_ERR_INVALID_ARG;
|
|
|
- }
|
|
|
-
|
|
|
- trace_alloc_callback = callback;
|
|
|
-
|
|
|
- return ESP_OK;
|
|
|
-}
|
|
|
-
|
|
|
-esp_err_t heap_caps_register_trace_free_callback(esp_heap_trace_free_hook_t callback)
|
|
|
-{
|
|
|
- if (callback == NULL) {
|
|
|
- return ESP_ERR_INVALID_ARG;
|
|
|
- }
|
|
|
-
|
|
|
- trace_free_callback = callback;
|
|
|
-
|
|
|
- return ESP_OK;
|
|
|
-}
|
|
|
-
|
|
|
bool heap_caps_match(const heap_t *heap, uint32_t caps)
|
|
|
{
|
|
|
return heap->heap != NULL && ((get_all_caps(heap) & caps) == caps);
|
|
|
@@ -136,11 +118,7 @@ IRAM_ATTR static void *heap_caps_malloc_base( size_t size, uint32_t caps)
|
|
|
{
|
|
|
void *ret = NULL;
|
|
|
|
|
|
- if (size == 0) {
|
|
|
- return NULL;
|
|
|
- }
|
|
|
-
|
|
|
- if (size > HEAP_SIZE_MAX) {
|
|
|
+ if (size == 0 || size > HEAP_SIZE_MAX ) {
|
|
|
// Avoids int overflow when adding small numbers to size, or
|
|
|
// calculating 'end' from start+size, by limiting 'size' to the possible range
|
|
|
return NULL;
|
|
|
@@ -185,12 +163,15 @@ IRAM_ATTR static void *heap_caps_malloc_base( size_t size, uint32_t caps)
|
|
|
ret = multi_heap_malloc(heap->heap, size + 4); // int overflow checked above
|
|
|
|
|
|
if (ret != NULL) {
|
|
|
- return dram_alloc_to_iram_addr(ret, size + 4); // int overflow checked above
|
|
|
+ uint32_t *iptr = dram_alloc_to_iram_addr(ret, size + 4); // int overflow checked above
|
|
|
+ CALL_HOOK(esp_heap_trace_alloc_hook, iptr, size, caps);
|
|
|
+ return iptr;
|
|
|
}
|
|
|
} else {
|
|
|
//Just try to alloc, nothing special.
|
|
|
ret = multi_heap_malloc(heap->heap, size);
|
|
|
if (ret != NULL) {
|
|
|
+ CALL_HOOK(esp_heap_trace_alloc_hook, ret, size, caps);
|
|
|
return ret;
|
|
|
}
|
|
|
}
|
|
|
@@ -211,9 +192,6 @@ IRAM_ATTR void *heap_caps_malloc( size_t size, uint32_t caps){
|
|
|
|
|
|
void* ptr = heap_caps_malloc_base(size, caps);
|
|
|
|
|
|
- if (trace_alloc_callback) {
|
|
|
- trace_alloc_callback(ptr, size);
|
|
|
- }
|
|
|
|
|
|
if (!ptr && size > 0){
|
|
|
heap_caps_alloc_failed(size, caps, __func__);
|
|
|
@@ -255,11 +233,6 @@ IRAM_ATTR void *heap_caps_malloc_default( size_t size )
|
|
|
r=heap_caps_malloc_base( size, MALLOC_CAP_DEFAULT );
|
|
|
}
|
|
|
|
|
|
- // trace allocation
|
|
|
- if (trace_alloc_callback) {
|
|
|
- trace_alloc_callback(r, size);
|
|
|
- }
|
|
|
-
|
|
|
// allocation failure?
|
|
|
if (r==NULL && size > 0){
|
|
|
heap_caps_alloc_failed(size, MALLOC_CAP_DEFAULT, __func__);
|
|
|
@@ -294,11 +267,6 @@ IRAM_ATTR void *heap_caps_realloc_default( void *ptr, size_t size )
|
|
|
r=heap_caps_realloc_base( ptr, size, MALLOC_CAP_DEFAULT);
|
|
|
}
|
|
|
|
|
|
- // trace allocation
|
|
|
- if (trace_alloc_callback) {
|
|
|
- trace_alloc_callback(r, size);
|
|
|
- }
|
|
|
-
|
|
|
// allocation failure?
|
|
|
if (r==NULL && size>0){
|
|
|
heap_caps_alloc_failed(size, MALLOC_CAP_DEFAULT, __func__);
|
|
|
@@ -323,9 +291,7 @@ IRAM_ATTR void *heap_caps_malloc_prefer( size_t size, size_t num, ... )
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
- if (trace_alloc_callback) {
|
|
|
- trace_alloc_callback(r, size);
|
|
|
- }
|
|
|
+
|
|
|
if (r == NULL && size > 0){
|
|
|
heap_caps_alloc_failed(size, caps, __func__);
|
|
|
}
|
|
|
@@ -349,9 +315,7 @@ IRAM_ATTR void *heap_caps_realloc_prefer( void *ptr, size_t size, size_t num, ..
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
- if (trace_alloc_callback) {
|
|
|
- trace_alloc_callback(r, size);
|
|
|
- }
|
|
|
+
|
|
|
if (r == NULL && size > 0){
|
|
|
heap_caps_alloc_failed(size, caps, __func__);
|
|
|
}
|
|
|
@@ -375,9 +339,7 @@ IRAM_ATTR void *heap_caps_calloc_prefer( size_t n, size_t size, size_t num, ...
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
- if (trace_alloc_callback) {
|
|
|
- trace_alloc_callback(r, size);
|
|
|
- }
|
|
|
+
|
|
|
if (r == NULL && size > 0){
|
|
|
heap_caps_alloc_failed(size, caps, __func__);
|
|
|
}
|
|
|
@@ -421,9 +383,7 @@ IRAM_ATTR void heap_caps_free( void *ptr)
|
|
|
assert(heap != NULL && "free() target pointer is outside heap areas");
|
|
|
multi_heap_free(heap->heap, ptr);
|
|
|
|
|
|
- if (trace_free_callback) {
|
|
|
- trace_free_callback(ptr);
|
|
|
- }
|
|
|
+ CALL_HOOK(esp_heap_trace_free_hook, ptr);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
@@ -477,6 +437,7 @@ IRAM_ATTR static void *heap_caps_realloc_base( void *ptr, size_t size, uint32_t
|
|
|
// (which will resize the block if it can)
|
|
|
void *r = multi_heap_realloc(heap->heap, ptr, size);
|
|
|
if (r != NULL) {
|
|
|
+ CALL_HOOK(esp_heap_trace_alloc_hook, r, size, caps);
|
|
|
return r;
|
|
|
}
|
|
|
}
|
|
|
@@ -508,9 +469,7 @@ IRAM_ATTR void *heap_caps_realloc( void *ptr, size_t size, uint32_t caps)
|
|
|
{
|
|
|
ptr = heap_caps_realloc_base(ptr, size, caps);
|
|
|
|
|
|
- if (trace_alloc_callback) {
|
|
|
- trace_alloc_callback(ptr, size);
|
|
|
- }
|
|
|
+
|
|
|
if (ptr == NULL && size > 0){
|
|
|
heap_caps_alloc_failed(size, caps, __func__);
|
|
|
}
|
|
|
@@ -542,9 +501,7 @@ IRAM_ATTR void *heap_caps_calloc( size_t n, size_t size, uint32_t caps)
|
|
|
{
|
|
|
void* ptr = heap_caps_calloc_base(n, size, caps);
|
|
|
|
|
|
- if (trace_alloc_callback) {
|
|
|
- trace_alloc_callback(ptr, size);
|
|
|
- }
|
|
|
+
|
|
|
if (!ptr && size > 0){
|
|
|
heap_caps_alloc_failed(size, caps, __func__);
|
|
|
}
|
|
|
@@ -696,7 +653,7 @@ size_t heap_caps_get_allocated_size( void *ptr )
|
|
|
|
|
|
IRAM_ATTR void *heap_caps_aligned_alloc(size_t alignment, size_t size, uint32_t caps)
|
|
|
{
|
|
|
- void *ptr = NULL;
|
|
|
+ void *ret = NULL;
|
|
|
|
|
|
if(!alignment) {
|
|
|
return NULL;
|
|
|
@@ -731,24 +688,20 @@ IRAM_ATTR void *heap_caps_aligned_alloc(size_t alignment, size_t size, uint32_t
|
|
|
//doesn't cover, see if they're available in other prios.
|
|
|
if ((get_all_caps(heap) & caps) == caps) {
|
|
|
//Just try to alloc, nothing special.
|
|
|
- ptr = multi_heap_aligned_alloc(heap->heap, size, alignment);
|
|
|
- if (ptr != NULL) {
|
|
|
- break;
|
|
|
+ ret = multi_heap_aligned_alloc(heap->heap, size, alignment);
|
|
|
+ if (ret != NULL) {
|
|
|
+ CALL_HOOK(esp_heap_trace_alloc_hook, ret, size, caps);
|
|
|
+ return ret;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (trace_alloc_callback) {
|
|
|
- trace_alloc_callback(ptr, size);
|
|
|
- }
|
|
|
-
|
|
|
- if (size > 0 && ptr != NULL) {
|
|
|
- heap_caps_alloc_failed(size, caps, __func__);
|
|
|
- }
|
|
|
+ heap_caps_alloc_failed(size, caps, __func__);
|
|
|
|
|
|
- return ptr;
|
|
|
+ //Nothing usable found.
|
|
|
+ return NULL;
|
|
|
}
|
|
|
|
|
|
IRAM_ATTR void heap_caps_aligned_free(void *ptr)
|