Lines Matching refs:free_block
44 0 - The block is a free_block, with a different size member.
132 struct free_block {
134 struct free_block *next;
135 struct free_block *prev;
142 ((struct free_block*)(((sljit_u8*)base) + offset))
146 static struct free_block* free_blocks;
150 static SLJIT_INLINE void sljit_insert_free_block(struct free_block *free_block, sljit_uw size)
152 free_block->header.size = 0;
153 free_block->size = size;
155 free_block->next = free_blocks;
156 free_block->prev = NULL;
158 free_blocks->prev = free_block;
159 free_blocks = free_block;
162 static SLJIT_INLINE void sljit_remove_free_block(struct free_block *free_block)
164 if (free_block->next)
165 free_block->next->prev = free_block->prev;
167 if (free_block->prev)
168 free_block->prev->next = free_block->next;
170 SLJIT_ASSERT(free_blocks == free_block);
171 free_blocks = free_block->next;
179 struct free_block *free_block;
183 if (size < sizeof(struct free_block))
184 size = sizeof(struct free_block);
187 free_block = free_blocks;
188 while (free_block) {
189 if (free_block->size >= size) {
190 chunk_size = free_block->size;
194 free_block->size = chunk_size;
195 header = AS_BLOCK_HEADER(free_block, chunk_size);
200 sljit_remove_free_block(free_block);
201 header = (struct block_header*)free_block;
209 free_block = free_block->next;
229 free_block = AS_FREE_BLOCK(header, size);
230 free_block->header.prev_size = size;
231 sljit_insert_free_block(free_block, chunk_size);
232 next_header = AS_BLOCK_HEADER(free_block, chunk_size);
249 struct free_block* free_block;
257 /* If header->prev_size == 0, free_block will equal to header.
258 In this case, free_block->header.size will be > 0. */
259 free_block = AS_FREE_BLOCK(header, -(sljit_sw)header->prev_size);
260 if (SLJIT_UNLIKELY(!free_block->header.size)) {
261 free_block->size += header->size;
262 header = AS_BLOCK_HEADER(free_block, free_block->size);
263 header->prev_size = free_block->size;
266 free_block = (struct free_block*)header;
267 sljit_insert_free_block(free_block, header->size);
270 header = AS_BLOCK_HEADER(free_block, free_block->size);
272 free_block->size += ((struct free_block*)header)->size;
273 sljit_remove_free_block((struct free_block*)header);
274 header = AS_BLOCK_HEADER(free_block, free_block->size);
275 header->prev_size = free_block->size;
279 if (SLJIT_UNLIKELY(!free_block->header.prev_size && header->size == 1)) {
281 if (total_size - free_block->size > (allocated_size * 3 / 2)) {
282 total_size -= free_block->size;
283 sljit_remove_free_block(free_block);
284 free_chunk(free_block, free_block->size + sizeof(struct block_header));
293 struct free_block* free_block;
294 struct free_block* next_free_block;
298 free_block = free_blocks;
299 while (free_block) {
300 next_free_block = free_block->next;
301 if (!free_block->header.prev_size &&
302 AS_BLOCK_HEADER(free_block, free_block->size)->size == 1) {
303 total_size -= free_block->size;
304 sljit_remove_free_block(free_block);
305 free_chunk(free_block, free_block->size + sizeof(struct block_header));
307 free_block = next_free_block;