[Spice-devel] [spice-server v3 13/14] qxl: Introduce RedQXLGuestResources

Christophe Fergeau cfergeau at redhat.com
Tue Apr 24 10:29:17 UTC 2018


This allows to share a bit of code in red-parse-qxl.c, but does not help
with reducing the number of args which are passed to the parsing
functions.

Signed-off-by: Christophe Fergeau <cfergeau at redhat.com>
---
 server/red-parse-qxl.c | 112 ++++++++++++++++++++++++++-----------------------
 server/red-parse-qxl.h |  20 ++++-----
 2 files changed, 70 insertions(+), 62 deletions(-)

diff --git a/server/red-parse-qxl.c b/server/red-parse-qxl.c
index 9f24c841e..732eabcab 100644
--- a/server/red-parse-qxl.c
+++ b/server/red-parse-qxl.c
@@ -89,6 +89,35 @@ static inline uint32_t color_16_to_32(uint32_t color)
     return ret;
 }
 
+static void * red_qxl_guest_resources_init(RedQXLGuestResources *guest_resources,
+                                           QXLInstance *qxl_instance,
+                                           RedMemSlotInfo *slots,
+                                           int group_id,
+                                           QXLPHYSICAL addr,
+                                           size_t size)
+{
+    int error;
+    void *red_data;
+
+    red_data = (void *)memslot_get_virt(slots, addr, size, group_id, &error);
+    if (error) {
+        return NULL;
+    }
+    guest_resources->qxl = qxl_instance;
+    guest_resources->release_info_ext.group_id = group_id;
+    /* The 'release_info' field in QXL*Cmd is always the very first field */
+    guest_resources->release_info_ext.info = red_data;
+
+    return red_data;
+}
+
+static void red_qxl_guest_resources_release(RedQXLGuestResources *guest_resources)
+{
+    if (guest_resources->qxl != NULL) {
+        red_qxl_release_resource(guest_resources->qxl, guest_resources->release_info_ext);
+    }
+}
+
 static uint8_t *red_linearize_chunk(RedDataChunk *head, size_t size, bool *free_chunk)
 {
     uint8_t *data, *ptr;
@@ -1016,15 +1045,13 @@ static bool red_get_native_drawable(QXLInstance *qxl_instance, RedMemSlotInfo *s
 {
     QXLDrawable *qxl_drawable;
     int i;
-    int error = 0;
 
-    qxl_drawable = (QXLDrawable *)memslot_get_virt(slots, addr, sizeof(*qxl_drawable), group_id, &error);
-    if (error) {
+    qxl_drawable = red_qxl_guest_resources_init(&red_drawable->guest_resources,
+                                                qxl_instance, slots, group_id,
+                                                addr, sizeof(*qxl_drawable));
+    if (qxl_drawable == NULL) {
         return false;
     }
-    red_drawable->qxl = qxl_instance;
-    red_drawable->release_info_ext.info     = &qxl_drawable->release_info;
-    red_drawable->release_info_ext.group_id = group_id;
 
     red_get_rect_ptr(&red_drawable->bbox, &qxl_drawable->bbox);
     red_get_clip_ptr(slots, group_id, &red_drawable->clip, &qxl_drawable->clip);
@@ -1097,15 +1124,13 @@ static bool red_get_compat_drawable(QXLInstance *qxl_instance, RedMemSlotInfo *s
                                     RedDrawable *red_drawable, QXLPHYSICAL addr, uint32_t flags)
 {
     QXLCompatDrawable *qxl_drawable;
-    int error;
 
-    qxl_drawable = (QXLCompatDrawable *)memslot_get_virt(slots, addr, sizeof(*qxl_drawable), group_id, &error);
-    if (error) {
+    qxl_drawable = red_qxl_guest_resources_init(&red_drawable->guest_resources,
+                                                qxl_instance, slots, group_id,
+                                                addr, sizeof(*qxl_drawable));
+    if (qxl_drawable == NULL) {
         return false;
     }
-    red_drawable->qxl = qxl_instance;
-    red_drawable->release_info_ext.info     = &qxl_drawable->release_info;
-    red_drawable->release_info_ext.group_id = group_id;
 
     red_get_rect_ptr(&red_drawable->bbox, &qxl_drawable->bbox);
     red_get_clip_ptr(slots, group_id, &red_drawable->clip, &qxl_drawable->clip);
@@ -1237,24 +1262,20 @@ static void red_put_drawable(RedDrawable *red_drawable)
         red_put_whiteness(&red_drawable->u.whiteness);
         break;
     }
-    if (red_drawable->qxl != NULL) {
-        red_qxl_release_resource(red_drawable->qxl, red_drawable->release_info_ext);
-    }
+    red_qxl_guest_resources_release(&red_drawable->guest_resources);
 }
 
 static bool red_get_update_cmd(QXLInstance *qxl_instance, RedMemSlotInfo *slots, int group_id,
                                RedUpdateCmd *red_cmd, QXLPHYSICAL addr)
 {
     QXLUpdateCmd *qxl_cmd;
-    int error;
 
-    qxl_cmd = (QXLUpdateCmd *)memslot_get_virt(slots, addr, sizeof(*qxl_cmd), group_id, &error);
-    if (error) {
+    qxl_cmd = red_qxl_guest_resources_init(&red_cmd->guest_resources,
+                                           qxl_instance, slots, group_id,
+                                           addr, sizeof(*qxl_cmd));
+    if (qxl_cmd == NULL) {
         return false;
     }
-    red_cmd->qxl = qxl_instance;
-    red_cmd->release_info_ext.info     = &qxl_cmd->release_info;
-    red_cmd->release_info_ext.group_id = group_id;
 
     red_get_rect_ptr(&red_cmd->area, &qxl_cmd->area);
     red_cmd->update_id  = qxl_cmd->update_id;
@@ -1264,9 +1285,7 @@ static bool red_get_update_cmd(QXLInstance *qxl_instance, RedMemSlotInfo *slots,
 
 static void red_put_update_cmd(RedUpdateCmd *red_cmd)
 {
-    if (red_cmd->qxl != NULL) {
-        red_qxl_release_resource(red_cmd->qxl, red_cmd->release_info_ext);
-    }
+    red_qxl_guest_resources_release(&red_cmd->guest_resources);
 }
 
 RedUpdateCmd *red_update_cmd_new(QXLInstance *qxl, RedMemSlotInfo *slots, int group_id, QXLPHYSICAL addr)
@@ -1304,7 +1323,6 @@ static bool red_get_message(QXLInstance *qxl_instance, RedMemSlotInfo *slots, in
                             RedMessage *red_message, QXLPHYSICAL addr)
 {
     QXLMessage *qxl_message;
-    int error;
     int memslot_id;
     unsigned long len;
     uint8_t *end;
@@ -1315,14 +1333,14 @@ static bool red_get_message(QXLInstance *qxl_instance, RedMemSlotInfo *slots, in
      *   luckily this is for debug logging only,
      *   so we can just ignore it by default.
      */
-    qxl_message = (QXLMessage *)memslot_get_virt(slots, addr, sizeof(*qxl_message), group_id, &error);
-    if (error) {
+    //qxl_message = (QXLMessage *)memslot_get_virt(slots, addr, sizeof(*qxl_message), group_id, &error);
+    qxl_message = red_qxl_guest_resources_init(&red_message->guest_resources,
+                                               qxl_instance, slots, group_id,
+                                               addr, sizeof(*qxl_message));
+    if (qxl_message == NULL) {
         return false;
     }
-    red_message->qxl = qxl_instance;
-    red_message->release_info_ext.info      = &qxl_message->release_info;
-    red_message->release_info_ext.group_id  = group_id;
-    red_message->data                       = qxl_message->data;
+    red_message->data = qxl_message->data;
     memslot_id = memslot_get_id(slots, addr+sizeof(*qxl_message));
     len = memslot_max_size_virt(slots, ((intptr_t) qxl_message)+sizeof(*qxl_message), memslot_id, group_id);
     len = MIN(len, 100000);
@@ -1336,9 +1354,7 @@ static bool red_get_message(QXLInstance *qxl_instance, RedMemSlotInfo *slots, in
 
 static void red_put_message(RedMessage *red_message)
 {
-    if (red_message->qxl != NULL) {
-        red_qxl_release_resource(red_message->qxl, red_message->release_info_ext);
-    }
+    red_qxl_guest_resources_release(&red_message->guest_resources);
 }
 
 RedMessage *red_message_new(QXLInstance *qxl, RedMemSlotInfo *slots, int group_id, QXLPHYSICAL addr)
@@ -1426,14 +1442,12 @@ static bool red_get_surface_cmd(QXLInstance *qxl_instance, RedMemSlotInfo *slots
     uint64_t size;
     int error;
 
-    qxl_cmd = (QXLSurfaceCmd *)memslot_get_virt(slots, addr, sizeof(*qxl_cmd), group_id,
-                                                &error);
-    if (error) {
+    qxl_cmd = red_qxl_guest_resources_init(&red_cmd->guest_resources,
+                                           qxl_instance, slots, group_id,
+                                           addr, sizeof(*qxl_cmd));
+    if (qxl_cmd == NULL) {
         return false;
     }
-    red_cmd->qxl = qxl_instance;
-    red_cmd->release_info_ext.info      = &qxl_cmd->release_info;
-    red_cmd->release_info_ext.group_id  = group_id;
 
     red_cmd->surface_id = qxl_cmd->surface_id;
     red_cmd->type       = qxl_cmd->type;
@@ -1464,9 +1478,7 @@ static bool red_get_surface_cmd(QXLInstance *qxl_instance, RedMemSlotInfo *slots
 
 static void red_put_surface_cmd(RedSurfaceCmd *red_cmd)
 {
-    if (red_cmd->qxl) {
-        red_qxl_release_resource(red_cmd->qxl, red_cmd->release_info_ext);
-    }
+    red_qxl_guest_resources_release(&red_cmd->guest_resources);
 }
 
 RedSurfaceCmd *red_surface_cmd_new(QXLInstance *qxl_instance, RedMemSlotInfo *slots,
@@ -1552,15 +1564,13 @@ static bool red_get_cursor_cmd(QXLInstance *qxl_instance, RedMemSlotInfo *slots,
                                QXLPHYSICAL addr)
 {
     QXLCursorCmd *qxl_cmd;
-    int error;
 
-    qxl_cmd = (QXLCursorCmd *)memslot_get_virt(slots, addr, sizeof(*qxl_cmd), group_id, &error);
-    if (error) {
+    qxl_cmd = red_qxl_guest_resources_init(&red_cmd->guest_resources,
+                                           qxl_instance, slots, group_id,
+                                           addr, sizeof(*qxl_cmd));
+    if (qxl_cmd == NULL) {
         return false;
     }
-    red_cmd->qxl = qxl_instance;
-    red_cmd->release_info_ext.info      = &qxl_cmd->release_info;
-    red_cmd->release_info_ext.group_id  = group_id;
 
     red_cmd->type = qxl_cmd->type;
     switch (red_cmd->type) {
@@ -1603,9 +1613,7 @@ static void red_put_cursor_cmd(RedCursorCmd *red_cmd)
         red_put_cursor(&red_cmd->u.set.shape);
         break;
     }
-    if (red_cmd->qxl) {
-        red_qxl_release_resource(red_cmd->qxl, red_cmd->release_info_ext);
-    }
+    red_qxl_guest_resources_release(&red_cmd->guest_resources);
 }
 
 RedCursorCmd *red_cursor_cmd_ref(RedCursorCmd *cmd)
diff --git a/server/red-parse-qxl.h b/server/red-parse-qxl.h
index 43ace663b..2f6af584d 100644
--- a/server/red-parse-qxl.h
+++ b/server/red-parse-qxl.h
@@ -24,10 +24,14 @@
 #include "red-common.h"
 #include "memslot.h"
 
+typedef struct {
+    QXLInstance *qxl;
+    QXLReleaseInfoExt release_info_ext;
+} RedQXLGuestResources;
+
 typedef struct RedDrawable {
+    RedQXLGuestResources guest_resources;
     int refs;
-    QXLInstance *qxl;
-    QXLReleaseInfoExt release_info_ext;
     uint32_t surface_id;
     uint8_t effect;
     uint8_t type;
@@ -60,8 +64,7 @@ typedef struct RedDrawable {
 } RedDrawable;
 
 typedef struct RedUpdateCmd {
-    QXLInstance *qxl;
-    QXLReleaseInfoExt release_info_ext;
+    RedQXLGuestResources guest_resources;
     int refs;
     SpiceRect area;
     uint32_t update_id;
@@ -69,8 +72,7 @@ typedef struct RedUpdateCmd {
 } RedUpdateCmd;
 
 typedef struct RedMessage {
-    QXLInstance *qxl;
-    QXLReleaseInfoExt release_info_ext;
+    RedQXLGuestResources guest_resources;
     int refs;
     int len;
     uint8_t *data;
@@ -85,8 +87,7 @@ typedef struct RedSurfaceCreate {
 } RedSurfaceCreate;
 
 typedef struct RedSurfaceCmd {
-    QXLInstance *qxl;
-    QXLReleaseInfoExt release_info_ext;
+    RedQXLGuestResources guest_resources;
     int refs;
     uint32_t surface_id;
     uint8_t type;
@@ -97,8 +98,7 @@ typedef struct RedSurfaceCmd {
 } RedSurfaceCmd;
 
 typedef struct RedCursorCmd {
-    QXLInstance *qxl;
-    QXLReleaseInfoExt release_info_ext;
+    RedQXLGuestResources guest_resources;
     int refs;
     uint8_t type;
     union {
-- 
2.14.3



More information about the Spice-devel mailing list