Lines Matching refs:pool

51 clear_bits (cairo_mempool_t *pool, size_t first, size_t last)  in clear_bits()  argument
61 BITCLEAR (pool, i); in clear_bits()
66 memset (pool->map + (first_full >> 3), 0, bytes); in clear_bits()
72 BITCLEAR (pool, i); in clear_bits()
76 free_bits (cairo_mempool_t *pool, size_t start, int bits, cairo_bool_t clear) in free_bits() argument
81 clear_bits (pool, start, start + (1 << bits)); in free_bits()
83 block = pool->blocks + start; in free_bits()
86 cairo_list_add (&block->link, &pool->free[bits]); in free_bits()
88 pool->free_bytes += 1 << (bits + pool->min_bits); in free_bits()
89 if (bits > pool->max_free_bits) in free_bits()
90 pool->max_free_bits = bits; in free_bits()
95 free_blocks (cairo_mempool_t *pool, in free_blocks() argument
124 while (bits < pool->num_sizes - 1) { in free_blocks()
151 free_bits (pool, i, bits, clear); in free_blocks()
156 get_buddy (cairo_mempool_t *pool, size_t offset, int bits) in get_buddy() argument
160 if (offset + (1 << bits) >= pool->num_blocks) in get_buddy()
163 if (BITTEST (pool, offset + (1 << bits) - 1)) in get_buddy()
166 block = pool->blocks + offset; in get_buddy()
174 merge_buddies (cairo_mempool_t *pool, in merge_buddies() argument
178 size_t block_offset = block - pool->blocks; in merge_buddies()
185 block = get_buddy (pool, buddy_offset, bits); in merge_buddies()
198 block = pool->blocks + block_offset; in merge_buddies()
200 cairo_list_add (&block->link, &pool->free[bits]); in merge_buddies()
202 if (bits > pool->max_free_bits) in merge_buddies()
203 pool->max_free_bits = bits; in merge_buddies()
208 merge_bits (cairo_mempool_t *pool, int max_bits) in merge_bits() argument
216 &pool->free[bits], in merge_bits()
219 size_t buddy_offset = (block - pool->blocks) ^ (1 << bits); in merge_bits()
221 buddy = get_buddy (pool, buddy_offset, bits); in merge_bits()
232 merge_buddies (pool, block, max_bits); in merge_bits()
236 return pool->max_free_bits; in merge_bits()
241 buddy_malloc (cairo_mempool_t *pool, int bits) in buddy_malloc() argument
247 if (bits > pool->max_free_bits && bits > merge_bits (pool, bits)) in buddy_malloc()
252 for (b = bits; b <= pool->max_free_bits; b++) { in buddy_malloc()
253 if (! cairo_list_is_empty (&pool->free[b])) { in buddy_malloc()
254 block = cairo_list_first_entry (&pool->free[b], in buddy_malloc()
264 while (cairo_list_is_empty (&pool->free[pool->max_free_bits])) { in buddy_malloc()
265 if (--pool->max_free_bits == -1) in buddy_malloc()
270 offset = block - pool->blocks; in buddy_malloc()
272 BITSET (pool, past - 1); in buddy_malloc()
276 pool->free_bytes -= 1 << (b + pool->min_bits); in buddy_malloc()
277 free_blocks (pool, past, offset + (1 << b), 0); in buddy_malloc()
279 return pool->base + ((block - pool->blocks) << pool->min_bits); in buddy_malloc()
283 _cairo_mempool_init (cairo_mempool_t *pool, in _cairo_mempool_init() argument
300 assert (num_sizes < ARRAY_LENGTH (pool->free)); in _cairo_mempool_init()
302 pool->base = base; in _cairo_mempool_init()
303 pool->free_bytes = 0; in _cairo_mempool_init()
304 pool->max_bytes = bytes; in _cairo_mempool_init()
305 pool->max_free_bits = -1; in _cairo_mempool_init()
308 pool->blocks = calloc (num_blocks, sizeof (struct _cairo_memblock)); in _cairo_mempool_init()
309 if (pool->blocks == NULL) in _cairo_mempool_init()
312 pool->num_blocks = num_blocks; in _cairo_mempool_init()
313 pool->min_bits = min_bits; in _cairo_mempool_init()
314 pool->num_sizes = num_sizes; in _cairo_mempool_init()
316 for (i = 0; i < ARRAY_LENGTH (pool->free); i++) in _cairo_mempool_init()
317 cairo_list_init (&pool->free[i]); in _cairo_mempool_init()
319 pool->map = _cairo_malloc ((num_blocks + 7) >> 3); in _cairo_mempool_init()
320 if (pool->map == NULL) { in _cairo_mempool_init()
321 free (pool->blocks); in _cairo_mempool_init()
325 memset (pool->map, -1, (num_blocks + 7) >> 3); in _cairo_mempool_init()
326 clear_bits (pool, 0, num_blocks); in _cairo_mempool_init()
329 free_blocks (pool, 0, num_blocks, 1); in _cairo_mempool_init()
335 _cairo_mempool_alloc (cairo_mempool_t *pool, size_t bytes) in _cairo_mempool_alloc() argument
340 size = 1 << pool->min_bits; in _cairo_mempool_alloc()
343 if (bits >= pool->num_sizes) in _cairo_mempool_alloc()
346 return buddy_malloc (pool, bits); in _cairo_mempool_alloc()
350 _cairo_mempool_free (cairo_mempool_t *pool, void *storage) in _cairo_mempool_free() argument
355 block_offset = ((char *)storage - pool->base) >> pool->min_bits; in _cairo_mempool_free()
356 block = pool->blocks + block_offset; in _cairo_mempool_free()
358 BITCLEAR (pool, block_offset + ((1 << block->bits) - 1)); in _cairo_mempool_free()
359 pool->free_bytes += 1 << (block->bits + pool->min_bits); in _cairo_mempool_free()
361 merge_buddies (pool, block, pool->num_sizes); in _cairo_mempool_free()
365 _cairo_mempool_fini (cairo_mempool_t *pool) in _cairo_mempool_fini() argument
367 free (pool->map); in _cairo_mempool_fini()
368 free (pool->blocks); in _cairo_mempool_fini()