summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2016-02-13 22:40:33 +0100
committerChristophe Fergeau <cfergeau@redhat.com>2018-04-23 14:36:39 +0200
commita62892535689e7c62b1b3d2ea3927d52c1c615c5 (patch)
treeb7b880e14848edd13c27565aabe93ffca8d03234
parentdfae3d0be157d2615911d6ec3042229f93c990ba (diff)
qxl: Make red_{get,put}_drawable static
Rather than needing to call red_drawable_new() and then initialize it with red_get_drawable(), we can improve slightly red_drawable new so that red_drawable_{new,ref,unref} is all which is used by code out of red-parse-qxl.c.
-rw-r--r--server/red-parse-qxl.c17
-rw-r--r--server/red-parse-qxl.h8
-rw-r--r--server/red-worker.c11
3 files changed, 21 insertions, 15 deletions
diff --git a/server/red-parse-qxl.c b/server/red-parse-qxl.c
index d5497521..a4724f6a 100644
--- a/server/red-parse-qxl.c
+++ b/server/red-parse-qxl.c
@@ -1175,8 +1175,8 @@ static bool red_get_compat_drawable(RedMemSlotInfo *slots, int group_id,
return true;
}
-bool red_get_drawable(RedMemSlotInfo *slots, int group_id,
- RedDrawable *red, QXLPHYSICAL addr, uint32_t flags)
+static bool red_get_drawable(RedMemSlotInfo *slots, int group_id,
+ RedDrawable *red, QXLPHYSICAL addr, uint32_t flags)
{
bool ret;
@@ -1188,7 +1188,7 @@ bool red_get_drawable(RedMemSlotInfo *slots, int group_id,
return ret;
}
-void red_put_drawable(RedDrawable *red)
+static void red_put_drawable(RedDrawable *red)
{
red_put_clip(&red->clip);
if (red->self_bitmap_image) {
@@ -1491,12 +1491,19 @@ void red_drawable_unref(RedDrawable *red_drawable)
g_free(red_drawable);
}
-RedDrawable *red_drawable_new(QXLInstance *qxl)
+RedDrawable *red_drawable_new(QXLInstance *qxl, RedMemSlotInfo *slots,
+ int group_id, QXLPHYSICAL addr,
+ uint32_t flags)
{
- RedDrawable * red = g_new0(RedDrawable, 1);
+ RedDrawable *red = g_new0(RedDrawable, 1);
red->refs = 1;
red->qxl = qxl;
+ if (!red_get_drawable(slots, group_id, red, addr, flags)) {
+ red_drawable_unref(red);
+ return NULL;
+ }
+
return red;
}
diff --git a/server/red-parse-qxl.h b/server/red-parse-qxl.h
index 77e9f9b9..0e67aa8f 100644
--- a/server/red-parse-qxl.h
+++ b/server/red-parse-qxl.h
@@ -59,7 +59,9 @@ typedef struct RedDrawable {
} u;
} RedDrawable;
-RedDrawable *red_drawable_new(QXLInstance *qxl);
+RedDrawable *red_drawable_new(QXLInstance *qxl, RedMemSlotInfo *slots,
+ int group_id, QXLPHYSICAL addr,
+ uint32_t flags);
static inline RedDrawable *red_drawable_ref(RedDrawable *drawable)
{
drawable->refs++;
@@ -119,10 +121,6 @@ typedef struct RedCursorCmd {
void red_get_rect_ptr(SpiceRect *red, const QXLRect *qxl);
-bool red_get_drawable(RedMemSlotInfo *slots, int group_id,
- RedDrawable *red, QXLPHYSICAL addr, uint32_t flags);
-void red_put_drawable(RedDrawable *red);
-
bool red_get_update_cmd(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 8f806e8e..ebc6d423 100644
--- a/server/red-worker.c
+++ b/server/red-worker.c
@@ -205,15 +205,16 @@ static int red_process_display(RedWorker *worker, int *ring_is_empty)
worker->display_poll_tries = 0;
switch (ext_cmd.cmd.type) {
case QXL_CMD_DRAW: {
- RedDrawable *red_drawable = red_drawable_new(worker->qxl); // returns with 1 ref
+ RedDrawable *red_drawable;
+ red_drawable = red_drawable_new(worker->qxl, &worker->mem_slots,
+ ext_cmd.group_id, ext_cmd.cmd.data,
+ ext_cmd.flags); // returns with 1 ref
- if (red_get_drawable(&worker->mem_slots, ext_cmd.group_id,
- red_drawable, ext_cmd.cmd.data, ext_cmd.flags)) {
+ if (red_drawable != NULL) {
display_channel_process_draw(worker->display_channel, red_drawable,
worker->process_display_generation);
+ red_drawable_unref(red_drawable);
}
- // release the red_drawable
- red_drawable_unref(red_drawable);
break;
}
case QXL_CMD_UPDATE: {