sync_callback
};
+static int display_dispatch_queue_ensure_flush(struct wl_display *display,
+ struct wl_event_queue *queue);
+
/** Block until all pending request are processed by the server
*
* \param display The display context object
wl_callback_add_listener(callback, &sync_listener, &done);
while (!done && ret >= 0)
- ret = wl_display_dispatch_queue(display, queue);
+ ret = display_dispatch_queue_ensure_flush(display, queue);
if (ret == -1 && !done)
wl_callback_destroy(callback);
return display->name;
}
// END
+
+// TIZEN_ONLY(20230405) : Do not poll when flushing display fails if it's for roundtrip
+static int
+display_dispatch_queue_ensure_flush(struct wl_display *display,
+ struct wl_event_queue *queue)
+{
+ int ret;
+
+ if (wl_display_prepare_read_queue(display, queue) == -1)
+ return wl_display_dispatch_queue_pending(display, queue);
+
+ while (true) {
+ ret = wl_display_flush(display);
+
+ if (ret != -1 || errno != EAGAIN)
+ break;
+
+ if (wl_display_poll(display, POLLOUT) == -1) {
+ wl_display_cancel_read(display);
+ wl_log("wl_display_poll failed (display:%p)\n", display);
+ return -1;
+ }
+ }
+
+ if (ret < 0) {
+ wl_log("Error flushing display(%p) errno(%d, %m)", display, errno);
+ wl_display_cancel_read(display);
+ return -1;
+ }
+
+ if (wl_display_poll(display, POLLIN) == -1) {
+ wl_log("wl_display_poll failed (display:%p)\n", display);
+ wl_display_cancel_read(display);
+ return -1;
+ }
+
+ if (wl_display_read_events(display) == -1) {
+ wl_log("wl_display_read_events failed (display:%p)\n", display);
+ return -1;
+ }
+
+ ret = wl_display_dispatch_queue_pending(display, queue);
+
+ if (ret < 0)
+ wl_log("wl_display_dispatch_queue_pending failed (display:%p)\n", display);
+
+ return ret;
+}
+// END