[Spice-devel] [PATCH 15/19] worker: move current_remove*
Frediano Ziglio
fziglio at redhat.com
Wed Nov 25 07:27:39 PST 2015
From: Marc-André Lureau <marcandre.lureau at gmail.com>
---
server/display-channel.c | 61 ++++++++++++++++++++++++++++++++++++
server/display-channel.h | 3 --
server/red_worker.c | 80 ------------------------------------------------
server/stream.c | 19 ++++++++++++
server/stream.h | 2 ++
5 files changed, 82 insertions(+), 83 deletions(-)
diff --git a/server/display-channel.c b/server/display-channel.c
index ded306b..aa3e7fb 100644
--- a/server/display-channel.c
+++ b/server/display-channel.c
@@ -391,6 +391,67 @@ static void current_add_drawable(DisplayChannel *display,
drawable->refs++;
}
+static void current_remove_drawable(DisplayChannel *display, Drawable *item)
+{
+ /* todo: move all to unref? */
+ stream_trace_add_drawable(display, item);
+ draw_item_remove_shadow(&item->tree_item);
+ ring_remove(&item->tree_item.base.siblings_link);
+ ring_remove(&item->list_link);
+ ring_remove(&item->surface_list_link);
+ display_channel_drawable_unref(display, item);
+ display->current_size--;
+}
+
+static void current_remove(DisplayChannel *display, TreeItem *item)
+{
+ TreeItem *now = item;
+
+ /* depth-first tree traversal, TODO: do a to tree_foreach()? */
+ for (;;) {
+ Container *container = now->container;
+ RingItem *ring_item;
+
+ if (now->type == TREE_ITEM_TYPE_DRAWABLE) {
+ Drawable *drawable = SPICE_CONTAINEROF(now, Drawable, tree_item);
+ ring_item = now->siblings_link.prev;
+ red_pipes_remove_drawable(drawable);
+ current_remove_drawable(display, drawable);
+ } else {
+ Container *container = (Container *)now;
+
+ spice_assert(now->type == TREE_ITEM_TYPE_CONTAINER);
+
+ if ((ring_item = ring_get_head(&container->items))) {
+ now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
+ continue;
+ }
+ ring_item = now->siblings_link.prev;
+ container_free(container);
+ }
+ if (now == item) {
+ return;
+ }
+
+ if ((ring_item = ring_next(&container->items, ring_item))) {
+ now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
+ } else {
+ now = (TreeItem *)container;
+ }
+ }
+}
+
+static void current_remove_all(DisplayChannel *display, int surface_id)
+{
+ Ring *ring = &display->surfaces[surface_id].current;
+ RingItem *ring_item;
+
+ while ((ring_item = ring_get_head(ring))) {
+ TreeItem *now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
+ current_remove(display, now);
+ }
+}
+
static int current_add_equal(DisplayChannel *display, DrawItem *item, TreeItem *other)
{
DrawItem *other_draw_item;
diff --git a/server/display-channel.h b/server/display-channel.h
index 05b0e0e..3f3c278 100644
--- a/server/display-channel.h
+++ b/server/display-channel.h
@@ -433,12 +433,9 @@ static inline void region_add_clip_rects(QRegion *rgn, SpiceClipRects *data)
}
uint32_t generate_uid(DisplayChannel *display);
-void current_remove_drawable(DisplayChannel *display, Drawable *item);
void red_pipes_remove_drawable(Drawable *drawable);
-void current_remove(DisplayChannel *display, TreeItem *item);
void detach_streams_behind(DisplayChannel *display, QRegion *region, Drawable *drawable);
void drawable_draw(DisplayChannel *display, Drawable *item);
-void current_remove_all(DisplayChannel *display, int surface_id);
void drawables_init(DisplayChannel *display);
#endif /* DISPLAY_CHANNEL_H_ */
diff --git a/server/red_worker.c b/server/red_worker.c
index b308e97..eb4be25 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -186,86 +186,6 @@ void red_drawable_unref(RedWorker *worker, RedDrawable *red_drawable,
free(red_drawable);
}
-static void display_stream_trace_add_drawable(DisplayChannel *display, Drawable *item)
-{
- ItemTrace *trace;
-
- if (item->stream || !item->streamable) {
- return;
- }
-
- trace = &display->items_trace[display->next_item_trace++ & ITEMS_TRACE_MASK];
- trace->time = item->creation_time;
- trace->frames_count = item->frames_count;
- trace->gradual_frames_count = item->gradual_frames_count;
- trace->last_gradual_frame = item->last_gradual_frame;
- SpiceRect* src_area = &item->red_drawable->u.copy.src_area;
- trace->width = src_area->right - src_area->left;
- trace->height = src_area->bottom - src_area->top;
- trace->dest_area = item->red_drawable->bbox;
-}
-
-void current_remove_drawable(DisplayChannel *display, Drawable *item)
-{
- /* todo: move all to unref? */
- display_stream_trace_add_drawable(display, item);
- draw_item_remove_shadow(&item->tree_item);
- ring_remove(&item->tree_item.base.siblings_link);
- ring_remove(&item->list_link);
- ring_remove(&item->surface_list_link);
- display_channel_drawable_unref(display, item);
- display->current_size--;
-}
-
-void current_remove(DisplayChannel *display, TreeItem *item)
-{
- TreeItem *now = item;
-
- /* depth-first tree traversal, TODO: do a to tree_foreach()? */
- for (;;) {
- Container *container = now->container;
- RingItem *ring_item;
-
- if (now->type == TREE_ITEM_TYPE_DRAWABLE) {
- Drawable *drawable = SPICE_CONTAINEROF(now, Drawable, tree_item);
- ring_item = now->siblings_link.prev;
- red_pipes_remove_drawable(drawable);
- current_remove_drawable(display, drawable);
- } else {
- Container *container = (Container *)now;
-
- spice_assert(now->type == TREE_ITEM_TYPE_CONTAINER);
-
- if ((ring_item = ring_get_head(&container->items))) {
- now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
- continue;
- }
- ring_item = now->siblings_link.prev;
- container_free(container);
- }
- if (now == item) {
- return;
- }
-
- if ((ring_item = ring_next(&container->items, ring_item))) {
- now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
- } else {
- now = (TreeItem *)container;
- }
- }
-}
-
-void current_remove_all(DisplayChannel *display, int surface_id)
-{
- Ring *ring = &display->surfaces[surface_id].current;
- RingItem *ring_item;
-
- while ((ring_item = ring_get_head(ring))) {
- TreeItem *now = SPICE_CONTAINEROF(ring_item, TreeItem, siblings_link);
- current_remove(display, now);
- }
-}
-
static void red_process_draw(RedWorker *worker, RedDrawable *red_drawable,
uint32_t group_id)
{
diff --git a/server/stream.c b/server/stream.c
index 08224d8..50881e5 100644
--- a/server/stream.c
+++ b/server/stream.c
@@ -904,3 +904,22 @@ void stream_timeout(DisplayChannel *display)
}
}
}
+
+void stream_trace_add_drawable(DisplayChannel *display, Drawable *item)
+{
+ ItemTrace *trace;
+
+ if (item->stream || !item->streamable) {
+ return;
+ }
+
+ trace = &display->items_trace[display->next_item_trace++ & ITEMS_TRACE_MASK];
+ trace->time = item->creation_time;
+ trace->frames_count = item->frames_count;
+ trace->gradual_frames_count = item->gradual_frames_count;
+ trace->last_gradual_frame = item->last_gradual_frame;
+ SpiceRect* src_area = &item->red_drawable->u.copy.src_area;
+ trace->width = src_area->right - src_area->left;
+ trace->height = src_area->bottom - src_area->top;
+ trace->dest_area = item->red_drawable->bbox;
+}
diff --git a/server/stream.h b/server/stream.h
index 35cbf5f..b11b10f 100644
--- a/server/stream.h
+++ b/server/stream.h
@@ -157,6 +157,8 @@ void stream_maintenance (DisplayChan
Drawable *prev);
void stream_timeout (DisplayChannel *display);
void stream_detach_and_stop (DisplayChannel *display);
+void stream_trace_add_drawable (DisplayChannel *display,
+ Drawable *item);
void stream_agent_unref (DisplayChannel *display,
StreamAgent *agent);
--
2.4.3
More information about the Spice-devel
mailing list