Quellcode durchsuchen

wayland: Rollback the round trip when reading data offers

The bug this appeared to fix turned out to be randomly occurring and has other causes, and the read pipe is already polled for readiness, so this extra overhead isn't necessary.
Frank Praznik vor 6 Monaten
Ursprung
Commit
84d047cc11
2 geänderte Dateien mit 2 neuen und 13 gelöschten Zeilen
  1. 2 12
      src/video/wayland/SDL_waylanddatamanager.c
  2. 0 1
      src/video/wayland/SDL_waylandsym.h

+ 2 - 12
src/video/wayland/SDL_waylanddatamanager.c

@@ -370,15 +370,10 @@ void *Wayland_data_offer_receive(SDL_WaylandDataOffer *offer,
     } else if (pipe2(pipefd, O_CLOEXEC | O_NONBLOCK) == -1) {
     } else if (pipe2(pipefd, O_CLOEXEC | O_NONBLOCK) == -1) {
         SDL_SetError("Could not read pipe");
         SDL_SetError("Could not read pipe");
     } else {
     } else {
-        struct wl_event_queue *queue = WAYLAND_wl_display_create_queue(data_device->video_data->display);
-        WAYLAND_wl_proxy_set_queue((struct wl_proxy *)offer->offer, queue);
-
         wl_data_offer_receive(offer->offer, mime_type, pipefd[1]);
         wl_data_offer_receive(offer->offer, mime_type, pipefd[1]);
         close(pipefd[1]);
         close(pipefd[1]);
 
 
-        WAYLAND_wl_display_roundtrip_queue(data_device->video_data->display, queue);
-        WAYLAND_wl_proxy_set_queue((struct wl_proxy *)offer->offer, NULL);
-        WAYLAND_wl_event_queue_destroy(queue);
+        WAYLAND_wl_display_flush(data_device->video_data->display);
 
 
         while (read_pipe(pipefd[0], &buffer, length) > 0) {
         while (read_pipe(pipefd[0], &buffer, length) > 0) {
         }
         }
@@ -409,15 +404,10 @@ void *Wayland_primary_selection_offer_receive(SDL_WaylandPrimarySelectionOffer *
     } else if (pipe2(pipefd, O_CLOEXEC | O_NONBLOCK) == -1) {
     } else if (pipe2(pipefd, O_CLOEXEC | O_NONBLOCK) == -1) {
         SDL_SetError("Could not read pipe");
         SDL_SetError("Could not read pipe");
     } else {
     } else {
-        struct wl_event_queue *queue = WAYLAND_wl_display_create_queue(primary_selection_device->video_data->display);
-        WAYLAND_wl_proxy_set_queue((struct wl_proxy *)offer->offer, queue);
-
         zwp_primary_selection_offer_v1_receive(offer->offer, mime_type, pipefd[1]);
         zwp_primary_selection_offer_v1_receive(offer->offer, mime_type, pipefd[1]);
         close(pipefd[1]);
         close(pipefd[1]);
 
 
-        WAYLAND_wl_display_roundtrip_queue(primary_selection_device->video_data->display, queue);
-        WAYLAND_wl_proxy_set_queue((struct wl_proxy *)offer->offer, NULL);
-        WAYLAND_wl_event_queue_destroy(queue);
+        WAYLAND_wl_display_flush(primary_selection_device->video_data->display);
 
 
         while (read_pipe(pipefd[0], &buffer, length) > 0) {
         while (read_pipe(pipefd[0], &buffer, length) > 0) {
         }
         }

+ 0 - 1
src/video/wayland/SDL_waylandsym.h

@@ -65,7 +65,6 @@ SDL_WAYLAND_SYM(void, wl_display_cancel_read, (struct wl_display *))
 SDL_WAYLAND_SYM(int, wl_display_get_error, (struct wl_display *))
 SDL_WAYLAND_SYM(int, wl_display_get_error, (struct wl_display *))
 SDL_WAYLAND_SYM(int, wl_display_flush, (struct wl_display *))
 SDL_WAYLAND_SYM(int, wl_display_flush, (struct wl_display *))
 SDL_WAYLAND_SYM(int, wl_display_roundtrip, (struct wl_display *))
 SDL_WAYLAND_SYM(int, wl_display_roundtrip, (struct wl_display *))
-SDL_WAYLAND_SYM(int, wl_display_roundtrip_queue, (struct wl_display *, struct wl_event_queue *))
 SDL_WAYLAND_SYM(struct wl_event_queue *, wl_display_create_queue, (struct wl_display *))
 SDL_WAYLAND_SYM(struct wl_event_queue *, wl_display_create_queue, (struct wl_display *))
 SDL_WAYLAND_SYM(void, wl_event_queue_destroy, (struct wl_event_queue *))
 SDL_WAYLAND_SYM(void, wl_event_queue_destroy, (struct wl_event_queue *))
 SDL_WAYLAND_SYM(void, wl_log_set_handler_client, (wl_log_func_t))
 SDL_WAYLAND_SYM(void, wl_log_set_handler_client, (wl_log_func_t))