[Spice-devel] [PATCH v2 4/6] server/dispatcher: add dispatcher_register_async_callback

Alon Levy alevy at redhat.com
Mon Nov 7 03:44:44 PST 2011


---
 server/dispatcher.c |    9 +++++++++
 server/dispatcher.h |   15 +++++++++++++++
 2 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/server/dispatcher.c b/server/dispatcher.c
index b54580e..7e9eb3a 100644
--- a/server/dispatcher.c
+++ b/server/dispatcher.c
@@ -111,6 +111,8 @@ static int dispatcher_handle_single_read(Dispatcher *dispatcher)
             red_printf("error writing ack for message %d\n", type);
             /* TODO: close socketpair? */
         }
+    } else if (msg->ack == DISPATCHER_ASYNC && dispatcher->handle_async) {
+        dispatcher->handle_async(dispatcher->opaque, type, (void *)payload);
     }
     return 1;
 }
@@ -159,6 +161,13 @@ unlock:
     pthread_mutex_unlock(&dispatcher->lock);
 }
 
+void dispatcher_register_async_callback(Dispatcher *dispatcher,
+                                        dispatcher_handle_async handler)
+{
+    assert(dispatcher->handle_async == NULL);
+    dispatcher->handle_async = handler;
+}
+
 void dispatcher_register_handler(Dispatcher *dispatcher, uint32_t message_type,
                                  dispatcher_handle_message handler, size_t size,
                                  int ack)
diff --git a/server/dispatcher.h b/server/dispatcher.h
index 95b6bfc..b85d639 100644
--- a/server/dispatcher.h
+++ b/server/dispatcher.h
@@ -8,6 +8,11 @@ typedef struct Dispatcher Dispatcher;
 typedef void (*dispatcher_handle_message)(void *opaque,
                                           void *payload);
 
+typedef void (*dispatcher_handle_async)(void *opaque,
+                                        uint32_t message_type,
+                                        void *payload);
+
+
 typedef struct DispatcherMessage {
     size_t size;
     int ack;
@@ -26,6 +31,7 @@ struct Dispatcher {
     void *payload; /* allocated as max of message sizes */
     size_t payload_size; /* used to track realloc calls */
     void *opaque;
+    dispatcher_handle_async handle_async;
 };
 
 /*
@@ -69,6 +75,15 @@ void dispatcher_register_handler(Dispatcher *dispatcher, uint32_t message_type,
                                  int ack);
 
 /*
+ * dispatcher_register_async_callback
+ * @dispatcher:     dispatcher
+ * @handler:        callback on the receiver side called *after* the
+ *                  message callback in case ack == DISPATCHER_ASYNC.
+ */
+void dispatcher_register_async_callback(Dispatcher *dispatcher,
+                                        dispatcher_handle_async handler);
+
+/*
  *  dispatcher_handle_recv_read
  *  @dispatcher: Dispatcher instance
  */
-- 
1.7.7.1



More information about the Spice-devel mailing list