[Spice-devel] [PATCH 22/24] worker: make sure we dispatch after releasing items

Frediano Ziglio fziglio at redhat.com
Tue Dec 1 04:05:30 PST 2015


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

---
 server/display-channel.c |  2 ++
 server/red_worker.c      | 10 ++++++++++
 server/red_worker.h      |  1 +
 3 files changed, 13 insertions(+)

diff --git a/server/display-channel.c b/server/display-channel.c
index d168190..6b9affc 100644
--- a/server/display-channel.c
+++ b/server/display-channel.c
@@ -1968,9 +1968,11 @@ static void hold_item(RedChannelClient *rcc, PipeItem *item)
 static void release_item(RedChannelClient *rcc, PipeItem *item, int item_pushed)
 {
     DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
+    RedWorker *worker = DCC_TO_WORKER(dcc);
 
     spice_return_if_fail(item != NULL);
     dcc_release_item(dcc, item, item_pushed);
+    red_worker_update_timeout(worker, 0);
 }
 
 static int handle_migrate_flush_mark(RedChannelClient *rcc)
diff --git a/server/red_worker.c b/server/red_worker.c
index 93ed8d0..8d1802e 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -110,6 +110,14 @@ RedMemSlotInfo* red_worker_get_memslot(RedWorker *worker)
     return &worker->mem_slots;
 }
 
+void red_worker_update_timeout(RedWorker *worker, gint timeout)
+{
+    spice_return_if_fail(worker != NULL);
+    spice_return_if_fail(timeout >= 0);
+
+    worker->timeout = MIN(worker->timeout, timeout);
+}
+
 static int display_is_connected(RedWorker *worker)
 {
     return (worker->display_channel && red_channel_is_connected(
@@ -1641,6 +1649,8 @@ static gboolean worker_source_prepare(GSource *source, gint *timeout)
     *timeout = worker->timeout;
     *timeout = MIN(worker->timeout,
                    display_channel_get_streams_timeout(worker->display_channel));
+    if (*timeout == 0)
+        return TRUE;
 
     return FALSE; /* do no timeout poll */
 }
diff --git a/server/red_worker.h b/server/red_worker.h
index bfbc616..236c2f8 100644
--- a/server/red_worker.h
+++ b/server/red_worker.h
@@ -94,6 +94,7 @@ static inline void red_pipes_add_verb(RedChannel *channel, uint16_t verb)
 
 RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher);
 bool       red_worker_run(RedWorker *worker);
+void       red_worker_update_timeout(RedWorker *worker, gint timeout);
 QXLInstance* red_worker_get_qxl(RedWorker *worker);
 RedChannel* red_worker_get_cursor_channel(RedWorker *worker);
 RedChannel* red_worker_get_display_channel(RedWorker *worker);
-- 
2.4.3



More information about the Spice-devel mailing list