summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorM Joonas Pihlaja <jpihlaja@cc.helsinki.fi>2009-09-01 20:57:01 +0100
committerM Joonas Pihlaja <jpihlaja@cc.helsinki.fi>2009-09-01 23:30:56 +0300
commit5a3fa29b370816acb3a08d60e4031ed82c1e4c73 (patch)
tree78ed8845b8bad9b60c9bd839f8648c51cac92722
parent68c8eb955d6d16872c2fa488f0960b974611865d (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.h29
-rw-r--r--src/cairo-freelist.c29
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;
-}