diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2009-08-02 13:09:30 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2009-08-29 08:08:30 +0100 |
commit | 09377a716334df3683912747067cd396768cfab6 (patch) | |
tree | 232895ccaa9d219dfe486ad624cce97a4a732efe /src/cairo-freelist-private.h | |
parent | 6f0340e2e5079eba597c0a3a7d39da21cf2b5e7a (diff) |
[freelist] Lazy initialisation of pools
Diffstat (limited to 'src/cairo-freelist-private.h')
-rw-r--r-- | src/cairo-freelist-private.h | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/src/cairo-freelist-private.h b/src/cairo-freelist-private.h index 8f9f1534..d48a7201 100644 --- a/src/cairo-freelist-private.h +++ b/src/cairo-freelist-private.h @@ -44,11 +44,19 @@ typedef struct _cairo_freelist { unsigned nodesize; } cairo_freelist_t; +typedef struct _cairo_freelist_pool cairo_freelist_pool_t; +struct _cairo_freelist_pool { + cairo_freelist_pool_t *next; + unsigned size, rem; + uint8_t *data; +}; + typedef struct _cairo_freepool { cairo_freelist_node_t *first_free_node; - cairo_freelist_node_t *pools; + cairo_freelist_pool_t *pools; unsigned nodesize; - char embedded_pool[1000]; + cairo_freelist_pool_t embedded_pool; + uint8_t embedded_data[1000]; } cairo_freepool_t; @@ -92,13 +100,30 @@ cairo_private void * _cairo_freepool_alloc_from_new_pool (cairo_freepool_t *freepool); static inline void * +_cairo_freepool_alloc_from_pool (cairo_freepool_t *freepool) +{ + cairo_freelist_pool_t *pool; + uint8_t *ptr; + + pool = freepool->pools; + if (unlikely (freepool->nodesize > pool->rem)) + return _cairo_freepool_alloc_from_new_pool (freepool); + + ptr = pool->data; + pool->data += freepool->nodesize; + pool->rem -= freepool->nodesize; + VG (VALGRIND_MAKE_MEM_UNDEFINED (ptr, freepool->nodesize)); + return ptr; +} + +static inline void * _cairo_freepool_alloc (cairo_freepool_t *freepool) { cairo_freelist_node_t *node; node = freepool->first_free_node; if (unlikely (node == NULL)) - return _cairo_freepool_alloc_from_new_pool (freepool); + return _cairo_freepool_alloc_from_pool (freepool); VG (VALGRIND_MAKE_MEM_DEFINED (node, sizeof (node->next))); freepool->first_free_node = node->next; |