2017-05-03 04:03:28 -04:00
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
# pragma once
# include <stdlib.h>
# include <stdint.h>
# include <soc/soc_memory_layout.h>
# include "multi_heap.h"
2019-12-18 11:04:49 -05:00
# include "multi_heap_platform.h"
2019-03-14 05:29:32 -04:00
# include "sys/queue.h"
2017-08-28 03:12:29 -04:00
# ifdef __cplusplus
extern " C " {
# endif
2017-05-03 04:03:28 -04:00
/* Some common heap registration data structures used
for heap_caps_init . c to share heap information with heap_caps . c
*/
2019-03-10 19:49:51 -04:00
# define HEAP_SIZE_MAX (SOC_MAX_CONTIGUOUS_RAM_SIZE)
2017-05-03 04:03:28 -04:00
/* Type for describing each registered heap */
2017-08-28 03:12:29 -04:00
typedef struct heap_t_ {
2017-07-19 03:10:33 -04:00
uint32_t caps [ SOC_MEMORY_TYPE_NO_PRIOS ] ; ///< Capabilities for the type of memory in this heap (as a prioritised set). Copied from soc_memory_types so it's in RAM not flash.
2017-05-03 04:03:28 -04:00
intptr_t start ;
intptr_t end ;
2019-12-18 11:04:49 -05:00
multi_heap_lock_t heap_mux ;
2017-05-03 04:03:28 -04:00
multi_heap_handle_t heap ;
2017-08-28 03:12:29 -04:00
SLIST_ENTRY ( heap_t_ ) next ;
2017-05-03 04:03:28 -04:00
} heap_t ;
2017-08-28 03:12:29 -04:00
/* All registered heaps.
Forms a single linked list , even though most entries are contiguous .
This means at the expense of 4 bytes per heap , new heaps can be
added at runtime in a fast & thread - safe way .
*/
extern SLIST_HEAD ( registered_heap_ll , heap_t_ ) registered_heaps ;
2017-05-03 04:03:28 -04:00
2017-07-19 03:10:33 -04:00
bool heap_caps_match ( const heap_t * heap , uint32_t caps ) ;
2018-01-10 04:14:47 -05:00
/* return all possible capabilities (across all priorities) for a given heap */
2022-11-04 10:48:09 -04:00
inline static __attribute__ ( ( always_inline ) ) uint32_t get_all_caps ( const heap_t * heap )
2018-01-10 04:14:47 -05:00
{
if ( heap - > heap = = NULL ) {
return 0 ;
}
uint32_t all_caps = 0 ;
for ( int prio = 0 ; prio < SOC_MEMORY_TYPE_NO_PRIOS ; prio + + ) {
all_caps | = heap - > caps [ prio ] ;
}
return all_caps ;
}
2017-09-05 05:29:57 -04:00
/*
Because we don ' t want to add _another_ known allocation method to the stack of functions to trace wrt memory tracing ,
2020-11-10 02:40:01 -05:00
these are declared private . The newlib malloc ( ) / realloc ( ) implementation also calls these , so they are declared
2017-09-05 05:29:57 -04:00
separately in newlib / syscalls . c .
*/
void * heap_caps_realloc_default ( void * p , size_t size ) ;
void * heap_caps_malloc_default ( size_t size ) ;
2017-08-28 03:12:29 -04:00
# ifdef __cplusplus
}
# endif