summaryrefslogtreecommitdiff
path: root/src/cairo-freelist.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2009-09-30 19:50:44 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2009-09-30 20:11:07 +0100
commite9bc2180d73acc7133d715ed4380ed20fb4364c0 (patch)
tree491caca556027fa602da362616f9264d3c6314b3 /src/cairo-freelist.c
parent8e4e0aa7ee5b4e0963409cda825705a09aae61e1 (diff)
downloadcairo-e9bc2180d73acc7133d715ed4380ed20fb4364c0.tar.gz
[xcb] Deferred error checking.
XCB avoids the dreaded abort on XError mechanism by forcing the client to perform deferred error checking. So do so. This allows us to combine the fire-and-forget rendering model with accurate error checking, without killing the client or mixing our errors with theirs. XCB for the win!
Diffstat (limited to 'src/cairo-freelist.c')
-rw-r--r--src/cairo-freelist.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/cairo-freelist.c b/src/cairo-freelist.c
index 6277f9074..acf31573f 100644
--- a/src/cairo-freelist.c
+++ b/src/cairo-freelist.c
@@ -138,3 +138,36 @@ _cairo_freepool_alloc_from_new_pool (cairo_freepool_t *freepool)
return pool + 1;
}
+
+cairo_status_t
+_cairo_freepool_alloc_array (cairo_freepool_t *freepool,
+ int count,
+ void **array)
+{
+ int i;
+
+ for (i = 0; i < count; i++) {
+ cairo_freelist_node_t *node;
+
+ node = freepool->first_free_node;
+ if (likely (node != NULL)) {
+ VG (VALGRIND_MAKE_MEM_DEFINED (node, sizeof (node->next)));
+ freepool->first_free_node = node->next;
+ VG (VALGRIND_MAKE_MEM_UNDEFINED (node, freepool->nodesize));
+ } else {
+ node = _cairo_freepool_alloc_from_pool (freepool);
+ if (unlikely (node == NULL))
+ goto CLEANUP;
+ }
+
+ array[i] = node;
+ }
+
+ return CAIRO_STATUS_SUCCESS;
+
+ CLEANUP:
+ while (i--)
+ _cairo_freepool_free (freepool, array[i]);
+
+ return _cairo_error (CAIRO_STATUS_NO_MEMORY);
+}