spice: notify on vm state change only via spice_server_vm_start/stop

QXLWorker->start/stop are deprecated since spice-server 0.11.2

Signed-off-by: Yonit Halperin <yhalperi@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Yonit Halperin 2012-08-21 11:51:56 +03:00 committed by Gerd Hoffmann
parent f5bb039c6d
commit 71d388d420
4 changed files with 45 additions and 7 deletions

View File

@ -958,9 +958,10 @@ static void qxl_update_irq(PCIQXLDevice *d)
static void qxl_check_state(PCIQXLDevice *d) static void qxl_check_state(PCIQXLDevice *d)
{ {
QXLRam *ram = d->ram; QXLRam *ram = d->ram;
int spice_display_running = qemu_spice_display_is_running(&d->ssd);
assert(!d->ssd.running || SPICE_RING_IS_EMPTY(&ram->cmd_ring)); assert(!spice_display_running || SPICE_RING_IS_EMPTY(&ram->cmd_ring));
assert(!d->ssd.running || SPICE_RING_IS_EMPTY(&ram->cursor_ring)); assert(!spice_display_running || SPICE_RING_IS_EMPTY(&ram->cursor_ring));
} }
static void qxl_reset_state(PCIQXLDevice *d) static void qxl_reset_state(PCIQXLDevice *d)
@ -1538,7 +1539,7 @@ static void qxl_send_events(PCIQXLDevice *d, uint32_t events)
uint32_t old_pending; uint32_t old_pending;
uint32_t le_events = cpu_to_le32(events); uint32_t le_events = cpu_to_le32(events);
assert(d->ssd.running); assert(qemu_spice_display_is_running(&d->ssd));
old_pending = __sync_fetch_and_or(&d->ram->int_pending, le_events); old_pending = __sync_fetch_and_or(&d->ram->int_pending, le_events);
if ((old_pending & le_events) == le_events) { if ((old_pending & le_events) == le_events) {
return; return;

View File

@ -37,6 +37,7 @@
#include "migration.h" #include "migration.h"
#include "monitor.h" #include "monitor.h"
#include "hw/hw.h" #include "hw/hw.h"
#include "spice-display.h"
/* core bits */ /* core bits */
@ -551,9 +552,11 @@ static void vm_change_state_handler(void *opaque, int running,
{ {
#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */ #if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */
if (running) { if (running) {
qemu_spice_display_start();
spice_server_vm_start(spice_server); spice_server_vm_start(spice_server);
} else { } else {
spice_server_vm_stop(spice_server); spice_server_vm_stop(spice_server);
qemu_spice_display_stop();
} }
#endif #endif
} }
@ -755,6 +758,7 @@ int qemu_spice_add_interface(SpiceBaseInstance *sin)
spice_server = spice_server_new(); spice_server = spice_server_new();
spice_server_init(spice_server, &core_interface); spice_server_init(spice_server, &core_interface);
} }
return spice_server_add_interface(spice_server, sin); return spice_server_add_interface(spice_server, sin);
} }

View File

@ -126,18 +126,44 @@ void qemu_spice_wakeup(SimpleSpiceDisplay *ssd)
ssd->worker->wakeup(ssd->worker); ssd->worker->wakeup(ssd->worker);
} }
void qemu_spice_start(SimpleSpiceDisplay *ssd) #if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */
static void qemu_spice_start(SimpleSpiceDisplay *ssd)
{ {
trace_qemu_spice_start(ssd->qxl.id); trace_qemu_spice_start(ssd->qxl.id);
ssd->worker->start(ssd->worker); ssd->worker->start(ssd->worker);
} }
void qemu_spice_stop(SimpleSpiceDisplay *ssd) static void qemu_spice_stop(SimpleSpiceDisplay *ssd)
{ {
trace_qemu_spice_stop(ssd->qxl.id); trace_qemu_spice_stop(ssd->qxl.id);
ssd->worker->stop(ssd->worker); ssd->worker->stop(ssd->worker);
} }
#else
static int spice_display_is_running;
void qemu_spice_display_start(void)
{
spice_display_is_running = true;
}
void qemu_spice_display_stop(void)
{
spice_display_is_running = false;
}
#endif
int qemu_spice_display_is_running(SimpleSpiceDisplay *ssd)
{
#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */
return ssd->running;
#else
return spice_display_is_running;
#endif
}
static SimpleSpiceUpdate *qemu_spice_create_update(SimpleSpiceDisplay *ssd) static SimpleSpiceUpdate *qemu_spice_create_update(SimpleSpiceDisplay *ssd)
{ {
SimpleSpiceUpdate *update; SimpleSpiceUpdate *update;
@ -272,6 +298,7 @@ void qemu_spice_destroy_host_primary(SimpleSpiceDisplay *ssd)
void qemu_spice_vm_change_state_handler(void *opaque, int running, void qemu_spice_vm_change_state_handler(void *opaque, int running,
RunState state) RunState state)
{ {
#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */
SimpleSpiceDisplay *ssd = opaque; SimpleSpiceDisplay *ssd = opaque;
if (running) { if (running) {
@ -281,6 +308,7 @@ void qemu_spice_vm_change_state_handler(void *opaque, int running,
qemu_spice_stop(ssd); qemu_spice_stop(ssd);
ssd->running = false; ssd->running = false;
} }
#endif
} }
void qemu_spice_display_init_common(SimpleSpiceDisplay *ssd, DisplayState *ds) void qemu_spice_display_init_common(SimpleSpiceDisplay *ssd, DisplayState *ds)

View File

@ -82,7 +82,9 @@ struct SimpleSpiceDisplay {
QXLRect dirty; QXLRect dirty;
int notify; int notify;
#if SPICE_SERVER_VERSION < 0x000b02 /* before 0.11.2 */
int running; int running;
#endif
/* /*
* All struct members below this comment can be accessed from * All struct members below this comment can be accessed from
@ -129,5 +131,8 @@ void qemu_spice_create_primary_surface(SimpleSpiceDisplay *ssd, uint32_t id,
void qemu_spice_destroy_primary_surface(SimpleSpiceDisplay *ssd, void qemu_spice_destroy_primary_surface(SimpleSpiceDisplay *ssd,
uint32_t id, qxl_async_io async); uint32_t id, qxl_async_io async);
void qemu_spice_wakeup(SimpleSpiceDisplay *ssd); void qemu_spice_wakeup(SimpleSpiceDisplay *ssd);
void qemu_spice_start(SimpleSpiceDisplay *ssd); #if SPICE_SERVER_VERSION >= 0x000b02 /* before 0.11.2 */
void qemu_spice_stop(SimpleSpiceDisplay *ssd); void qemu_spice_display_start(void);
void qemu_spice_display_stop(void);
#endif
int qemu_spice_display_is_running(SimpleSpiceDisplay *ssd);