Hi,

Ack after small fixes
On 11/06/2011 06:49 PM, Alon Levy wrote:
This is part of the dispatcher update, extracting the dispatcher routine
from red_dispatcher and main_dispatcher into dispatcher.

Supporting multiple async operations will make it natural to support
async monitor commands and async guest io requests that could overlap in
time.

Bugzilla: 42463

Related: 41622

rfc->v1:
  use a Ring for AsyncCommands instead of a singly linked list.
  s/push_async_command/async_command_alloc/
  fix missing addressof in update_area_async
shouldn't be in the commit msg
---
  server/red_dispatcher.c |  117 ++++++++++++++++++++++------------------------
  server/red_dispatcher.h |    3 +-
  server/red_worker.c     |    6 +-
  3 files changed, 61 insertions(+), 65 deletions(-)

<snip>

-void red_dispatcher_async_complete(struct RedDispatcher *dispatcher, uint64_t 
cookie)
+void red_dispatcher_async_complete(struct RedDispatcher *dispatcher,
+                                   AsyncCommand *async_command)
  {
      pthread_mutex_lock(&dispatcher->async_lock);
-    switch (dispatcher->async_message) {
+    ring_remove(&async_command->link);
+    red_printf_debug(2, "%p: cookie %" PRId64, async_command, 
async_command->cookie);
+    if (ring_is_empty(&dispatcher->async_commands)) {
+        red_printf_debug(2, "%s: no more async commands", __func__);
+    }
+    pthread_mutex_unlock(&dispatcher->async_lock);
+    switch (async_command->message) {
      case RED_WORKER_MESSAGE_UPDATE_ASYNC:
          break;
      case RED_WORKER_MESSAGE_ADD_MEMSLOT_ASYNC:
@@ -863,11 +858,11 @@ void red_dispatcher_async_complete(struct RedDispatcher 
*dispatcher, uint64_t co
      case RED_WORKER_MESSAGE_FLUSH_SURFACES_ASYNC:
          break;
      default:
-        red_printf("unexpected message");
+        WARN("unexpected message");
      }
-    dispatcher->async_message = RED_WORKER_MESSAGE_NOP;
-    pthread_mutex_unlock(&dispatcher->async_lock);
-    dispatcher->qxl->st->qif->async_complete(dispatcher->qxl, cookie);
+    free(async_command);
+    dispatcher->qxl->st->qif->async_complete(dispatcher->qxl,
+                                             async_command->cookie);
accessing async_command after it is freed

  }

  static RedChannel *red_dispatcher_display_channel_create(RedDispatcher 
*dispatcher)
@@ -922,6 +917,7 @@ RedDispatcher *red_dispatcher_init(QXLInstance *qxl)

      dispatcher = spice_new0(RedDispatcher, 1);
      dispatcher->channel = channels[0];
+    ring_init(&dispatcher->async_commands);
      init_data.qxl = dispatcher->qxl = qxl;
      init_data.id = qxl->id;
      init_data.channel = channels[1];
@@ -929,7 +925,6 @@ RedDispatcher *red_dispatcher_init(QXLInstance *qxl)
      init_data.num_renderers = num_renderers;
      memcpy(init_data.renderers, renderers, sizeof(init_data.renderers));

-    dispatcher->async_message = RED_WORKER_MESSAGE_NOP;
      pthread_mutex_init(&dispatcher->async_lock, NULL);
      init_data.image_compression = image_compression;
      init_data.jpeg_state = jpeg_state;
diff --git a/server/red_dispatcher.h b/server/red_dispatcher.h
index 144a40e..c2582f4 100644
--- a/server/red_dispatcher.h
+++ b/server/red_dispatcher.h
@@ -19,6 +19,7 @@
  #define _H_RED_DISPATCHER

  struct RedChannelClient;
+typedef struct AsyncCommand AsyncCommand;

  struct RedDispatcher *red_dispatcher_init(QXLInstance *qxl);

@@ -30,6 +31,6 @@ int red_dispatcher_count(void);
  int red_dispatcher_add_renderer(const char *name);
  uint32_t red_dispatcher_qxl_ram_size(void);
  int red_dispatcher_qxl_count(void);
-void red_dispatcher_async_complete(struct RedDispatcher*, uint64_t);
+void red_dispatcher_async_complete(struct RedDispatcher *, AsyncCommand *);

  #endif
diff --git a/server/red_worker.c b/server/red_worker.c
index 4337d16..a5c2df3 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -10383,7 +10383,7 @@ static void handle_dev_input(EventListener *listener, 
uint32_t events)
      int ring_is_empty;
      int call_async_complete = 0;
      int write_ready = 0;
-    uint64_t cookie;
+    AsyncCommand *cmd;

      read_message(worker->channel,&message);

@@ -10398,7 +10398,7 @@ static void handle_dev_input(EventListener *listener, 
uint32_t events)
      case RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT_ASYNC:
      case RED_WORKER_MESSAGE_FLUSH_SURFACES_ASYNC:
          call_async_complete = 1;
-        receive_data(worker->channel,&cookie, sizeof(cookie));
+        receive_data(worker->channel,&cmd, sizeof(cmd));
          break;
      case RED_WORKER_MESSAGE_UPDATE:
      case RED_WORKER_MESSAGE_ADD_MEMSLOT:
@@ -10667,7 +10667,7 @@ static void handle_dev_input(EventListener *listener, 
uint32_t events)
          red_error("message error");
      }
      if (call_async_complete) {
-        red_dispatcher_async_complete(worker->dispatcher, cookie);
+        red_dispatcher_async_complete(worker->dispatcher, cmd);
      }
      if (write_ready) {
          message = RED_WORKER_MESSAGE_READY;

_______________________________________________
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/spice-devel

Reply via email to