Skip to content

Commit 01fff50

Browse files
elmarcoMichael Tokarev
authored andcommitted
ui/dbus: fix filtering all update messages
Filtering pending messages when a new scanout is given shouldn't discard pending cursor changes, for example. Since filtering happens in a different thread, use atomic set/get. Fixes: fa88b85 ("ui/dbus: filter out pending messages when scanout") Signed-off-by: Marc-André Lureau <[email protected]> Reviewed-by: Akihiko Odaki <[email protected]> Message-ID: <[email protected]> (cherry picked from commit cf59889) Signed-off-by: Michael Tokarev <[email protected]>
1 parent e1324ec commit 01fff50

File tree

1 file changed

+33
-12
lines changed

1 file changed

+33
-12
lines changed

ui/dbus-listener.c

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "qapi/error.h"
2727
#include "sysemu/sysemu.h"
2828
#include "dbus.h"
29+
#include "glib.h"
2930
#ifdef G_OS_UNIX
3031
#include <gio/gunixfdlist.h>
3132
#endif
@@ -85,18 +86,20 @@ struct _DBusDisplayListener {
8586
#endif
8687

8788
guint dbus_filter;
88-
guint32 out_serial_to_discard;
89+
guint32 display_serial_to_discard;
8990
};
9091

9192
G_DEFINE_TYPE(DBusDisplayListener, dbus_display_listener, G_TYPE_OBJECT)
9293

9394
static void dbus_gfx_update(DisplayChangeListener *dcl,
9495
int x, int y, int w, int h);
9596

96-
static void ddl_discard_pending_messages(DBusDisplayListener *ddl)
97+
static void ddl_discard_display_messages(DBusDisplayListener *ddl)
9798
{
98-
ddl->out_serial_to_discard = g_dbus_connection_get_last_serial(
99+
guint32 serial = g_dbus_connection_get_last_serial(
99100
g_dbus_proxy_get_connection(G_DBUS_PROXY(ddl->proxy)));
101+
102+
g_atomic_int_set(&ddl->display_serial_to_discard, serial);
100103
}
101104

102105
#ifdef CONFIG_OPENGL
@@ -290,7 +293,7 @@ static void dbus_scanout_dmabuf(DisplayChangeListener *dcl,
290293
return;
291294
}
292295

293-
ddl_discard_pending_messages(ddl);
296+
ddl_discard_display_messages(ddl);
294297

295298
width = qemu_dmabuf_get_width(dmabuf);
296299
height = qemu_dmabuf_get_height(dmabuf);
@@ -338,7 +341,7 @@ static bool dbus_scanout_map(DBusDisplayListener *ddl)
338341
return false;
339342
}
340343

341-
ddl_discard_pending_messages(ddl);
344+
ddl_discard_display_messages(ddl);
342345

343346
if (!qemu_dbus_display1_listener_win32_map_call_scanout_map_sync(
344347
ddl->map_proxy,
@@ -401,7 +404,7 @@ dbus_scanout_share_d3d_texture(
401404
return false;
402405
}
403406

404-
ddl_discard_pending_messages(ddl);
407+
ddl_discard_display_messages(ddl);
405408

406409
qemu_dbus_display1_listener_win32_d3d11_call_scanout_texture2d(
407410
ddl->d3d11_proxy,
@@ -659,7 +662,7 @@ static void ddl_scanout(DBusDisplayListener *ddl)
659662
surface_stride(ddl->ds) * surface_height(ddl->ds), TRUE,
660663
(GDestroyNotify)pixman_image_unref, pixman_image_ref(ddl->ds->image));
661664

662-
ddl_discard_pending_messages(ddl);
665+
ddl_discard_display_messages(ddl);
663666

664667
qemu_dbus_display1_listener_call_scanout(
665668
ddl->proxy, surface_width(ddl->ds), surface_height(ddl->ds),
@@ -992,17 +995,35 @@ dbus_filter(GDBusConnection *connection,
992995
gpointer user_data)
993996
{
994997
DBusDisplayListener *ddl = DBUS_DISPLAY_LISTENER(user_data);
995-
guint32 serial;
998+
guint32 serial, discard_serial;
996999

9971000
if (incoming) {
9981001
return message;
9991002
}
10001003

10011004
serial = g_dbus_message_get_serial(message);
1002-
if (serial <= ddl->out_serial_to_discard) {
1003-
trace_dbus_filter(serial, ddl->out_serial_to_discard);
1004-
g_object_unref(message);
1005-
return NULL;
1005+
1006+
discard_serial = g_atomic_int_get(&ddl->display_serial_to_discard);
1007+
if (serial <= discard_serial) {
1008+
const char *member = g_dbus_message_get_member(message);
1009+
static const char *const display_messages[] = {
1010+
"Scanout",
1011+
"Update",
1012+
#ifdef CONFIG_GBM
1013+
"ScanoutDMABUF",
1014+
"UpdateDMABUF",
1015+
#endif
1016+
"ScanoutMap",
1017+
"UpdateMap",
1018+
"Disable",
1019+
NULL,
1020+
};
1021+
1022+
if (g_strv_contains(display_messages, member)) {
1023+
trace_dbus_filter(serial, discard_serial);
1024+
g_object_unref(message);
1025+
return NULL;
1026+
}
10061027
}
10071028

10081029
return message;

0 commit comments

Comments
 (0)