[Spice-commits] server/dispatcher.c server/dispatcher.h server/main-dispatcher.c server/red-worker.c
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Aug 2 10:20:40 UTC 2019
server/dispatcher.c | 15 +++++++++------
server/dispatcher.h | 25 +++++--------------------
server/main-dispatcher.c | 12 +-----------
server/red-worker.c | 10 +---------
4 files changed, 16 insertions(+), 46 deletions(-)
New commits:
commit 5fb4f52bdb5fb572bdd90f6bfb835a7d381fabbd
Author: Frediano Ziglio <fziglio at redhat.com>
Date: Fri Mar 29 15:18:08 2019 +0000
dispatcher: Use a new API to handle events
Instead of having to manually register the file descriptor and
than need to call dispatcher_handle_recv_read just provide a single
API to create the watch.
This has some advantage:
- replace 2 API with 1;
- code reuse for handling the event (removed 2 functions);
- avoid the caller to use the file descriptor;
- avoid the caller to register wrong events.
Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
Acked-by: Victor Toso <victortoso at redhat.com>
diff --git a/server/dispatcher.c b/server/dispatcher.c
index 602f30a8..bd74b6f3 100644
--- a/server/dispatcher.c
+++ b/server/dispatcher.c
@@ -317,11 +317,13 @@ static int dispatcher_handle_single_read(Dispatcher *dispatcher)
}
/*
- * dispatcher_handle_recv_read
+ * dispatcher_handle_event
* doesn't handle being in the middle of a message. all reads are blocking.
*/
-void dispatcher_handle_recv_read(Dispatcher *dispatcher)
+static void dispatcher_handle_event(int fd, int event, void *opaque)
{
+ Dispatcher *dispatcher = opaque;
+
while (dispatcher_handle_single_read(dispatcher)) {
}
}
@@ -430,14 +432,15 @@ static void setup_dummy_signal_handler(void)
}
#endif
-void dispatcher_set_opaque(Dispatcher *self, void *opaque)
+SpiceWatch *dispatcher_create_watch(Dispatcher *dispatcher, SpiceCoreInterfaceInternal *core)
{
- self->priv->opaque = opaque;
+ return core->watch_add(core, dispatcher->priv->recv_fd,
+ SPICE_WATCH_EVENT_READ, dispatcher_handle_event, dispatcher);
}
-int dispatcher_get_recv_fd(Dispatcher *dispatcher)
+void dispatcher_set_opaque(Dispatcher *self, void *opaque)
{
- return dispatcher->priv->recv_fd;
+ self->priv->opaque = opaque;
}
pthread_t dispatcher_get_thread_id(Dispatcher *self)
diff --git a/server/dispatcher.h b/server/dispatcher.h
index 49215782..5bd0b105 100644
--- a/server/dispatcher.h
+++ b/server/dispatcher.h
@@ -148,29 +148,14 @@ void dispatcher_register_handler(Dispatcher *dispatcher, uint32_t message_type,
void dispatcher_register_universal_handler(Dispatcher *dispatcher,
dispatcher_handle_any_message handler);
-/* dispatcher_handle_recv_read
+/* dispatcher_create_watch
*
- * A convenience function that is intended to be called by the receiving thread
- * to handle all incoming messages and execute any handlers for those messages.
- * This function will handle all incoming messages until there is no more data
- * to read, so multiple handlers may be executed from a single call to
- * dispatcher_handle_recv_read().
+ * Create a new watch to handle events for the dispatcher.
+ * You should release it before releasing the dispatcher.
*
- * @dispatcher: Dispatcher instance
- */
-void dispatcher_handle_recv_read(Dispatcher *);
-
-/* dispatcher_get_recv_fd
- *
- * This function returns the file descriptor that is used by the receiving
- * thread to listen for incoming messages. You should not read or write
- * directly to this fd, but should only use it to watch for read events. When
- * there is a read event, you should use dispatcher_handle_recv_read() to
- * handle the incoming messages.
- *
- * @return: receive file descriptor of the dispatcher
+ * @return: newly created watch
*/
-int dispatcher_get_recv_fd(Dispatcher *);
+SpiceWatch *dispatcher_create_watch(Dispatcher *dispatcher, SpiceCoreInterfaceInternal *core);
/* dispatcher_set_opaque
*
diff --git a/server/main-dispatcher.c b/server/main-dispatcher.c
index 839e7242..2ca68a4d 100644
--- a/server/main-dispatcher.c
+++ b/server/main-dispatcher.c
@@ -247,13 +247,6 @@ void main_dispatcher_client_disconnect(MainDispatcher *self, RedClient *client)
}
}
-static void dispatcher_handle_read(int fd, int event, void *opaque)
-{
- Dispatcher *dispatcher = opaque;
-
- dispatcher_handle_recv_read(dispatcher);
-}
-
/*
* FIXME:
* Reds routines shouldn't be exposed. Instead reds.c should register the callbacks,
@@ -276,10 +269,7 @@ void main_dispatcher_constructed(GObject *object)
dispatcher_set_opaque(DISPATCHER(self), self->priv->reds);
self->priv->watch =
- reds_core_watch_add(self->priv->reds,
- dispatcher_get_recv_fd(DISPATCHER(self)),
- SPICE_WATCH_EVENT_READ, dispatcher_handle_read,
- DISPATCHER(self));
+ dispatcher_create_watch(DISPATCHER(self), reds_get_core_interface(self->priv->reds));
dispatcher_register_handler(DISPATCHER(self), MAIN_DISPATCHER_CHANNEL_EVENT,
main_dispatcher_handle_channel_event,
sizeof(MainDispatcherChannelEventMessage), false);
diff --git a/server/red-worker.c b/server/red-worker.c
index b3335a53..98a4a9dc 100644
--- a/server/red-worker.c
+++ b/server/red-worker.c
@@ -980,13 +980,6 @@ static void register_callbacks(Dispatcher *dispatcher)
-static void handle_dev_input(int fd, int event, void *opaque)
-{
- Dispatcher *dispatcher = opaque;
-
- dispatcher_handle_recv_read(dispatcher);
-}
-
typedef struct RedWorkerSource {
GSource source;
RedWorker *worker;
@@ -1086,8 +1079,7 @@ RedWorker* red_worker_new(QXLInstance *qxl)
stat_init_counter(&worker->total_loop_counter, reds, &worker->stat, "total_loops", TRUE);
worker->dispatch_watch =
- worker->core.watch_add(&worker->core, dispatcher_get_recv_fd(dispatcher),
- SPICE_WATCH_EVENT_READ, handle_dev_input, dispatcher);
+ dispatcher_create_watch(dispatcher, &worker->core);
spice_assert(worker->dispatch_watch != NULL);
GSource *source = g_source_new(&worker_source_funcs, sizeof(RedWorkerSource));
More information about the Spice-commits
mailing list