18 #include "heap_priv.h"
31 unsigned char *hp_find_block(
HP_BLOCK *block, uint32_t pos)
36 for (i= block->levels-1, ptr=block->root ; i > 0 ; i--)
38 ptr=(
HP_PTRS*)ptr->blocks[pos/block->level_info[i].records_under_level];
39 pos%=block->level_info[i].records_under_level;
41 return (
unsigned char*) ptr+ pos*block->recbuffer;
59 int hp_get_new_block(
HP_BLOCK *block,
size_t *alloc_length)
64 for (i=0 ; i < block->levels ; i++)
65 if (block->level_info[i].free_ptrs_in_block)
80 *alloc_length=
sizeof(
HP_PTRS)*i+block->records_in_block* block->recbuffer;
81 root=(
HP_PTRS*) malloc(*alloc_length);
86 block->root=block->level_info[0].last_blocks=root;
90 if ((uint) i == block->levels)
98 block->level_info[i].free_ptrs_in_block=HP_PTRS_IN_NOD-1;
99 ((
HP_PTRS**) root)[0]= block->root;
100 block->root=block->level_info[i].last_blocks= root++;
103 block->level_info[i].last_blocks->
104 blocks[HP_PTRS_IN_NOD - block->level_info[i].free_ptrs_in_block--]=
105 (
unsigned char*) root;
108 for (uint32_t j= i-1 ; j >0 ; j--)
110 block->level_info[j].last_blocks= root++;
111 block->level_info[j].last_blocks->blocks[0]=(
unsigned char*) root;
112 block->level_info[j].free_ptrs_in_block=HP_PTRS_IN_NOD-1;
119 block->level_info[0].last_blocks= root;
127 unsigned char *hp_free_level(
HP_BLOCK *block, uint32_t level,
HP_PTRS *pos,
unsigned char *last_pos)
129 unsigned char *next_ptr;
133 next_ptr=(
unsigned char*) pos+block->recbuffer;
137 int max_pos= (block->level_info[level-1].last_blocks == pos) ? HP_PTRS_IN_NOD - block->level_info[level-1].free_ptrs_in_block : HP_PTRS_IN_NOD;
139 next_ptr=(
unsigned char*) (pos+1);
140 for (
int i= 0; i < max_pos ; i++)
141 next_ptr=hp_free_level(block,level-1,
142 (
HP_PTRS*) pos->blocks[i],next_ptr);
145 if ((
unsigned char*) pos != last_pos)