summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2018-04-10 15:08:53 +0200
committerChristophe Fergeau <cfergeau@redhat.com>2018-04-23 15:01:15 +0200
commit25d985b877e75373b43e5cac1a62eff320c12e71 (patch)
treef8880d688a653358da3dc1fcc86fc665d4525683
parente5ba0ab17e0480620916edcb5826036b91a37c9d (diff)
qxl: Release QXL resources in red_put_update_cmd
-rw-r--r--server/red-parse-qxl.c11
-rw-r--r--server/red-parse-qxl.h3
-rw-r--r--server/red-worker.c3
3 files changed, 10 insertions, 7 deletions
diff --git a/server/red-parse-qxl.c b/server/red-parse-qxl.c
index 7a06a3da..20cbbb87 100644
--- a/server/red-parse-qxl.c
+++ b/server/red-parse-qxl.c
@@ -1242,8 +1242,9 @@ static void red_put_drawable(RedDrawable *red)
}
}
-bool red_get_update_cmd(RedMemSlotInfo *slots, int group_id,
- RedUpdateCmd *red, QXLPHYSICAL addr)
+bool red_get_update_cmd(QXLInstance *qxl_instance, RedMemSlotInfo *slots,
+ int group_id, RedUpdateCmd *red,
+ QXLPHYSICAL addr)
{
QXLUpdateCmd *qxl;
int error;
@@ -1252,10 +1253,10 @@ bool red_get_update_cmd(RedMemSlotInfo *slots, int group_id,
if (error) {
return false;
}
+ red->qxl = qxl_instance;
red->release_info_ext.info = &qxl->release_info;
red->release_info_ext.group_id = group_id;
-
red_get_rect_ptr(&red->area, &qxl->area);
red->update_id = qxl->update_id;
red->surface_id = qxl->surface_id;
@@ -1264,7 +1265,9 @@ bool red_get_update_cmd(RedMemSlotInfo *slots, int group_id,
void red_put_update_cmd(RedUpdateCmd *red)
{
- /* nothing yet */
+ if (red->qxl != NULL) {
+ red_qxl_release_resource(red->qxl, red->release_info_ext);
+ }
}
static bool red_get_message(QXLInstance *qxl_instance, RedMemSlotInfo *slots, int group_id,
diff --git a/server/red-parse-qxl.h b/server/red-parse-qxl.h
index 74f74d42..6fb48687 100644
--- a/server/red-parse-qxl.h
+++ b/server/red-parse-qxl.h
@@ -71,6 +71,7 @@ static inline RedDrawable *red_drawable_ref(RedDrawable *drawable)
void red_drawable_unref(RedDrawable *red_drawable);
typedef struct RedUpdateCmd {
+ QXLInstance *qxl;
QXLReleaseInfoExt release_info_ext;
SpiceRect area;
uint32_t update_id;
@@ -124,7 +125,7 @@ typedef struct RedCursorCmd {
void red_get_rect_ptr(SpiceRect *red, const QXLRect *qxl);
-bool red_get_update_cmd(RedMemSlotInfo *slots, int group_id,
+bool red_get_update_cmd(QXLInstance *qxl, RedMemSlotInfo *slots, int group_id,
RedUpdateCmd *red, QXLPHYSICAL addr);
void red_put_update_cmd(RedUpdateCmd *red);
diff --git a/server/red-worker.c b/server/red-worker.c
index b1976311..194f4f95 100644
--- a/server/red-worker.c
+++ b/server/red-worker.c
@@ -222,7 +222,7 @@ static int red_process_display(RedWorker *worker, int *ring_is_empty)
case QXL_CMD_UPDATE: {
RedUpdateCmd update;
- if (!red_get_update_cmd(&worker->mem_slots, ext_cmd.group_id,
+ if (!red_get_update_cmd(worker->qxl, &worker->mem_slots, ext_cmd.group_id,
&update, ext_cmd.cmd.data)) {
break;
}
@@ -232,7 +232,6 @@ static int red_process_display(RedWorker *worker, int *ring_is_empty)
display_channel_draw(worker->display_channel, &update.area, update.surface_id);
red_qxl_notify_update(worker->qxl, update.update_id);
}
- red_qxl_release_resource(worker->qxl, update.release_info_ext);
red_put_update_cmd(&update);
break;
}