[Spice-devel] [PATCH 08/16] worker: move red_destroy_surface_item()

Frediano Ziglio fziglio at redhat.com
Tue Nov 10 06:16:21 PST 2015


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

---
 server/display-channel.c | 36 ++++++++++++++++++++++++++++++++++
 server/display-channel.h | 19 ++++++++++++++++++
 server/red_worker.c      | 50 +-----------------------------------------------
 3 files changed, 56 insertions(+), 49 deletions(-)

diff --git a/server/display-channel.c b/server/display-channel.c
index 8775496..b5d8830 100644
--- a/server/display-channel.c
+++ b/server/display-channel.c
@@ -226,6 +226,42 @@ void dcc_push_monitors_config(DisplayChannelClient *dcc)
     red_channel_client_push(&dcc->common.base);
 }
 
+static SurfaceDestroyItem *surface_destroy_item_new(RedChannel *channel,
+                                                    uint32_t surface_id)
+{
+    SurfaceDestroyItem *destroy;
+
+    destroy = spice_malloc(sizeof(SurfaceDestroyItem));
+    destroy->surface_destroy.surface_id = surface_id;
+    red_channel_pipe_item_init(channel, &destroy->pipe_item,
+                               PIPE_ITEM_TYPE_DESTROY_SURFACE);
+
+    return destroy;
+}
+
+void dcc_push_destroy_surface(DisplayChannelClient *dcc, uint32_t surface_id)
+{
+    DisplayChannel *display;
+    RedChannel *channel;
+    SurfaceDestroyItem *destroy;
+
+    if (!dcc) {
+        return;
+    }
+
+    display = DCC_TO_DC(dcc);
+    channel = RED_CHANNEL(display);
+
+    if (COMMON_CHANNEL(display)->during_target_migrate ||
+        !dcc->surface_client_created[surface_id]) {
+        return;
+    }
+
+    dcc->surface_client_created[surface_id] = FALSE;
+    destroy = surface_destroy_item_new(channel, surface_id);
+    red_channel_client_pipe_add(RED_CHANNEL_CLIENT(dcc), &destroy->pipe_item);
+}
+
 int display_channel_get_streams_timeout(DisplayChannel *display)
 {
     int timeout = INT_MAX;
diff --git a/server/display-channel.h b/server/display-channel.h
index 24fb354..76e4d11 100644
--- a/server/display-channel.h
+++ b/server/display-channel.h
@@ -236,6 +236,8 @@ DisplayChannelClient*      dcc_new                                   (DisplayCha
                                                                       uint32_t *caps,
                                                                       int num_caps);
 void                       dcc_push_monitors_config                  (DisplayChannelClient *dcc);
+void                       dcc_push_destroy_surface                  (DisplayChannelClient *dcc,
+                                                                      uint32_t surface_id);
 
 typedef struct DrawablePipeItem {
     RingItem base;  /* link for a list of pipe items held by Drawable */
@@ -313,6 +315,23 @@ struct DisplayChannel {
     stat_info_t lz4_stat;
 #endif
 };
+typedef struct SurfaceDestroyItem {
+    SpiceMsgSurfaceDestroy surface_destroy;
+    PipeItem pipe_item;
+} SurfaceDestroyItem;
+
+typedef struct SurfaceCreateItem {
+    SpiceMsgSurfaceCreate surface_create;
+    PipeItem pipe_item;
+} SurfaceCreateItem;
+
+typedef struct UpgradeItem {
+    PipeItem base;
+    int refs;
+    Drawable *drawable;
+    SpiceClipRects *rects;
+} UpgradeItem;
+
 
 void                       display_channel_set_stream_video          (DisplayChannel *display,
                                                                       int stream_video);
diff --git a/server/red_worker.c b/server/red_worker.c
index 9e544c2..a51fe88 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -217,16 +217,6 @@ struct SpiceWatch {
 
 #define MAX_LZ_ENCODERS MAX_CACHE_CLIENTS
 
-typedef struct SurfaceCreateItem {
-    SpiceMsgSurfaceCreate surface_create;
-    PipeItem pipe_item;
-} SurfaceCreateItem;
-
-typedef struct SurfaceDestroyItem {
-    SpiceMsgSurfaceDestroy surface_destroy;
-    PipeItem pipe_item;
-} SurfaceDestroyItem;
-
 #define MAX_PIPE_SIZE 50
 
 #define WIDE_CLIENT_ACK_WINDOW 40
@@ -318,13 +308,6 @@ struct _Drawable {
     } u;
 };
 
-typedef struct UpgradeItem {
-    PipeItem base;
-    int refs;
-    Drawable *drawable;
-    SpiceClipRects *rects;
-} UpgradeItem;
-
 typedef struct DrawContext {
     SpiceCanvas *canvas;
     int canvas_draws_on_surface;
@@ -959,37 +942,6 @@ static void drawables_init(RedWorker *worker)
 }
 
 
-static SurfaceDestroyItem *get_surface_destroy_item(RedChannel *channel,
-                                                    uint32_t surface_id)
-{
-    SurfaceDestroyItem *destroy;
-
-    destroy = spice_malloc(sizeof(SurfaceDestroyItem));
-
-    destroy->surface_destroy.surface_id = surface_id;
-
-    red_channel_pipe_item_init(channel,
-        &destroy->pipe_item, PIPE_ITEM_TYPE_DESTROY_SURFACE);
-
-    return destroy;
-}
-
-static inline void red_destroy_surface_item(RedWorker *worker,
-    DisplayChannelClient *dcc, uint32_t surface_id)
-{
-    SurfaceDestroyItem *destroy;
-    RedChannel *channel;
-
-    if (!dcc || worker->display_channel->common.during_target_migrate ||
-        !dcc->surface_client_created[surface_id]) {
-        return;
-    }
-    dcc->surface_client_created[surface_id] = FALSE;
-    channel = RED_CHANNEL(worker->display_channel);
-    destroy = get_surface_destroy_item(channel, surface_id);
-    red_channel_client_pipe_add(RED_CHANNEL_CLIENT(dcc), &destroy->pipe_item);
-}
-
 static void stop_streams(DisplayChannel *display)
 {
     Ring *ring = &display->streams;
@@ -1037,7 +989,7 @@ static void red_surface_unref(RedWorker *worker, uint32_t surface_id)
     region_destroy(&surface->draw_dirty_region);
     surface->context.canvas = NULL;
     FOREACH_DCC(worker->display_channel, link, next, dcc) {
-        red_destroy_surface_item(worker, dcc, surface_id);
+        dcc_push_destroy_surface(dcc, surface_id);
     }
 
     spice_warn_if(!ring_is_empty(&surface->depend_on_me));
-- 
2.4.3



More information about the Spice-devel mailing list