Merge remote branch 'spice/bugfix.2' into staging
This commit is contained in:
commit
43ae691e77
|
@ -95,7 +95,7 @@ static void watch_update_mask(SpiceWatch *watch, int event_mask)
|
||||||
on_read = watch_read;
|
on_read = watch_read;
|
||||||
}
|
}
|
||||||
if (watch->event_mask & SPICE_WATCH_EVENT_WRITE) {
|
if (watch->event_mask & SPICE_WATCH_EVENT_WRITE) {
|
||||||
on_read = watch_write;
|
on_write = watch_write;
|
||||||
}
|
}
|
||||||
qemu_set_fd_handler(watch->fd, on_read, on_write, watch);
|
qemu_set_fd_handler(watch->fd, on_read, on_write, watch);
|
||||||
}
|
}
|
||||||
|
@ -240,7 +240,7 @@ void qemu_spice_init(void)
|
||||||
char *x509_key_file = NULL,
|
char *x509_key_file = NULL,
|
||||||
*x509_cert_file = NULL,
|
*x509_cert_file = NULL,
|
||||||
*x509_cacert_file = NULL;
|
*x509_cacert_file = NULL;
|
||||||
int port, tls_port, len, addr_flags, streaming_video;
|
int port, tls_port, len, addr_flags;
|
||||||
spice_image_compression_t compression;
|
spice_image_compression_t compression;
|
||||||
spice_wan_compression_t wan_compr;
|
spice_wan_compression_t wan_compr;
|
||||||
|
|
||||||
|
@ -344,7 +344,7 @@ void qemu_spice_init(void)
|
||||||
|
|
||||||
str = qemu_opt_get(opts, "streaming-video");
|
str = qemu_opt_get(opts, "streaming-video");
|
||||||
if (str) {
|
if (str) {
|
||||||
streaming_video = parse_stream_video(str);
|
int streaming_video = parse_stream_video(str);
|
||||||
spice_server_set_streaming_video(spice_server, streaming_video);
|
spice_server_set_streaming_video(spice_server, streaming_video);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,10 +64,10 @@ void qemu_spice_rect_union(QXLRect *dest, const QXLRect *r)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called from spice server thread context (via interface_get_command).
|
* Called from spice server thread context (via interface_get_command).
|
||||||
* We do *not* hold the global qemu mutex here, so extra care is needed
|
*
|
||||||
* when calling qemu functions. Qemu interfaces used:
|
* We must aquire the global qemu mutex here to make sure the
|
||||||
* - pflib (is re-entrant).
|
* DisplayState (+DisplaySurface) we are accessing doesn't change
|
||||||
* - qemu_malloc (underlying glibc malloc is re-entrant).
|
* underneath us.
|
||||||
*/
|
*/
|
||||||
SimpleSpiceUpdate *qemu_spice_create_update(SimpleSpiceDisplay *ssd)
|
SimpleSpiceUpdate *qemu_spice_create_update(SimpleSpiceDisplay *ssd)
|
||||||
{
|
{
|
||||||
|
@ -78,11 +78,12 @@ SimpleSpiceUpdate *qemu_spice_create_update(SimpleSpiceDisplay *ssd)
|
||||||
uint8_t *src, *dst;
|
uint8_t *src, *dst;
|
||||||
int by, bw, bh;
|
int by, bw, bh;
|
||||||
|
|
||||||
|
qemu_mutex_lock_iothread();
|
||||||
if (qemu_spice_rect_is_empty(&ssd->dirty)) {
|
if (qemu_spice_rect_is_empty(&ssd->dirty)) {
|
||||||
|
qemu_mutex_unlock_iothread();
|
||||||
return NULL;
|
return NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
pthread_mutex_lock(&ssd->lock);
|
|
||||||
dprint(2, "%s: lr %d -> %d, tb -> %d -> %d\n", __FUNCTION__,
|
dprint(2, "%s: lr %d -> %d, tb -> %d -> %d\n", __FUNCTION__,
|
||||||
ssd->dirty.left, ssd->dirty.right,
|
ssd->dirty.left, ssd->dirty.right,
|
||||||
ssd->dirty.top, ssd->dirty.bottom);
|
ssd->dirty.top, ssd->dirty.bottom);
|
||||||
|
@ -140,7 +141,7 @@ SimpleSpiceUpdate *qemu_spice_create_update(SimpleSpiceDisplay *ssd)
|
||||||
cmd->data = (intptr_t)drawable;
|
cmd->data = (intptr_t)drawable;
|
||||||
|
|
||||||
memset(&ssd->dirty, 0, sizeof(ssd->dirty));
|
memset(&ssd->dirty, 0, sizeof(ssd->dirty));
|
||||||
pthread_mutex_unlock(&ssd->lock);
|
qemu_mutex_unlock_iothread();
|
||||||
return update;
|
return update;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,14 +185,19 @@ void qemu_spice_create_host_primary(SimpleSpiceDisplay *ssd)
|
||||||
surface.type = 0;
|
surface.type = 0;
|
||||||
surface.mem = (intptr_t)ssd->buf;
|
surface.mem = (intptr_t)ssd->buf;
|
||||||
surface.group_id = MEMSLOT_GROUP_HOST;
|
surface.group_id = MEMSLOT_GROUP_HOST;
|
||||||
|
|
||||||
|
qemu_mutex_unlock_iothread();
|
||||||
ssd->worker->create_primary_surface(ssd->worker, 0, &surface);
|
ssd->worker->create_primary_surface(ssd->worker, 0, &surface);
|
||||||
|
qemu_mutex_lock_iothread();
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_spice_destroy_host_primary(SimpleSpiceDisplay *ssd)
|
void qemu_spice_destroy_host_primary(SimpleSpiceDisplay *ssd)
|
||||||
{
|
{
|
||||||
dprint(1, "%s:\n", __FUNCTION__);
|
dprint(1, "%s:\n", __FUNCTION__);
|
||||||
|
|
||||||
|
qemu_mutex_unlock_iothread();
|
||||||
ssd->worker->destroy_primary_surface(ssd->worker, 0);
|
ssd->worker->destroy_primary_surface(ssd->worker, 0);
|
||||||
|
qemu_mutex_lock_iothread();
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_spice_vm_change_state_handler(void *opaque, int running, int reason)
|
void qemu_spice_vm_change_state_handler(void *opaque, int running, int reason)
|
||||||
|
@ -201,7 +207,9 @@ void qemu_spice_vm_change_state_handler(void *opaque, int running, int reason)
|
||||||
if (running) {
|
if (running) {
|
||||||
ssd->worker->start(ssd->worker);
|
ssd->worker->start(ssd->worker);
|
||||||
} else {
|
} else {
|
||||||
|
qemu_mutex_unlock_iothread();
|
||||||
ssd->worker->stop(ssd->worker);
|
ssd->worker->stop(ssd->worker);
|
||||||
|
qemu_mutex_lock_iothread();
|
||||||
}
|
}
|
||||||
ssd->running = running;
|
ssd->running = running;
|
||||||
}
|
}
|
||||||
|
@ -219,31 +227,25 @@ void qemu_spice_display_update(SimpleSpiceDisplay *ssd,
|
||||||
update_area.top = y;
|
update_area.top = y;
|
||||||
update_area.bottom = y + h;
|
update_area.bottom = y + h;
|
||||||
|
|
||||||
pthread_mutex_lock(&ssd->lock);
|
|
||||||
if (qemu_spice_rect_is_empty(&ssd->dirty)) {
|
if (qemu_spice_rect_is_empty(&ssd->dirty)) {
|
||||||
ssd->notify++;
|
ssd->notify++;
|
||||||
}
|
}
|
||||||
qemu_spice_rect_union(&ssd->dirty, &update_area);
|
qemu_spice_rect_union(&ssd->dirty, &update_area);
|
||||||
pthread_mutex_unlock(&ssd->lock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_spice_display_resize(SimpleSpiceDisplay *ssd)
|
void qemu_spice_display_resize(SimpleSpiceDisplay *ssd)
|
||||||
{
|
{
|
||||||
dprint(1, "%s:\n", __FUNCTION__);
|
dprint(1, "%s:\n", __FUNCTION__);
|
||||||
|
|
||||||
pthread_mutex_lock(&ssd->lock);
|
|
||||||
memset(&ssd->dirty, 0, sizeof(ssd->dirty));
|
memset(&ssd->dirty, 0, sizeof(ssd->dirty));
|
||||||
qemu_pf_conv_put(ssd->conv);
|
qemu_pf_conv_put(ssd->conv);
|
||||||
ssd->conv = NULL;
|
ssd->conv = NULL;
|
||||||
pthread_mutex_unlock(&ssd->lock);
|
|
||||||
|
|
||||||
qemu_spice_destroy_host_primary(ssd);
|
qemu_spice_destroy_host_primary(ssd);
|
||||||
qemu_spice_create_host_primary(ssd);
|
qemu_spice_create_host_primary(ssd);
|
||||||
|
|
||||||
pthread_mutex_lock(&ssd->lock);
|
|
||||||
memset(&ssd->dirty, 0, sizeof(ssd->dirty));
|
memset(&ssd->dirty, 0, sizeof(ssd->dirty));
|
||||||
ssd->notify++;
|
ssd->notify++;
|
||||||
pthread_mutex_unlock(&ssd->lock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_spice_display_refresh(SimpleSpiceDisplay *ssd)
|
void qemu_spice_display_refresh(SimpleSpiceDisplay *ssd)
|
||||||
|
@ -398,7 +400,6 @@ void qemu_spice_display_init(DisplayState *ds)
|
||||||
sdpy.ds = ds;
|
sdpy.ds = ds;
|
||||||
sdpy.bufsize = (16 * 1024 * 1024);
|
sdpy.bufsize = (16 * 1024 * 1024);
|
||||||
sdpy.buf = qemu_malloc(sdpy.bufsize);
|
sdpy.buf = qemu_malloc(sdpy.bufsize);
|
||||||
pthread_mutex_init(&sdpy.lock, NULL);
|
|
||||||
register_displaychangelistener(ds, &display_listener);
|
register_displaychangelistener(ds, &display_listener);
|
||||||
|
|
||||||
sdpy.qxl.base.sif = &dpy_interface.base;
|
sdpy.qxl.base.sif = &dpy_interface.base;
|
||||||
|
|
|
@ -40,7 +40,6 @@ typedef struct SimpleSpiceDisplay {
|
||||||
uint32_t unique;
|
uint32_t unique;
|
||||||
QemuPfConv *conv;
|
QemuPfConv *conv;
|
||||||
|
|
||||||
pthread_mutex_t lock;
|
|
||||||
QXLRect dirty;
|
QXLRect dirty;
|
||||||
int notify;
|
int notify;
|
||||||
int running;
|
int running;
|
||||||
|
|
Reference in New Issue