[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.
This commit is contained in:
Chris Wilson 2008-08-14 09:14:51 +01:00
parent 84a541a041
commit 63befc6ab1
3 changed files with 11 additions and 12 deletions

View file

@ -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);

View file

@ -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,

View file

@ -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);