[Spice-devel] [PATCH spice-gtk 3/3] RFC: channel: use class private handlers field
Fabiano Fidencio
ffidenci at redhat.com
Mon Jun 8 08:27:42 PDT 2015
----- Original Message -----
> From: "Marc-André Lureau" <marcandre.lureau at redhat.com>
> To: spice-devel at lists.freedesktop.org
> Sent: Friday, June 5, 2015 6:29:44 PM
> Subject: [Spice-devel] [PATCH spice-gtk 3/3] RFC: channel: use class private handlers field
>
> Since spice-gtk requires glib 2.28, we can now fix a small FIXME.
>
> Since G_TYPE_CLASS_GET_PRIVATE is a bit expensive, it's still worth to
> cache it in klass->priv. However, there is no good place I can think of
> to put this. (channel_class_init() is called only once, and not per
> each subclass)
> ---
> src/channel-base.c | 16 +++++++++-------
> src/spice-channel-priv.h | 5 +++++
> src/spice-channel.c | 7 ++++---
> src/spice-channel.h | 4 +++-
> 4 files changed, 21 insertions(+), 11 deletions(-)
>
> diff --git a/src/channel-base.c b/src/channel-base.c
> index 77d339c..13e4ced 100644
> --- a/src/channel-base.c
> +++ b/src/channel-base.c
> @@ -197,7 +197,7 @@ end:
> }
>
>
> -static void set_handlers(SpiceChannelClass *klass,
> +static void set_handlers(SpiceChannelClassPrivate *klass,
> const spice_msg_handler* handlers, const int n)
> {
> int i;
> @@ -209,7 +209,7 @@ static void set_handlers(SpiceChannelClass *klass,
> }
> }
>
> -static void spice_channel_add_base_handlers(SpiceChannelClass *klass)
> +static void spice_channel_add_base_handlers(SpiceChannelClassPrivate *klass)
> {
> static const spice_msg_handler handlers[] = {
> [ SPICE_MSG_SET_ACK ] =
> spice_channel_handle_set_ack,
> @@ -227,12 +227,14 @@ G_GNUC_INTERNAL
> void spice_channel_set_handlers(SpiceChannelClass *klass,
> const spice_msg_handler* handlers, const int
> n)
> {
> - /* FIXME: use class private (requires glib 2.24) */
> - g_return_if_fail(klass->handlers == NULL);
> - klass->handlers = g_array_sized_new(FALSE, TRUE,
> sizeof(spice_msg_handler), n);
> + klass->priv =
> + G_TYPE_CLASS_GET_PRIVATE (klass, spice_channel_get_type (),
> SpiceChannelClassPrivate);
>
> - spice_channel_add_base_handlers(klass);
> - set_handlers(klass, handlers, n);
> + g_return_if_fail(klass->priv->handlers == NULL);
> + klass->priv->handlers = g_array_sized_new(FALSE, TRUE,
> sizeof(spice_msg_handler), n);
> +
> + spice_channel_add_base_handlers(klass->priv);
> + set_handlers(klass->priv, handlers, n);
> }
>
> static void
> diff --git a/src/spice-channel-priv.h b/src/spice-channel-priv.h
> index d70cf86..436a521 100644
> --- a/src/spice-channel-priv.h
> +++ b/src/spice-channel-priv.h
> @@ -74,6 +74,11 @@ enum spice_channel_state {
> SPICE_CHANNEL_STATE_MIGRATION_HANDSHAKE,
> };
>
> +struct _SpiceChannelClassPrivate
> +{
> + GArray *handlers;
> +};
> +
> struct _SpiceChannelPrivate {
> /* swapped on migration */
> SSL_CTX *ctx;
> diff --git a/src/spice-channel.c b/src/spice-channel.c
> index 4e7d8b7..0585a01 100644
> --- a/src/spice-channel.c
> +++ b/src/spice-channel.c
> @@ -76,7 +76,8 @@ static gboolean channel_connect(SpiceChannel *channel,
> gboolean tls);
> #define SPICE_CHANNEL_GET_PRIVATE(obj) \
> (G_TYPE_INSTANCE_GET_PRIVATE ((obj), SPICE_TYPE_CHANNEL,
> SpiceChannelPrivate))
>
> -G_DEFINE_TYPE(SpiceChannel, spice_channel, G_TYPE_OBJECT);
> +G_DEFINE_TYPE_WITH_CODE (SpiceChannel, spice_channel, G_TYPE_OBJECT,
> + g_type_add_class_private (g_define_type_id, sizeof
> (SpiceChannelClassPrivate)));
>
> /* Properties */
> enum {
> @@ -2848,11 +2849,11 @@ static void spice_channel_handle_msg(SpiceChannel
> *channel, SpiceMsgIn *msg)
> int type = spice_msg_in_type(msg);
> spice_msg_handler handler;
>
> - g_return_if_fail(type < klass->handlers->len);
> + g_return_if_fail(type < klass->priv->handlers->len);
> if (type > SPICE_MSG_BASE_LAST && channel->priv->disable_channel_msg)
> return;
>
> - handler = g_array_index(klass->handlers, spice_msg_handler, type);
> + handler = g_array_index(klass->priv->handlers, spice_msg_handler, type);
> g_return_if_fail(handler != NULL);
> handler(channel, msg);
> }
> diff --git a/src/spice-channel.h b/src/spice-channel.h
> index 7f132f6..e0ce443 100644
> --- a/src/spice-channel.h
> +++ b/src/spice-channel.h
> @@ -68,6 +68,8 @@ struct _SpiceChannel
> /* Do not add fields to this struct */
> };
>
> +typedef struct _SpiceChannelClassPrivate SpiceChannelClassPrivate;
> +
> struct _SpiceChannelClass
> {
> GObjectClass parent_class;
> @@ -94,7 +96,7 @@ struct _SpiceChannelClass
> /* virtual methods, coroutine context */
> void (*channel_send_migration_handshake)(SpiceChannel *channel);
>
> - GArray *handlers;
> + SpiceChannelClassPrivate *priv;
> /*
> * If adding fields to this struct, remove corresponding
> * amount of padding to avoid changing overall struct size
> --
> 2.4.2
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
Looks good to me, but I didn't test the patch.
Consider it as an ACK if you have it tested.
More information about the Spice-devel
mailing list