[Spice-devel] [PATCH 2/3] spice: don't call displaystate callbacks from spice server context.
Alon Levy
alevy at redhat.com
Thu Apr 28 04:06:08 PDT 2011
On Thu, Apr 28, 2011 at 12:13:09PM +0200, Gerd Hoffmann wrote:
> 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 at redhat.com>
> ---
> hw/qxl-render.c | 25 ++++++++++++-------------
> hw/qxl.c | 2 ++
> ui/spice-display.c | 12 ++++++++++++
> ui/spice-display.h | 3 +++
> 4 files changed, 29 insertions(+), 13 deletions(-)
>
> diff --git a/hw/qxl-render.c b/hw/qxl-render.c
> index 58965e0..1316066 100644
> --- a/hw/qxl-render.c
> +++ b/hw/qxl-render.c
> @@ -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;
> }
> }
> diff --git a/hw/qxl.c b/hw/qxl.c
> index bd250db..4dfddf0 100644
> --- a/hw/qxl.c
> +++ b/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);
>
> diff --git a/ui/spice-display.c b/ui/spice-display.c
> index e80a50c..3977f8f 100644
> --- a/ui/spice-display.c
> +++ b/ui/spice-display.c
> @@ -248,6 +248,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);
So now we will only do cursor_put once per qemu_spice_display_refresh? This
changes the behavior - we will lose some cursor updates.
Not sure we care - the last one will still always be set (once display_refresh
is called).
> + 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) {
> @@ -403,6 +413,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);
> diff --git a/ui/spice-display.h b/ui/spice-display.h
> index e0cc46e..2f95f68 100644
> --- a/ui/spice-display.h
> +++ b/ui/spice-display.h
> @@ -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 {
> --
> 1.7.1
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
More information about the Spice-devel
mailing list