diff options
author | M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> | 2009-09-01 20:57:01 +0100 |
---|---|---|
committer | M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> | 2009-09-01 23:30:56 +0300 |
commit | 5a3fa29b370816acb3a08d60e4031ed82c1e4c73 (patch) | |
tree | 78ed8845b8bad9b60c9bd839f8648c51cac92722 | |
parent | 68c8eb955d6d16872c2fa488f0960b974611865d (diff) |
[freelist] Make _cairo_freepool_alloc_from_new_pool static inline.
The xlib boilerplate includes a cairo private header to be able
to disable usage of the render extension. This indirectly includes
cairo-freelist-private.h which contains a bunch of static inline
functions which use the private _cairo_freepool_alloc_from_new_pool
function, but since that is not inline also, it causes an undefined
extern which cannot be resolved. The binutils linker doesn't care
since the freelist function aren't actually used in the boilerplate
but the Solaris linker does. By making the .._alloc_from_new_pool
function inline no dangling references are created and linking
succeeds.
-rw-r--r-- | src/cairo-freelist-private.h | 29 | ||||
-rw-r--r-- | src/cairo-freelist.c | 29 |
2 files changed, 27 insertions, 31 deletions
diff --git a/src/cairo-freelist-private.h b/src/cairo-freelist-private.h index d48a7201..420fa333 100644 --- a/src/cairo-freelist-private.h +++ b/src/cairo-freelist-private.h @@ -22,6 +22,7 @@ #ifndef CAIRO_FREELIST_H #define CAIRO_FREELIST_H +#include "cairoint.h" #include "cairo-types-private.h" #include "cairo-compiler-private.h" @@ -96,8 +97,32 @@ _cairo_freepool_init (cairo_freepool_t *freepool, unsigned nodesize); cairo_private void _cairo_freepool_fini (cairo_freepool_t *freepool); -cairo_private void * -_cairo_freepool_alloc_from_new_pool (cairo_freepool_t *freepool); +static inline void * +_cairo_freepool_alloc_from_new_pool (cairo_freepool_t *freepool) +{ + cairo_freelist_pool_t *pool; + int poolsize; + + if (freepool->pools != &freepool->embedded_pool) + poolsize = 2 * freepool->pools->size; + else + poolsize = (128 * freepool->nodesize + 8191) & -8192; + pool = malloc (sizeof (cairo_freelist_pool_t) + poolsize); + if (unlikely (pool == NULL)) + return pool; + + pool->next = freepool->pools; + freepool->pools = pool; + + pool->size = poolsize; + pool->rem = poolsize - freepool->nodesize; + pool->data = (uint8_t *) (pool + 1) + freepool->nodesize; + + VG (VALGRIND_MAKE_MEM_NOACCESS (pool->data, poolsize)); + VG (VALGRIND_MAKE_MEM_UNDEFINED (pool->data, freepool->nodesize)); + + return pool + 1; +} static inline void * _cairo_freepool_alloc_from_pool (cairo_freepool_t *freepool) diff --git a/src/cairo-freelist.c b/src/cairo-freelist.c index 6277f907..e7f3ac2b 100644 --- a/src/cairo-freelist.c +++ b/src/cairo-freelist.c @@ -20,8 +20,6 @@ * OF THIS SOFTWARE. */ -#include "cairoint.h" - #include "cairo-freelist-private.h" void @@ -111,30 +109,3 @@ _cairo_freepool_fini (cairo_freepool_t *freepool) } VG (VALGRIND_MAKE_MEM_NOACCESS (freepool, sizeof (freepool))); } - -void * -_cairo_freepool_alloc_from_new_pool (cairo_freepool_t *freepool) -{ - cairo_freelist_pool_t *pool; - int poolsize; - - if (freepool->pools != &freepool->embedded_pool) - poolsize = 2 * freepool->pools->size; - else - poolsize = (128 * freepool->nodesize + 8191) & -8192; - pool = malloc (sizeof (cairo_freelist_pool_t) + poolsize); - if (unlikely (pool == NULL)) - return pool; - - pool->next = freepool->pools; - freepool->pools = pool; - - pool->size = poolsize; - pool->rem = poolsize - freepool->nodesize; - pool->data = (uint8_t *) (pool + 1) + freepool->nodesize; - - VG (VALGRIND_MAKE_MEM_NOACCESS (pool->data, poolsize)); - VG (VALGRIND_MAKE_MEM_UNDEFINED (pool->data, freepool->nodesize)); - - return pool + 1; -} |