mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-09-06 18:05:37 +00:00
spice: don't call displaystate callbacks from spice server context.
This patch moves the displaystate callback calls for setting the cursor and the mouse pointer from spice server to qemu (iothread) context. This allows us to simplify locking. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
e0c64d08d1
commit
0753609458
|
@ -185,7 +185,6 @@ void qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext)
|
|||
QXLCursorCmd *cmd = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id);
|
||||
QXLCursor *cursor;
|
||||
QEMUCursor *c;
|
||||
int x = -1, y = -1;
|
||||
|
||||
if (!qxl->ssd.ds->mouse_set || !qxl->ssd.ds->cursor_define) {
|
||||
return;
|
||||
|
@ -198,8 +197,6 @@ void qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext)
|
|||
}
|
||||
switch (cmd->type) {
|
||||
case QXL_CURSOR_SET:
|
||||
x = cmd->u.set.position.x;
|
||||
y = cmd->u.set.position.y;
|
||||
cursor = qxl_phys2virt(qxl, cmd->u.set.shape, ext->group_id);
|
||||
if (cursor->chunk.data_size != cursor->data_size) {
|
||||
fprintf(stderr, "%s: multiple chunks\n", __FUNCTION__);
|
||||
|
@ -209,18 +206,20 @@ void qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext)
|
|||
if (c == NULL) {
|
||||
c = cursor_builtin_left_ptr();
|
||||
}
|
||||
qemu_mutex_lock_iothread();
|
||||
qxl->ssd.ds->cursor_define(c);
|
||||
qxl->ssd.ds->mouse_set(x, y, 1);
|
||||
qemu_mutex_unlock_iothread();
|
||||
cursor_put(c);
|
||||
qemu_mutex_lock(&qxl->ssd.lock);
|
||||
if (qxl->ssd.cursor) {
|
||||
cursor_put(qxl->ssd.cursor);
|
||||
}
|
||||
qxl->ssd.cursor = c;
|
||||
qxl->ssd.mouse_x = cmd->u.set.position.x;
|
||||
qxl->ssd.mouse_y = cmd->u.set.position.y;
|
||||
qemu_mutex_unlock(&qxl->ssd.lock);
|
||||
break;
|
||||
case QXL_CURSOR_MOVE:
|
||||
x = cmd->u.position.x;
|
||||
y = cmd->u.position.y;
|
||||
qemu_mutex_lock_iothread();
|
||||
qxl->ssd.ds->mouse_set(x, y, 1);
|
||||
qemu_mutex_unlock_iothread();
|
||||
qemu_mutex_lock(&qxl->ssd.lock);
|
||||
qxl->ssd.mouse_x = cmd->u.position.x;
|
||||
qxl->ssd.mouse_y = cmd->u.position.y;
|
||||
qemu_mutex_unlock(&qxl->ssd.lock);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
2
hw/qxl.c
2
hw/qxl.c
|
@ -1309,6 +1309,8 @@ static int qxl_init_primary(PCIDevice *dev)
|
|||
qxl_hw_screen_dump, qxl_hw_text_update, qxl);
|
||||
qxl->ssd.ds = vga->ds;
|
||||
qemu_mutex_init(&qxl->ssd.lock);
|
||||
qxl->ssd.mouse_x = -1;
|
||||
qxl->ssd.mouse_y = -1;
|
||||
qxl->ssd.bufsize = (16 * 1024 * 1024);
|
||||
qxl->ssd.buf = qemu_malloc(qxl->ssd.bufsize);
|
||||
|
||||
|
|
|
@ -254,6 +254,16 @@ void qemu_spice_display_refresh(SimpleSpiceDisplay *ssd)
|
|||
ssd->update = qemu_spice_create_update(ssd);
|
||||
ssd->notify++;
|
||||
}
|
||||
if (ssd->cursor) {
|
||||
ssd->ds->cursor_define(ssd->cursor);
|
||||
cursor_put(ssd->cursor);
|
||||
ssd->cursor = NULL;
|
||||
}
|
||||
if (ssd->mouse_x != -1 && ssd->mouse_y != -1) {
|
||||
ssd->ds->mouse_set(ssd->mouse_x, ssd->mouse_y, 1);
|
||||
ssd->mouse_x = -1;
|
||||
ssd->mouse_y = -1;
|
||||
}
|
||||
qemu_mutex_unlock(&ssd->lock);
|
||||
|
||||
if (ssd->notify) {
|
||||
|
@ -409,6 +419,8 @@ void qemu_spice_display_init(DisplayState *ds)
|
|||
assert(sdpy.ds == NULL);
|
||||
sdpy.ds = ds;
|
||||
qemu_mutex_init(&sdpy.lock);
|
||||
sdpy.mouse_x = -1;
|
||||
sdpy.mouse_y = -1;
|
||||
sdpy.bufsize = (16 * 1024 * 1024);
|
||||
sdpy.buf = qemu_malloc(sdpy.bufsize);
|
||||
register_displaychangelistener(ds, &display_listener);
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <spice/qxl_dev.h>
|
||||
|
||||
#include "qemu-thread.h"
|
||||
#include "console.h"
|
||||
#include "pflib.h"
|
||||
|
||||
#define NUM_MEMSLOTS 8
|
||||
|
@ -55,6 +56,8 @@ struct SimpleSpiceDisplay {
|
|||
*/
|
||||
QemuMutex lock;
|
||||
SimpleSpiceUpdate *update;
|
||||
QEMUCursor *cursor;
|
||||
int mouse_x, mouse_y;
|
||||
};
|
||||
|
||||
struct SimpleSpiceUpdate {
|
||||
|
|
Loading…
Reference in a new issue