From 63befc6ab124059a8078493345d21463c4609f41 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 14 Aug 2008 09:14:51 +0100 Subject: [PATCH] [xlib] Remove the key parameter from the close display hook. By inspecting all the users of the close display hooks, we can see that (a) the key is redundant and (b) the data is unique to the hook. This means we can trim the interface and stop the linear searches as soon as we've found the correct element. --- src/cairo-xlib-display.c | 13 ++++++------- src/cairo-xlib-private.h | 5 ++--- src/cairo-xlib-surface.c | 5 +++-- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/cairo-xlib-display.c b/src/cairo-xlib-display.c index cdae8c926..895258d31 100644 --- a/src/cairo-xlib-display.c +++ b/src/cairo-xlib-display.c @@ -326,7 +326,7 @@ UNLOCK: } cairo_bool_t -_cairo_xlib_add_close_display_hook (Display *dpy, void (*func) (Display *, void *), void *data, const void *key) +_cairo_xlib_add_close_display_hook (Display *dpy, void (*func) (Display *, void *), void *data) { cairo_xlib_display_t *display; cairo_xlib_hook_t *hook; @@ -342,7 +342,6 @@ _cairo_xlib_add_close_display_hook (Display *dpy, void (*func) (Display *, void if (hook != NULL) { hook->func = func; hook->data = data; - hook->key = key; hook->next = display->close_display_hooks; display->close_display_hooks = hook; @@ -357,7 +356,7 @@ _cairo_xlib_add_close_display_hook (Display *dpy, void (*func) (Display *, void } void -_cairo_xlib_remove_close_display_hooks (Display *dpy, const void *key) +_cairo_xlib_remove_close_display_hooks (Display *dpy, const void *data) { cairo_xlib_display_t *display; cairo_xlib_hook_t *hook, *next, **prev; @@ -370,13 +369,13 @@ _cairo_xlib_remove_close_display_hooks (Display *dpy, const void *key) prev = &display->close_display_hooks; for (hook = display->close_display_hooks; hook != NULL; hook = next) { next = hook->next; - if (hook->key == key) { + if (hook->data == data) { *prev = hook->next; _cairo_freelist_free (&display->hook_freelist, hook); - } else - prev = &hook->next; + break; + } + prev = &hook->next; } - *prev = NULL; CAIRO_MUTEX_UNLOCK (display->mutex); _cairo_xlib_display_destroy (display); diff --git a/src/cairo-xlib-private.h b/src/cairo-xlib-private.h index b8ca027ee..61ce88963 100644 --- a/src/cairo-xlib-private.h +++ b/src/cairo-xlib-private.h @@ -51,7 +51,6 @@ struct _cairo_xlib_hook { cairo_xlib_hook_t *next; void (*func) (Display *display, void *data); void *data; - const void *key; }; struct _cairo_xlib_display { @@ -113,9 +112,9 @@ cairo_private void _cairo_xlib_display_destroy (cairo_xlib_display_t *info); cairo_private cairo_bool_t -_cairo_xlib_add_close_display_hook (Display *display, void (*func) (Display *, void *), void *data, const void *key); +_cairo_xlib_add_close_display_hook (Display *display, void (*func) (Display *, void *), void *data); cairo_private void -_cairo_xlib_remove_close_display_hooks (Display *display, const void *key); +_cairo_xlib_remove_close_display_hooks (Display *display, const void *data); cairo_private cairo_status_t _cairo_xlib_display_queue_work (cairo_xlib_display_t *display, diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c index 2fb46c2a6..4877e7e2a 100644 --- a/src/cairo-xlib-surface.c +++ b/src/cairo-xlib-surface.c @@ -2436,7 +2436,8 @@ _cairo_xlib_surface_create_internal (Display *dpy, } if (! _cairo_xlib_add_close_display_hook (dpy, - _cairo_xlib_surface_detach_display, surface, surface)) { + _cairo_xlib_surface_detach_display, surface)) + { free (surface); _cairo_xlib_screen_info_destroy (screen_info); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); @@ -3011,7 +3012,7 @@ _cairo_xlib_surface_font_init (Display *dpy, if (! _cairo_xlib_add_close_display_hook (dpy, _cairo_xlib_surface_remove_scaled_font, - scaled_font, scaled_font)) + scaled_font)) { free (font_private); return _cairo_error (CAIRO_STATUS_NO_MEMORY);