[Spice-devel] [spice-server v2 07/14] channel: Remove IncomingHandlerInterface

Frediano Ziglio fziglio at redhat.com
Tue Feb 14 15:04:26 UTC 2017


> 
> This commit removes what remains of IncomingHandlerInterface. The
> remaining function pointers were pointing to RedChannel vfuncs.
> Moreover the IncomingHandlerInterface abstraction is unused, ie the
> codebase only has a single implementation for it, so we can directly
> call the relevant methods and make them static instead.
> 
> Signed-off-by: Christophe Fergeau <cfergeau at redhat.com>
> ---
>  server/red-channel-client-private.h |  1 -
>  server/red-channel-client.c         | 21 ++++++++++++---------
>  server/red-channel.c                | 10 ----------
>  server/red-channel.h                | 13 -------------
>  4 files changed, 12 insertions(+), 33 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 fc82faa..1e071cc 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;
> @@ -1103,15 +1101,17 @@ static int red_peer_receive(RedsStream *stream,
> uint8_t *buf, uint32_t size)
>      return pos - buf;
>  }
>  
> -static uint8_t *red_channel_client_parse(IncomingHandler *handler, uint8_t
> *message, size_t message_size,
> +static uint8_t *red_channel_client_parse(RedChannelClient *rcc, uint8_t
> *message, size_t message_size,
>                                           uint16_t message_type,
>                                           size_t *size_out,
>                                           message_destructor_t
>                                           *free_message)
>  {
> +    RedChannel *channel = red_channel_client_get_channel(rcc);
> +    RedChannelClass *klass = RED_CHANNEL_GET_CLASS(channel);
>      uint8_t *parsed_message;
>  
> -    if (handler->cb->parser) {
> -        parsed_message = handler->cb->parser(message, message +
> message_size, message_type,
> -                                             SPICE_VERSION_MINOR, size_out,
> free_message);
> +    if (klass->parser) {
> +        parsed_message = klass->parser(message, message + message_size,
> message_type,
> +                                       SPICE_VERSION_MINOR, size_out,
> free_message);
>      } else {
>          parsed_message = message;
>          *size_out = message_size;
> @@ -1142,6 +1142,9 @@ static void red_peer_handle_incoming(RedsStream
> *stream, IncomingHandler *handle
>          uint8_t *parsed;
>          size_t parsed_size;
>          message_destructor_t parsed_free = NULL;
> +        RedChannel *channel =
> red_channel_client_get_channel(handler->opaque);
> +        RedChannelClass *klass = RED_CHANNEL_GET_CLASS(channel);
> +
>          if (handler->header_pos < handler->header.header_size) {
>              bytes_read = red_peer_receive(stream,
>                                            handler->header.data +
>                                            handler->header_pos,
> @@ -1186,7 +1189,7 @@ static void red_peer_handle_incoming(RedsStream
> *stream, IncomingHandler *handle
>              }
>          }
>  
> -        parsed = red_channel_client_parse(handler,
> +        parsed = red_channel_client_parse(handler->opaque,
>                                            handler->msg, msg_size,
>                                            msg_type,
>                                            &parsed_size, &parsed_free);
> @@ -1198,8 +1201,8 @@ static void red_peer_handle_incoming(RedsStream
> *stream, IncomingHandler *handle
>              red_channel_client_disconnect(handler->opaque);
>              return;
>          }
> -        ret_handle = handler->cb->handle_message(handler->opaque, msg_type,
> -                                                 parsed_size, parsed);
> +        ret_handle = klass->handle_message(handler->opaque, msg_type,
> +                                           parsed_size, parsed);
>          if (parsed_free != NULL) {
>              parsed_free(parsed);
>          }
> diff --git a/server/red-channel.c b/server/red-channel.c
> index f7cf589..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,9 +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.parser = klass->parser;
>  }
>  
>  static void red_channel_client_default_connect(RedChannel *channel,
>  RedClient *client,
> @@ -760,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 25ae1a2..80910e3 100644
> --- a/server/red-channel.h
> +++ b/server/red-channel.h
> @@ -59,15 +59,6 @@ struct SpiceDataHeaderOpaque {
>      get_msg_size_proc get_msg_size;
>  };
>  
> -typedef int (*handle_message_proc)(void *opaque,
> -                                   uint16_t type, uint32_t size, uint8_t
> *msg);
> -
> -typedef struct IncomingHandlerInterface {
> -    // 'parser' is optional and will not be used if NULL
> -    spice_parse_channel_func_t parser;
> -    handle_message_proc handle_message;
> -} IncomingHandlerInterface;
> -
>  typedef struct RedChannel RedChannel;
>  typedef struct RedChannelClient RedChannelClient;
>  typedef struct RedClient RedClient;
> @@ -275,10 +266,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);
>  
>  /*

Acked-by: Frediano Ziglio <fziglio at redhat.com>

Frediano


More information about the Spice-devel mailing list