2017-05-03 18:03:28 +10: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 17:04:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "multi_heap_platform.h" 
  
						 
					
						
							
								
									
										
										
										
											2019-03-14 17:29:32 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "sys/queue.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-28 17:12:29 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef __cplusplus 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								extern  " C "  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-05-03 18:03:28 +10:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Some common heap registration data structures used
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   for  heap_caps_init . c  to  share  heap  information  with  heap_caps . c 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-11 10:49:51 +11:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define HEAP_SIZE_MAX (SOC_MAX_CONTIGUOUS_RAM_SIZE) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-03 18:03:28 +10:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/* Type for describing each registered heap */  
						 
					
						
							
								
									
										
										
										
											2017-08-28 17:12:29 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								typedef  struct  heap_t_  {  
						 
					
						
							
								
									
										
										
										
											2017-07-19 17:10:33 +10: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 18:03:28 +10:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    intptr_t  start ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    intptr_t  end ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-18 17:04:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    multi_heap_lock_t  heap_mux ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-03 18:03:28 +10:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    multi_heap_handle_t  heap ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-28 17:12:29 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SLIST_ENTRY ( heap_t_ )  next ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-03 18:03:28 +10:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  heap_t ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-28 17:12:29 +10: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 18:03:28 +10:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-07-19 17:10:33 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  heap_caps_match ( const  heap_t  * heap ,  uint32_t  caps ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-10 01:14:47 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/* return all possible capabilities (across all priorities) for a given heap */  
						 
					
						
							
								
									
										
										
										
											2018-06-27 17:16:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								inline  static  IRAM_ATTR  uint32_t  get_all_caps ( const  heap_t  * heap )  
						 
					
						
							
								
									
										
										
										
											2018-01-10 01:14:47 -08: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 17:29:57 +08: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 18:40:01 +11:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 these  are  declared  private .  The  newlib  malloc ( ) / realloc ( )  implementation  also  calls  these ,  so  they  are  declared 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-05 17:29:57 +08: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 17:12:29 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef __cplusplus 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif