summaryrefslogtreecommitdiff
path: root/src/cairo-freelist-private.h
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2009-08-02 13:09:30 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2009-08-29 08:08:30 +0100
commit09377a716334df3683912747067cd396768cfab6 (patch)
tree232895ccaa9d219dfe486ad624cce97a4a732efe /src/cairo-freelist-private.h
parent6f0340e2e5079eba597c0a3a7d39da21cf2b5e7a (diff)
downloadcairo-09377a716334df3683912747067cd396768cfab6.tar.gz
[freelist] Lazy initialisation of pools
Diffstat (limited to 'src/cairo-freelist-private.h')
-rw-r--r--src/cairo-freelist-private.h31
1 files changed, 28 insertions, 3 deletions
diff --git a/src/cairo-freelist-private.h b/src/cairo-freelist-private.h
index 8f9f1534d..d48a7201f 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;