[Spice-devel] [PATCH 09/18] worker: move dcc_release_item

Frediano Ziglio fziglio at redhat.com
Mon Nov 23 09:01:55 PST 2015


From: Marc-André Lureau <marcandre.lureau at gmail.com>

---
 server/dcc.c             | 124 ++++++++++++++++++++++++++++++++++++++++++
 server/dcc.h             |   3 ++
 server/display-channel.h |   7 +++
 server/red_worker.c      | 136 +----------------------------------------------
 4 files changed, 136 insertions(+), 134 deletions(-)

diff --git a/server/dcc.c b/server/dcc.c
index 5be3769..5d666cb 100644
--- a/server/dcc.c
+++ b/server/dcc.c
@@ -1394,3 +1394,127 @@ int dcc_handle_migrate_data(DisplayChannelClient *dcc, uint32_t size, void *mess
     red_channel_client_ack_zero_messages_window(RED_CHANNEL_CLIENT(dcc));
     return TRUE;
 }
+
+static void image_item_unref(ImageItem *item)
+{
+    if (--item->refs != 0)
+        return;
+
+    free(item);
+}
+
+static void upgrade_item_unref(DisplayChannel *display, UpgradeItem *item)
+{
+    if (--item->refs != 0)
+        return;
+
+    display_channel_drawable_unref(display, item->drawable);
+    free(item->rects);
+    free(item);
+}
+
+static void release_item_after_push(DisplayChannelClient *dcc, PipeItem *item)
+{
+    DisplayChannel *display = DCC_TO_DC(dcc);
+
+    switch (item->type) {
+    case PIPE_ITEM_TYPE_DRAW:
+        drawable_pipe_item_unref(SPICE_CONTAINEROF(item, DrawablePipeItem, dpi_pipe_item));
+        break;
+    case PIPE_ITEM_TYPE_STREAM_CLIP:
+        stream_clip_item_unref(dcc, (StreamClipItem *)item);
+        break;
+    case PIPE_ITEM_TYPE_UPGRADE:
+        upgrade_item_unref(display, (UpgradeItem *)item);
+        break;
+    case PIPE_ITEM_TYPE_IMAGE:
+        image_item_unref((ImageItem *)item);
+        break;
+    case PIPE_ITEM_TYPE_VERB:
+        free(item);
+        break;
+    case PIPE_ITEM_TYPE_MONITORS_CONFIG: {
+        MonitorsConfigItem *monconf_item = SPICE_CONTAINEROF(item,
+                                                             MonitorsConfigItem, pipe_item);
+        monitors_config_unref(monconf_item->monitors_config);
+        free(item);
+        break;
+    }
+    default:
+        spice_critical("invalid item type");
+    }
+}
+
+// TODO: share code between before/after_push since most of the items need the same
+// release
+static void release_item_before_push(DisplayChannelClient *dcc, PipeItem *item)
+{
+    DisplayChannel *display = DCC_TO_DC(dcc);
+
+    spice_debug("item.type: %d", item->type);
+    switch (item->type) {
+    case PIPE_ITEM_TYPE_DRAW: {
+        DrawablePipeItem *dpi = SPICE_CONTAINEROF(item, DrawablePipeItem, dpi_pipe_item);
+        ring_remove(&dpi->base);
+        drawable_pipe_item_unref(dpi);
+        break;
+    }
+    case PIPE_ITEM_TYPE_STREAM_CREATE: {
+        StreamAgent *agent = SPICE_CONTAINEROF(item, StreamAgent, create_item);
+        stream_agent_unref(display, agent);
+        break;
+    }
+    case PIPE_ITEM_TYPE_STREAM_CLIP:
+        stream_clip_item_unref(dcc, (StreamClipItem *)item);
+        break;
+    case PIPE_ITEM_TYPE_STREAM_DESTROY: {
+        StreamAgent *agent = SPICE_CONTAINEROF(item, StreamAgent, destroy_item);
+        stream_agent_unref(display, agent);
+        break;
+    }
+    case PIPE_ITEM_TYPE_UPGRADE:
+        upgrade_item_unref(display, (UpgradeItem *)item);
+        break;
+    case PIPE_ITEM_TYPE_IMAGE:
+        image_item_unref((ImageItem *)item);
+        break;
+    case PIPE_ITEM_TYPE_CREATE_SURFACE: {
+        SurfaceCreateItem *surface_create = SPICE_CONTAINEROF(item, SurfaceCreateItem,
+                                                              pipe_item);
+        free(surface_create);
+        break;
+    }
+    case PIPE_ITEM_TYPE_DESTROY_SURFACE: {
+        SurfaceDestroyItem *surface_destroy = SPICE_CONTAINEROF(item, SurfaceDestroyItem,
+                                                                pipe_item);
+        free(surface_destroy);
+        break;
+    }
+    case PIPE_ITEM_TYPE_MONITORS_CONFIG: {
+        MonitorsConfigItem *monconf_item = SPICE_CONTAINEROF(item,
+                                                             MonitorsConfigItem, pipe_item);
+        monitors_config_unref(monconf_item->monitors_config);
+        free(item);
+        break;
+    }
+    case PIPE_ITEM_TYPE_INVAL_ONE:
+    case PIPE_ITEM_TYPE_VERB:
+    case PIPE_ITEM_TYPE_MIGRATE_DATA:
+    case PIPE_ITEM_TYPE_PIXMAP_SYNC:
+    case PIPE_ITEM_TYPE_PIXMAP_RESET:
+    case PIPE_ITEM_TYPE_INVAL_PALETTE_CACHE:
+    case PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT:
+        free(item);
+        break;
+    default:
+        spice_critical("invalid item type");
+    }
+}
+
+void dcc_release_item(DisplayChannelClient *dcc, PipeItem *item, int item_pushed)
+{
+    if (item_pushed)
+        release_item_after_push(dcc, item);
+    else
+        release_item_before_push(dcc, item);
+}
diff --git a/server/dcc.h b/server/dcc.h
index 94b9195..62261e8 100644
--- a/server/dcc.h
+++ b/server/dcc.h
@@ -195,6 +195,9 @@ void                       dcc_append_drawable                       (DisplayCha
 void                       dcc_add_drawable_after                    (DisplayChannelClient *dcc,
                                                                       Drawable *drawable,
                                                                       PipeItem *pos);
+void                       dcc_release_item                          (DisplayChannelClient *dcc,
+                                                                      PipeItem *item,
+                                                                      int item_pushed);
 
 typedef struct compress_send_data_t {
     void*    comp_buf;
diff --git a/server/display-channel.h b/server/display-channel.h
index e26a1d8..e624a6b 100644
--- a/server/display-channel.h
+++ b/server/display-channel.h
@@ -243,6 +243,13 @@ typedef struct SurfaceDestroyItem {
     PipeItem pipe_item;
 } SurfaceDestroyItem;
 
+typedef struct UpgradeItem {
+    PipeItem base;
+    int refs;
+    Drawable *drawable;
+    SpiceClipRects *rects;
+} UpgradeItem;
+
 
 void                       display_channel_free_some                 (DisplayChannel *display);
 void                       display_channel_set_stream_video          (DisplayChannel *display,
diff --git a/server/red_worker.c b/server/red_worker.c
index 47b6b82..ac1ef0c 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -85,13 +85,6 @@ struct SpiceWatch {
 
 #define MAX_PIPE_SIZE 50
 
-typedef struct UpgradeItem {
-    PipeItem base;
-    int refs;
-    Drawable *drawable;
-    SpiceClipRects *rects;
-} UpgradeItem;
-
 struct RedWorker {
     pthread_t thread;
     clockid_t clockid;
@@ -148,10 +141,6 @@ static void display_channel_draw(DisplayChannel *display, const SpiceRect *area,
 static void display_channel_draw_till(DisplayChannel *display, const SpiceRect *area, int surface_id,
                                       Drawable *last);
 static inline void display_begin_send_message(RedChannelClient *rcc);
-static void display_channel_client_release_item_before_push(DisplayChannelClient *dcc,
-                                                            PipeItem *item);
-static void display_channel_client_release_item_after_push(DisplayChannelClient *dcc,
-                                                           PipeItem *item);
 static void red_create_surface(DisplayChannel *display, uint32_t surface_id, uint32_t width,
                                uint32_t height, int32_t stride, uint32_t format,
                                void *line_0, int data_is_valid, int send_client);
@@ -238,23 +227,6 @@ void red_pipes_remove_drawable(Drawable *drawable)
     }
 }
 
-static void release_image_item(ImageItem *item)
-{
-    if (!--item->refs) {
-        free(item);
-    }
-}
-
-static void upgrade_item_unref(DisplayChannel *display, UpgradeItem *item)
-{
-    if (--item->refs != 0)
-        return;
-
-    display_channel_drawable_unref(display, item->drawable);
-    free(item->rects);
-    free(item);
-}
-
 static uint8_t *common_alloc_recv_buf(RedChannelClient *rcc, uint16_t type, uint32_t size)
 {
     CommonChannel *common = SPICE_CONTAINEROF(rcc->channel, CommonChannel, base);
@@ -3956,7 +3928,7 @@ static void display_channel_send_item(RedChannelClient *rcc, PipeItem *pipe_item
         spice_error("invalid pipe item type");
     }
 
-    display_channel_client_release_item_before_push(dcc, pipe_item);
+    dcc_release_item(dcc, pipe_item, FALSE);
 
     // a message is pending
     if (red_channel_client_send_message_pending(rcc)) {
@@ -4477,116 +4449,12 @@ static void display_channel_hold_pipe_item(RedChannelClient *rcc, PipeItem *item
     }
 }
 
-static void display_channel_client_release_item_after_push(DisplayChannelClient *dcc,
-                                                           PipeItem *item)
-{
-    DisplayChannel *display = DCC_TO_DC(dcc);
-
-    switch (item->type) {
-    case PIPE_ITEM_TYPE_DRAW:
-        drawable_pipe_item_unref(SPICE_CONTAINEROF(item, DrawablePipeItem, dpi_pipe_item));
-        break;
-    case PIPE_ITEM_TYPE_STREAM_CLIP:
-        stream_clip_item_unref(dcc, (StreamClipItem *)item);
-        break;
-    case PIPE_ITEM_TYPE_UPGRADE:
-        upgrade_item_unref(display, (UpgradeItem *)item);
-        break;
-    case PIPE_ITEM_TYPE_IMAGE:
-        release_image_item((ImageItem *)item);
-        break;
-    case PIPE_ITEM_TYPE_VERB:
-        free(item);
-        break;
-    case PIPE_ITEM_TYPE_MONITORS_CONFIG: {
-        MonitorsConfigItem *monconf_item = SPICE_CONTAINEROF(item,
-                                                             MonitorsConfigItem, pipe_item);
-        monitors_config_unref(monconf_item->monitors_config);
-        free(item);
-        break;
-    }
-    default:
-        spice_critical("invalid item type");
-    }
-}
-
-// TODO: share code between before/after_push since most of the items need the same
-// release
-static void display_channel_client_release_item_before_push(DisplayChannelClient *dcc,
-                                                            PipeItem *item)
-{
-    DisplayChannel *display = DCC_TO_DC(dcc);
-
-    switch (item->type) {
-    case PIPE_ITEM_TYPE_DRAW: {
-        DrawablePipeItem *dpi = SPICE_CONTAINEROF(item, DrawablePipeItem, dpi_pipe_item);
-        ring_remove(&dpi->base);
-        drawable_pipe_item_unref(dpi);
-        break;
-    }
-    case PIPE_ITEM_TYPE_STREAM_CREATE: {
-        StreamAgent *agent = SPICE_CONTAINEROF(item, StreamAgent, create_item);
-        stream_agent_unref(display, agent);
-        break;
-    }
-    case PIPE_ITEM_TYPE_STREAM_CLIP:
-        stream_clip_item_unref(dcc, (StreamClipItem *)item);
-        break;
-    case PIPE_ITEM_TYPE_STREAM_DESTROY: {
-        StreamAgent *agent = SPICE_CONTAINEROF(item, StreamAgent, destroy_item);
-        stream_agent_unref(display, agent);
-        break;
-    }
-    case PIPE_ITEM_TYPE_UPGRADE:
-        upgrade_item_unref(display, (UpgradeItem *)item);
-        break;
-    case PIPE_ITEM_TYPE_IMAGE:
-        release_image_item((ImageItem *)item);
-        break;
-    case PIPE_ITEM_TYPE_CREATE_SURFACE: {
-        SurfaceCreateItem *surface_create = SPICE_CONTAINEROF(item, SurfaceCreateItem,
-                                                              pipe_item);
-        free(surface_create);
-        break;
-    }
-    case PIPE_ITEM_TYPE_DESTROY_SURFACE: {
-        SurfaceDestroyItem *surface_destroy = SPICE_CONTAINEROF(item, SurfaceDestroyItem,
-                                                                pipe_item);
-        free(surface_destroy);
-        break;
-    }
-    case PIPE_ITEM_TYPE_MONITORS_CONFIG: {
-        MonitorsConfigItem *monconf_item = SPICE_CONTAINEROF(item,
-                                                             MonitorsConfigItem, pipe_item);
-        monitors_config_unref(monconf_item->monitors_config);
-        free(item);
-        break;
-    }
-    case PIPE_ITEM_TYPE_INVAL_ONE:
-    case PIPE_ITEM_TYPE_VERB:
-    case PIPE_ITEM_TYPE_MIGRATE_DATA:
-    case PIPE_ITEM_TYPE_PIXMAP_SYNC:
-    case PIPE_ITEM_TYPE_PIXMAP_RESET:
-    case PIPE_ITEM_TYPE_INVAL_PALETTE_CACHE:
-    case PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT:
-        free(item);
-        break;
-    default:
-        spice_critical("invalid item type");
-    }
-}
-
 static void display_channel_release_item(RedChannelClient *rcc, PipeItem *item, int item_pushed)
 {
     DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
 
     spice_assert(item);
-    if (item_pushed) {
-        display_channel_client_release_item_after_push(dcc, item);
-    } else {
-        spice_debug("not pushed (%d)", item->type);
-        display_channel_client_release_item_before_push(dcc, item);
-    }
+    dcc_release_item(dcc, item, item_pushed);
 }
 
 static void display_channel_create(RedWorker *worker, int migrate, int stream_video,
-- 
2.4.3



More information about the Spice-devel mailing list