diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2009-09-30 19:50:44 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2009-09-30 20:11:07 +0100 |
commit | e9bc2180d73acc7133d715ed4380ed20fb4364c0 (patch) | |
tree | 491caca556027fa602da362616f9264d3c6314b3 /src/cairo-freelist.c | |
parent | 8e4e0aa7ee5b4e0963409cda825705a09aae61e1 (diff) | |
download | cairo-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.c | 33 |
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); +} |