[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