19 #define ZRTOS_VHEAP__INIT(name,heap_size) \ 21 uint8_t heap[heap_size]; \ 22 }__attribute__((aligned(ZRTOS_ARCH__BYTE_ALIGNMENT)))name; 25 #define ZRTOS_VHEAP__GET(name) \ 26 ((zrtos_vheap_t*)&(name.heap[0])) 41 zrtos_debug__memset(heap,0xEE,heap_size);
86 for(
size_t l = thiz->
length;l--;node++){
99 for(
size_t l = thiz->
length;l--;node++){
154 if(free_space >= length_total){
157 size_t heap_length = thiz->
heap_size - index_length;
171 chunk->
first[0] = 0x55;
172 chunk->
first[1] = 0x55;
179 chunk->
last[0] = 0x66;
180 chunk->
last[1] = 0x66;
184 for(;node < chunk;node++){
190 zrtos_debug__memset(chunk->ptr,(
int)(pattern++),chunk->length);
217 ,
size_t sizeof_mem_chunk
222 for(;node < sentinel;node++){
223 node->
ptr -= sizeof_mem_chunk + (node > chunk ?
length : 0);
231 for(;node < sentinel;node++){
248 void *chunk_ptr = chunk->
ptr;
254 sentinel = chunk_ptr;
256 while(src < ((
uint8_t*)sentinel)){
283 _zrtos_vheap__free_helper(thiz,last);
288 _zrtos_vheap__free_helper(thiz,chunk);
307 void *ret = buffer + heap_length - chunk_length;
309 buffer + chunk_offset
311 ,used_length - chunk_offset
315 ,buffer + used_length - chunk_length
327 void *chunk_ptr = chunk->
ptr;
363 chunk->
ptr = heap_end_ptr;
397 #define ZRTOS_VHEAP__EACH_EX_BEGIN(thiz,start_offset,l,type,value) \ 398 for(size_t l = start_offset,len__=(thiz)->length;l < len__;l++){ \ 399 zrtos_vheap_chunk_t *value = &((zrtos_vheap_chunk_t*)((thiz)->ptr))[l]; \ 400 if(zrtos_vheap_chunk__is_type_eq(value,type)){ 402 #define ZRTOS_VHEAP__EACH_EX_END \ 406 #define ZRTOS_VHEAP__EACH_BEGIN(thiz,type,value) \ 407 for(size_t l__ = 0,len__=(thiz)->length;l__ < len__;l__++){ \ 408 zrtos_vheap_chunk_t *value = &((zrtos_vheap_chunk_t*)((thiz)->ptr))[l]; \ 409 if(zrtos_vheap_chunk__is_type_eq(value,type)) 411 #define ZRTOS_VHEAP__EACH_END \
struct _zrtos_vheap_chunk_t zrtos_vheap_chunk_t
void _zrtos_vheap__free(zrtos_vheap_t *thiz, zrtos_vheap_chunk_t *chunk)
#define ZRTOS_DEBUG__CODE(code)
void zrtos_mem__left_rotate(void *ptr, size_t length, size_t buffer_length)
void zrtos_mem__move_right_overlapping(void *dest, void *src, size_t length)
zrtos_vheap_chunk_t * zrtos_vheap__get_by_type(zrtos_vheap_t *thiz, zrtos_vheap_chunk_type_t type)
zrtos_vheap_chunk_t * zrtos_vheap__get_by_id(zrtos_vheap_t *thiz, zrtos_vheap_chunk_uid_t uid)
zrtos_vheap_chunk_t * zrtos_vheap__get_by_type_ex(zrtos_vheap_t *thiz, zrtos_vheap_type_t type)
int zrtos_vheap_chunk_uid__cmp(zrtos_vheap_chunk_uid_t *a, zrtos_vheap_chunk_uid_t *b)
static zrtos_vheap_chunk_uid_t zrtos_vheap__get_next_uid(zrtos_vheap_t *thiz)
zrtos_vheap_chunk_t * zrtos_vheap__get_child(zrtos_vheap_t *thiz, zrtos_vheap_chunk_t *chunk)
void zrtos_vheap__free_helper(zrtos_vheap_t *thiz, zrtos_vheap_chunk_t *chunk)
#define ZRTOS_TYPES__MIN(a, b)
zrtos_vheap_chunk_t * _zrtos_vheap__malloc(zrtos_vheap_t *thiz, zrtos_vheap_chunk_uid_t parent, zrtos_vheap_type_t type, size_t length)
static void * _zrtos_vheap__swap_to_heap_end(void *heap, size_t heap_length, size_t used_length, size_t chunk_offset, size_t chunk_length)
void * zrtos_types__ptr_add(void *ptr, size_t byte_len)
void zrtos_vheap__free(zrtos_vheap_t *thiz, zrtos_vheap_chunk_uid_t uid)
size_t zrtos_vheap__get_chunk_count(zrtos_vheap_t *thiz)
bool zrtos_vheap__init(zrtos_vheap_t *thiz, void *heap, size_t heap_size)
void * zrtos_vheap__get_last_address(zrtos_vheap_t *thiz)
size_t zrtos_types__ptr_get_byte_distance(void *bigger, void *smaller)
zrtos_vheap_chunk_uid_t zrtos_vheap_chunk_uid__error(void)
struct _zrtos_vheap_t zrtos_vheap_t
static void _zrtos_vheap__update_index_ptr(zrtos_vheap_t *thiz, zrtos_vheap_chunk_t *chunk, size_t sizeof_mem_chunk)
zrtos_vheap_chunk_uid_t uid
zrtos_vheap_chunk_uid_t zrtos_vheap__malloc(zrtos_vheap_t *thiz, zrtos_vheap_chunk_uid_t parent, zrtos_vheap_type_t type, size_t length)
zrtos_vheap_chunk_type_t type
void zrtos_vheap_chunk__set_type(zrtos_vheap_chunk_t *thiz, zrtos_vheap_type_t type)
size_t _zrtos_vheap__get_free_space(zrtos_vheap_t *thiz)
void * zrtos_vheap__page_in(zrtos_vheap_t *thiz, zrtos_vheap_chunk_t *chunk)
bool zrtos_vheap_chunk_type__init(zrtos_vheap_chunk_type_t *thiz, zrtos_vheap_type_t type)
size_t _zrtos_vheap__get_free_space_ex(zrtos_vheap_t *thiz, void *stack_ptr)
#define ZRTOS_ARCH__GET_STACK_PTR()
void * zrtos_vheap__get_stack_ptr(zrtos_vheap_t *thiz)
void zrtos_mem__move_left_overlapping(void *dest, void *src, size_t length)
void zrtos_vheap__page_out(zrtos_vheap_t *thiz, zrtos_vheap_chunk_t *chunk, size_t length)
zrtos_vheap_chunk_uid_t parent