void _cairo_xlib_screen_info_destroy (cairo_xlib_screen_info_t *info) { cairo_xlib_screen_info_t **prev; cairo_xlib_screen_info_t *list; assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&info->ref_count)); if (! _cairo_reference_count_dec_and_test (&info->ref_count)) return; CAIRO_MUTEX_LOCK (info->display->mutex); for (prev = &info->display->screens; (list = *prev); prev = &list->next) { if (list == info) { *prev = info->next; break; } } CAIRO_MUTEX_UNLOCK (info->display->mutex); _cairo_xlib_screen_info_close_display (info); _cairo_xlib_display_destroy (info->display); _cairo_array_fini (&info->visuals); CAIRO_MUTEX_FINI (info->mutex); free (info); }
static void _cairo_xlib_call_close_display_hooks (cairo_xlib_display_t *display) { cairo_xlib_screen_info_t *screen; cairo_xlib_hook_t *hooks, *list; /* call all registered shutdown routines */ CAIRO_MUTEX_LOCK (display->mutex); for (screen = display->screens; screen != NULL; screen = screen->next) _cairo_xlib_screen_info_close_display (screen); hooks = display->close_display_hooks; while (hooks != NULL) { display->close_display_hooks = NULL; CAIRO_MUTEX_UNLOCK (display->mutex); list = hooks; do { cairo_xlib_hook_t *hook = list; list = hook->next; hook->func (display->display, hook->data); } while (list != NULL); CAIRO_MUTEX_LOCK (display->mutex); do { cairo_xlib_hook_t *hook = hooks; hooks = hook->next; _cairo_freelist_free (&display->hook_freelist, hook); } while (hooks != NULL); hooks = display->close_display_hooks; } display->closed = TRUE; CAIRO_MUTEX_UNLOCK (display->mutex); }