[Spice-devel] [spice-server 07/10] Remove IncomingHandlerInterface
Christophe Fergeau
cfergeau at redhat.com
Tue Feb 7 10:59:55 UTC 2017
This commit removes what remains of IncomingHandlerInterface. The
remaining function pointers were pointing to RedChannel vfuncs. We can
dereference these directly rather than going through a 2nd layer of
indirection.
---
server/red-channel-client-private.h | 1 -
server/red-channel-client.c | 60 +++++++++++++++++++++----------------
server/red-channel.c | 11 -------
server/red-channel.h | 11 -------
4 files changed, 35 insertions(+), 48 deletions(-)
diff --git a/server/red-channel-client-private.h b/server/red-channel-client-private.h
index 5d29f32..77766d0 100644
--- a/server/red-channel-client-private.h
+++ b/server/red-channel-client-private.h
@@ -50,7 +50,6 @@ typedef struct OutgoingHandler {
} OutgoingHandler;
typedef struct IncomingHandler {
- IncomingHandlerInterface *cb;
void *opaque;
uint8_t header_buf[MAX_HEADER_SIZE];
SpiceDataHeaderOpaque header;
diff --git a/server/red-channel-client.c b/server/red-channel-client.c
index e93ef4b..968d5cd 100644
--- a/server/red-channel-client.c
+++ b/server/red-channel-client.c
@@ -269,8 +269,6 @@ static void red_channel_client_constructed(GObject *object)
RedChannelClient *self = RED_CHANNEL_CLIENT(object);
self->priv->incoming.opaque = self;
- self->priv->incoming.cb = red_channel_get_incoming_handler(self->priv->channel);
-
self->priv->outgoing.opaque = self;
self->priv->outgoing.pos = 0;
self->priv->outgoing.size = 0;
@@ -1113,6 +1111,37 @@ static int red_peer_receive(RedsStream *stream, uint8_t *buf, uint32_t size)
return pos - buf;
}
+static int red_channel_client_parse(RedChannelClient *client, uint8_t *msg,
+ uint32_t msg_size, uint16_t msg_type)
+{
+ RedChannel *channel = red_channel_client_get_channel(client);
+ RedChannelClass *klass = RED_CHANNEL_GET_CLASS(channel);
+ int ret_handle;
+
+ if (klass->parser) {
+ uint8_t *parsed;
+ size_t parsed_size;
+ message_destructor_t parsed_free;
+
+ parsed = klass->parser(msg, msg + msg_size, msg_type,
+ SPICE_VERSION_MINOR, &parsed_size, &parsed_free);
+ if (parsed == NULL) {
+ spice_printerr("failed to parse message type %d", msg_type);
+ red_channel_client_release_msg_buf(client, msg_type, msg_size, msg);
+ /* FIXME: handle disconnection in caller */
+ red_channel_client_disconnect(client);
+ return -1;
+ }
+ ret_handle = klass->handle_parsed(client, parsed_size,
+ msg_type, parsed);
+ parsed_free(parsed);
+ } else {
+ ret_handle = klass->handle_message(client, msg_type, msg_size, msg);
+ }
+
+ return ret_handle;
+}
+
// TODO: this implementation, as opposed to the old implementation in red_worker,
// does many calls to red_peer_receive and through it cb_read, and thus avoids pointer
// arithmetic for the case where a single cb_read could return multiple messages. But
@@ -1179,29 +1208,10 @@ static void red_peer_handle_incoming(RedsStream *stream, IncomingHandler *handle
}
}
- if (handler->cb->parser) {
- uint8_t *parsed;
- size_t parsed_size;
- message_destructor_t parsed_free;
-
- parsed = handler->cb->parser(handler->msg,
- handler->msg + msg_size, msg_type,
- SPICE_VERSION_MINOR, &parsed_size, &parsed_free);
- if (parsed == NULL) {
- spice_printerr("failed to parse message type %d", msg_type);
- red_channel_client_release_msg_buf(handler->opaque,
- msg_type, msg_size,
- handler->msg);
- /* FIXME: handle disconnection in caller */
- red_channel_client_disconnect(handler->opaque);
- return;
- }
- ret_handle = handler->cb->handle_parsed(handler->opaque, parsed_size,
- msg_type, parsed);
- parsed_free(parsed);
- } else {
- ret_handle = handler->cb->handle_message(handler->opaque, msg_type, msg_size,
- handler->msg);
+ ret_handle = red_channel_client_parse(handler->opaque, handler->msg,
+ msg_size, msg_type);
+ if (ret_handle == -1) {
+ return;
}
handler->msg_pos = 0;
red_channel_client_release_msg_buf(handler->opaque,
diff --git a/server/red-channel.c b/server/red-channel.c
index 0c809b6..0f73c7e 100644
--- a/server/red-channel.c
+++ b/server/red-channel.c
@@ -91,8 +91,6 @@ struct RedChannelPrivate
RedChannelCapabilities local_caps;
uint32_t migration_flags;
- IncomingHandlerInterface incoming_cb;
-
ClientCbs client_cbs;
// TODO: when different channel_clients are in different threads
// from Channel -> need to protect!
@@ -218,10 +216,6 @@ red_channel_constructed(GObject *object)
klass->alloc_recv_buf && klass->release_recv_buf);
spice_assert(klass->handle_migrate_data ||
!(self->priv->migration_flags & SPICE_MIGRATE_NEED_DATA_TRANSFER));
-
- self->priv->incoming_cb.handle_message = (handle_message_proc)klass->handle_message;
- self->priv->incoming_cb.handle_parsed = (handle_parsed_proc)klass->handle_parsed;
- self->priv->incoming_cb.parser = klass->parser;
}
static void red_channel_client_default_connect(RedChannel *channel, RedClient *client,
@@ -761,11 +755,6 @@ void red_channel_send_item(RedChannel *self, RedChannelClient *rcc, RedPipeItem
klass->send_item(rcc, item);
}
-IncomingHandlerInterface* red_channel_get_incoming_handler(RedChannel *self)
-{
- return &self->priv->incoming_cb;
-}
-
void red_channel_reset_thread_id(RedChannel *self)
{
self->priv->thread_id = pthread_self();
diff --git a/server/red-channel.h b/server/red-channel.h
index e7c1e1f..0385595 100644
--- a/server/red-channel.h
+++ b/server/red-channel.h
@@ -68,13 +68,6 @@ typedef void (*release_msg_recv_buf_proc)(void *opaque,
typedef void (*on_incoming_error_proc)(void *opaque);
typedef void (*on_input_proc)(void *opaque, int n);
-typedef struct IncomingHandlerInterface {
- handle_message_proc handle_message;
- // The following is an optional alternative to handle_message, used if not null
- spice_parse_channel_func_t parser;
- handle_parsed_proc handle_parsed;
-} IncomingHandlerInterface;
-
typedef struct RedChannel RedChannel;
typedef struct RedChannelClient RedChannelClient;
typedef struct RedClient RedClient;
@@ -283,10 +276,6 @@ void red_channel_send_item(RedChannel *self, RedChannelClient *rcc, RedPipeItem
void red_channel_reset_thread_id(RedChannel *self);
StatNodeRef red_channel_get_stat_node(RedChannel *channel);
-/* FIXME: does this even need to be in RedChannel? It's really only used in
- * RedChannelClient. Needs refactoring */
-IncomingHandlerInterface* red_channel_get_incoming_handler(RedChannel *self);
-
const RedChannelCapabilities* red_channel_get_local_capabilities(RedChannel *self);
/*
--
2.9.3
More information about the Spice-devel
mailing list