};
struct wl_event_queue {
- struct wl_list link;
struct wl_list event_list;
struct wl_display *display;
- pthread_cond_t cond;
};
struct wl_display {
struct wl_map objects;
struct wl_event_queue display_queue;
struct wl_event_queue default_queue;
- struct wl_list event_queue_list;
pthread_mutex_t mutex;
int reader_count;
static void
display_fatal_error(struct wl_display *display, int error)
{
- struct wl_event_queue *iter;
-
if (display->last_error)
return;
error = EFAULT;
display->last_error = error;
-
- wl_list_for_each(iter, &display->event_queue_list, link)
- pthread_cond_broadcast(&iter->cond);
}
/**
display_protocol_error(struct wl_display *display, uint32_t code,
uint32_t id, const struct wl_interface *intf)
{
- struct wl_event_queue *iter;
int err;
if (display->last_error)
display->protocol_error.id = id;
display->protocol_error.interface = intf;
- wl_list_for_each(iter, &display->event_queue_list, link)
- pthread_cond_broadcast(&iter->cond);
-
pthread_mutex_unlock(&display->mutex);
}
wl_event_queue_init(struct wl_event_queue *queue, struct wl_display *display)
{
wl_list_init(&queue->event_list);
- pthread_cond_init(&queue->cond, NULL);
queue->display = display;
}
wl_list_remove(&closure->link);
wl_closure_destroy(closure);
}
- pthread_cond_destroy(&queue->cond);
}
/** Destroy an event queue
struct wl_display *display = queue->display;
pthread_mutex_lock(&display->mutex);
- wl_list_remove(&queue->link);
wl_event_queue_release(queue);
free(queue);
pthread_mutex_unlock(&display->mutex);
wl_event_queue_init(queue, display);
- pthread_mutex_lock(&display->mutex);
- wl_list_insert(&display->event_queue_list, &queue->link);
- pthread_mutex_unlock(&display->mutex);
-
return queue;
}
wl_map_init(&display->objects, WL_MAP_CLIENT_SIDE);
wl_event_queue_init(&display->default_queue, display);
wl_event_queue_init(&display->display_queue, display);
- wl_list_init(&display->event_queue_list);
pthread_mutex_init(&display->mutex, NULL);
pthread_cond_init(&display->reader_cond, NULL);
display->reader_count = 0;
else
queue = proxy->queue;
- if (wl_list_empty(&queue->event_list))
- pthread_cond_signal(&queue->cond);
wl_list_insert(queue->event_list.prev, &closure->link);
return size;