[Spice-devel] [PATCH v3 02/14] server/red_worker: use ack_data struct

Alon Levy alevy at redhat.com
Fri Feb 11 04:43:45 PST 2011


start of move to red_channel based channels
---
 server/red_worker.c |   38 ++++++++++++++++++++------------------
 1 files changed, 20 insertions(+), 18 deletions(-)

diff --git a/server/red_worker.c b/server/red_worker.c
index df51841..97f5e70 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -362,10 +362,12 @@ struct RedChannel {
     Ring pipe;
     uint32_t pipe_size;
 
-    uint32_t client_ack_window;
-    uint32_t ack_generation;
-    uint32_t client_ack_generation;
-    uint32_t messages_window;
+    struct {
+        uint32_t client_window;
+        uint32_t generation;
+        uint32_t client_generation;
+        uint32_t messages_window;
+    } ack_data;
 
     struct {
         int blocked;
@@ -7386,7 +7388,7 @@ static inline void red_begin_send_message(RedChannel *channel, void *item)
     spice_marshaller_flush(channel->send_data.marshaller);
     channel->send_data.size = spice_marshaller_get_total_size(channel->send_data.marshaller);
     channel->send_data.header->size =  channel->send_data.size - sizeof(SpiceDataHeader);
-    channel->messages_window++;
+    channel->ack_data.messages_window++;
     channel->send_data.header = NULL; /* avoid writing to this until we have a new message */
     red_send_data(channel, item);
 }
@@ -7742,9 +7744,9 @@ static void red_send_set_ack(RedChannel *channel)
 
     ASSERT(channel);
     channel->send_data.header->type = SPICE_MSG_SET_ACK;
-    ack.generation = ++channel->ack_generation;
-    ack.window = channel->client_ack_window;
-    channel->messages_window = 0;
+    ack.generation = ++channel->ack_data.generation;
+    ack.window = channel->ack_data.client_window;
+    channel->ack_data.messages_window = 0;
 
     spice_marshall_msg_set_ack(channel->send_data.marshaller, &ack);
 
@@ -8274,7 +8276,7 @@ static inline PipeItem *red_pipe_get(RedChannel *channel)
         return NULL;
     }
 
-    if (channel->messages_window > channel->client_ack_window * 2) {
+    if (channel->ack_data.messages_window > channel->ack_data.client_window * 2) {
         channel->send_data.blocked = TRUE;
         return NULL;
     }
@@ -8896,7 +8898,7 @@ static void on_new_display_channel(RedWorker *worker)
     if (!display_channel_wait_for_init(display_channel)) {
         return;
     }
-    display_channel->base.messages_window = 0;
+    display_channel->base.ack_data.messages_window = 0;
     if (worker->surfaces[0].context.canvas) {
         red_current_flush(worker, 0);
         push_new_primary_surface(worker);
@@ -8912,11 +8914,11 @@ static int channel_handle_message(RedChannel *channel, size_t size, uint32_t typ
 {
     switch (type) {
     case SPICE_MSGC_ACK_SYNC:
-        channel->client_ack_generation = *(uint32_t *)message;
+        channel->ack_data.client_generation = *(uint32_t *)message;
         break;
     case SPICE_MSGC_ACK:
-        if (channel->client_ack_generation == channel->ack_generation) {
-            channel->messages_window -= channel->client_ack_window;
+        if (channel->ack_data.client_generation == channel->ack_data.generation) {
+            channel->ack_data.messages_window -= channel->ack_data.client_window;
         }
         break;
     case SPICE_MSGC_DISCONNECTING:
@@ -9211,7 +9213,7 @@ static int display_channel_handle_migrate_data(DisplayChannel *channel, size_t s
 
     red_pipe_add_type((RedChannel *)channel, PIPE_ITEM_TYPE_INVAL_PALLET_CACHE);
 
-    channel->base.messages_window = 0;
+    channel->base.ack_data.messages_window = 0;
     return TRUE;
 }
 
@@ -9346,11 +9348,11 @@ static RedChannel *__new_channel(RedWorker *worker, int size, uint32_t channel_i
     channel->handle_message = handle_message;
     channel->peer = peer;
     channel->worker = worker;
-    channel->messages_window = ~0;  // blocks send message (maybe use send_data.blocked +
+    channel->ack_data.messages_window = ~0;  // blocks send message (maybe use send_data.blocked +
                                     // block flags)
-    channel->client_ack_window = IS_LOW_BANDWIDTH() ? WIDE_CLIENT_ACK_WINDOW :
+    channel->ack_data.client_window = IS_LOW_BANDWIDTH() ? WIDE_CLIENT_ACK_WINDOW :
                                                       NARROW_CLIENT_ACK_WINDOW;
-    channel->client_ack_generation = ~0;
+    channel->ack_data.client_generation = ~0;
     channel->recive_data.message = (SpiceDataHeader *)channel->recive_data.buf;
     channel->recive_data.now = channel->recive_data.buf;
     channel->recive_data.end = channel->recive_data.buf + sizeof(channel->recive_data.buf);
@@ -9537,7 +9539,7 @@ static void on_new_cursor_channel(RedWorker *worker)
 
     ASSERT(channel);
 
-    channel->base.messages_window = 0;
+    channel->base.ack_data.messages_window = 0;
     red_pipe_add_type(&channel->base, PIPE_ITEM_TYPE_SET_ACK);
     if (worker->surfaces[0].context.canvas && !channel->base.migrate) {
         red_pipe_add_type(&worker->cursor_channel->base, PIPE_ITEM_TYPE_CURSOR_INIT);
-- 
1.7.4



More information about the Spice-devel mailing list