summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrea Canciani <ranma42@gmail.com>2011-07-03 19:22:34 +0200
committerAndrea Canciani <ranma42@gmail.com>2011-07-05 10:00:14 +0200
commitd7cc30eb0112010533d05b4579a12e7a2910b08d (patch)
tree8eec223029992dedbe8d0f8aef836e722d99c102
parentef659649d3acfb5f91996dd2bbdfd2a2833d9f38 (diff)
Make error contexts static
Dynamically creating error contexts requires locking and failure handling. The code logic can be simplified by statically defining all the possible error contexts.
-rw-r--r--src/cairo-mutex-list-private.h1
-rw-r--r--src/cairo.c148
2 files changed, 65 insertions, 84 deletions
diff --git a/src/cairo-mutex-list-private.h b/src/cairo-mutex-list-private.h
index 7d5ba029..4016f8e5 100644
--- a/src/cairo-mutex-list-private.h
+++ b/src/cairo-mutex-list-private.h
@@ -40,7 +40,6 @@ CAIRO_MUTEX_DECLARE (_cairo_pattern_solid_surface_cache_lock)
CAIRO_MUTEX_DECLARE (_cairo_image_solid_cache_mutex)
-CAIRO_MUTEX_DECLARE (_cairo_error_mutex)
CAIRO_MUTEX_DECLARE (_cairo_toy_font_face_mutex)
CAIRO_MUTEX_DECLARE (_cairo_intern_string_mutex)
CAIRO_MUTEX_DECLARE (_cairo_scaled_font_map_mutex)
diff --git a/src/cairo.c b/src/cairo.c
index 3a4b2a4a..8f16d6dc 100644
--- a/src/cairo.c
+++ b/src/cairo.c
@@ -107,51 +107,71 @@
#define INFINITY HUGE_VAL
#endif
-static const cairo_t _cairo_nil = {
- CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */
- CAIRO_STATUS_NO_MEMORY, /* status */
- { 0, 0, 0, NULL }, /* user_data */
- NULL, /* gstate */
- {{ 0 }, { 0 }}, /* gstate_tail */
- NULL, /* gstate_freelist */
- {{ /* path */
- { 0, 0 }, /* last_move_point */
- { 0, 0 }, /* current point */
- FALSE, /* has_current_point */
- TRUE, /* needs_move_to */
- FALSE, /* has_extents */
- FALSE, /* has_curve_to */
- TRUE, /* stroke_is_rectilinear */
- TRUE, /* fill_is_rectilinear */
- TRUE, /* fill_maybe_region */
- TRUE, /* fill_is_empty */
- { {0, 0}, {0, 0}}, /* extents */
- {{{NULL,NULL}}} /* link */
- }}
-};
+#define DEFINE_NIL_CONTEXT(status) \
+ { \
+ CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ \
+ status, /* status */ \
+ { 0, 0, 0, NULL }, /* user_data */ \
+ NULL, /* gstate */ \
+ {{ 0 }, { 0 }}, /* gstate_tail */ \
+ NULL, /* gstate_freelist */ \
+ {{ /* path */ \
+ { 0, 0 }, /* last_move_point */ \
+ { 0, 0 }, /* current point */ \
+ FALSE, /* has_current_point */ \
+ TRUE, /* needs_move_to */ \
+ FALSE, /* has_extents */ \
+ FALSE, /* has_curve_to */ \
+ TRUE, /* stroke_is_rectilinear */ \
+ TRUE, /* fill_is_rectilinear */ \
+ TRUE, /* fill_maybe_region */ \
+ TRUE, /* fill_is_empty */ \
+ {{0, 0}, {0, 0}}, /* extents */ \
+ {{{NULL,NULL}}} /* link */ \
+ }} \
+ }
-static const cairo_t _cairo_nil__null_pointer = {
- CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */
- CAIRO_STATUS_NULL_POINTER, /* status */
- { 0, 0, 0, NULL }, /* user_data */
- NULL, /* gstate */
- {{ 0 }, { 0 }}, /* gstate_tail */
- NULL, /* gstate_freelist */
- {{ /* path */
- { 0, 0 }, /* last_move_point */
- { 0, 0 }, /* current point */
- FALSE, /* has_current_point */
- TRUE, /* needs_move_to */
- FALSE, /* has_extents */
- FALSE, /* has_curve_to */
- TRUE, /* stroke_is_rectilinear */
- TRUE, /* fill_is_rectilinear */
- TRUE, /* fill_maybe_region */
- TRUE, /* fill_is_empty */
- { {0, 0}, {0, 0}}, /* extents */
- {{{NULL,NULL}}} /* link */
- }}
+static const cairo_t _cairo_nil[] = {
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_NO_MEMORY),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_RESTORE),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_POP_GROUP),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_NO_CURRENT_POINT),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_MATRIX),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_STATUS),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_NULL_POINTER),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_STRING),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_PATH_DATA),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_READ_ERROR),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_WRITE_ERROR),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_SURFACE_FINISHED),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_SURFACE_TYPE_MISMATCH),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_PATTERN_TYPE_MISMATCH),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_CONTENT),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_FORMAT),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_VISUAL),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_FILE_NOT_FOUND),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_DASH),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_DSC_COMMENT),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_INDEX),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_TEMP_FILE_ERROR),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_STRIDE),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_FONT_TYPE_MISMATCH),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_USER_FONT_IMMUTABLE),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_USER_FONT_ERROR),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_NEGATIVE_COUNT),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_CLUSTERS),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_SLANT),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_WEIGHT),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_SIZE),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_DEVICE_TYPE_MISMATCH),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_DEVICE_ERROR),
+ DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_MESH_CONSTRUCTION)
};
+
+COMPILE_TIME_ASSERT (ARRAY_LENGTH (_cairo_nil) == CAIRO_STATUS_LAST_STATUS - 1);
+
#include <assert.h>
/**
@@ -180,9 +200,6 @@ _cairo_set_error (cairo_t *cr, cairo_status_t status)
static freed_pool_t context_pool;
-/* XXX This should disappear in favour of a common pool of error objects. */
-static cairo_t *_cairo_nil__objects[CAIRO_STATUS_LAST_STATUS + 1];
-
static cairo_t *
_cairo_create_in_error (cairo_status_t status)
{
@@ -190,29 +207,8 @@ _cairo_create_in_error (cairo_status_t status)
assert (status != CAIRO_STATUS_SUCCESS);
- /* special case OOM in order to avoid another allocation */
- switch ((int) status) {
- case CAIRO_STATUS_NO_MEMORY:
- return (cairo_t *) &_cairo_nil;
- case CAIRO_STATUS_NULL_POINTER:
- return (cairo_t *) &_cairo_nil__null_pointer;
- }
-
- CAIRO_MUTEX_LOCK (_cairo_error_mutex);
- cr = _cairo_nil__objects[status];
- if (cr == NULL) {
- cr = malloc (sizeof (cairo_t));
- if (unlikely (cr == NULL)) {
- CAIRO_MUTEX_UNLOCK (_cairo_error_mutex);
- _cairo_error_throw (CAIRO_STATUS_NO_MEMORY);
- return (cairo_t *) &_cairo_nil;
- }
-
- *cr = _cairo_nil;
- cr->status = status;
- _cairo_nil__objects[status] = cr;
- }
- CAIRO_MUTEX_UNLOCK (_cairo_error_mutex);
+ cr = (cairo_t *) &_cairo_nil[status - CAIRO_STATUS_NO_MEMORY];
+ assert (status == cr->status);
return cr;
}
@@ -220,20 +216,6 @@ _cairo_create_in_error (cairo_status_t status)
void
_cairo_reset_static_data (void)
{
- int status;
-
- CAIRO_MUTEX_LOCK (_cairo_error_mutex);
- for (status = CAIRO_STATUS_SUCCESS;
- status <= CAIRO_STATUS_LAST_STATUS;
- status++)
- {
- if (_cairo_nil__objects[status] != NULL) {
- free (_cairo_nil__objects[status]);
- _cairo_nil__objects[status] = NULL;
- }
- }
- CAIRO_MUTEX_UNLOCK (_cairo_error_mutex);
-
_freed_pool_reset (&context_pool);
}