[Spice-devel] [PATCH 05/11] make red_pipe_item_init_full more typesafe
Jonathon Jongsma
jjongsma at redhat.com
Fri May 20 20:33:08 UTC 2016
Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
On Fri, 2016-05-20 at 14:01 +0100, Frediano Ziglio wrote:
> Use a proper type for free callback
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> server/cursor-channel.c | 10 ++++++----
> server/dcc.c | 8 +++++---
> server/main-channel.c | 10 ++++++----
> server/red-channel.c | 6 ++++--
> server/red-pipe-item.c | 4 ++--
> server/red-pipe-item.h | 10 +++++++---
> server/reds.c | 8 +++++---
> server/smartcard.c | 5 +++--
> server/stream.c | 15 +++++++++------
> 9 files changed, 47 insertions(+), 29 deletions(-)
>
> diff --git a/server/cursor-channel.c b/server/cursor-channel.c
> index 949cbc4..c257654 100644
> --- a/server/cursor-channel.c
> +++ b/server/cursor-channel.c
> @@ -81,7 +81,7 @@ struct CursorChannelClient {
> #include "cache-item.tmpl.c"
> #undef CLIENT_CURSOR_CACHE
>
> -static void cursor_pipe_item_free(RedCursorPipeItem *pipe_item);
> +static red_pipe_item_free_t cursor_pipe_item_free;
>
> static CursorItem *cursor_item_new(QXLInstance *qxl, RedCursorCmd *cmd)
> {
> @@ -138,7 +138,7 @@ static RedPipeItem *new_cursor_pipe_item(RedChannelClient
> *rcc, void *data, int
> RedCursorPipeItem *item = spice_malloc0(sizeof(RedCursorPipeItem));
>
> red_pipe_item_init_full(&item->base, RED_PIPE_ITEM_TYPE_CURSOR,
> - (GDestroyNotify)cursor_pipe_item_free);
> + cursor_pipe_item_free);
> item->cursor_item = data;
> item->cursor_item->refs++;
> return &item->base;
> @@ -204,9 +204,11 @@ void cursor_channel_disconnect(CursorChannel
> *cursor_channel)
> }
>
>
> -static void cursor_pipe_item_free(RedCursorPipeItem *pipe_item)
> +static void cursor_pipe_item_free(RedPipeItem *base)
> {
> - spice_return_if_fail(pipe_item);
> + spice_return_if_fail(base);
> +
> + RedCursorPipeItem *pipe_item = SPICE_CONTAINEROF(base, RedCursorPipeItem,
> base);
>
> spice_assert(!red_pipe_item_is_linked(&pipe_item->base));
>
> diff --git a/server/dcc.c b/server/dcc.c
> index b9e4eb3..33357cd 100644
> --- a/server/dcc.c
> +++ b/server/dcc.c
> @@ -306,7 +306,7 @@ static RedDrawablePipeItem
> *red_drawable_pipe_item_new(DisplayChannelClient *dcc
> ring_item_init(&dpi->base);
> ring_add(&drawable->pipes, &dpi->base);
> red_pipe_item_init_full(&dpi->dpi_pipe_item, RED_PIPE_ITEM_TYPE_DRAW,
> - (GDestroyNotify)red_drawable_pipe_item_free);
> + red_drawable_pipe_item_free);
> drawable->refs++;
> return dpi;
> }
> @@ -517,8 +517,10 @@ void dcc_stream_agent_clip(DisplayChannelClient* dcc,
> StreamAgent *agent)
> red_channel_client_pipe_add(RED_CHANNEL_CLIENT(dcc), (RedPipeItem
> *)item);
> }
>
> -static void red_monitors_config_item_free(RedMonitorsConfigItem *item)
> +static void red_monitors_config_item_free(RedPipeItem *base)
> {
> + RedMonitorsConfigItem *item = SPICE_CONTAINEROF(base,
> RedMonitorsConfigItem, pipe_item);
> +
> monitors_config_unref(item->monitors_config);
> free(item);
> }
> @@ -532,7 +534,7 @@ static RedMonitorsConfigItem
> *red_monitors_config_item_new(RedChannel* channel,
> mci->monitors_config = monitors_config;
>
> red_pipe_item_init_full(&mci->pipe_item,
> RED_PIPE_ITEM_TYPE_MONITORS_CONFIG,
> - (GDestroyNotify)red_monitors_config_item_free);
> + red_monitors_config_item_free);
> return mci;
> }
>
> diff --git a/server/main-channel.c b/server/main-channel.c
> index 70aaff7..e89af97 100644
> --- a/server/main-channel.c
> +++ b/server/main-channel.c
> @@ -247,8 +247,9 @@ static RedPipeItem
> *main_agent_tokens_item_new(RedChannelClient *rcc, uint32_t n
> return &item->base;
> }
>
> -static void main_agent_data_item_free(RedAgentDataPipeItem *item)
> +static void main_agent_data_item_free(RedPipeItem *base)
> {
> + RedAgentDataPipeItem *item = SPICE_CONTAINEROF(base,
> RedAgentDataPipeItem, base);
> item->free_data(item->data, item->opaque);
> free(item);
> }
> @@ -260,7 +261,7 @@ static RedPipeItem
> *main_agent_data_item_new(RedChannelClient *rcc, uint8_t* dat
> RedAgentDataPipeItem *item = spice_malloc(sizeof(RedAgentDataPipeItem));
>
> red_pipe_item_init_full(&item->base, RED_PIPE_ITEM_TYPE_MAIN_AGENT_DATA,
> - (GDestroyNotify)main_agent_data_item_free);
> + main_agent_data_item_free);
> item->data = data;
> item->len = len;
> item->free_data = free_data;
> @@ -306,8 +307,9 @@ static RedPipeItem *main_uuid_item_new(MainChannelClient
> *mcc, const uint8_t uui
> return &item->base;
> }
>
> -static void main_notify_item_free(RedNotifyPipeItem *data)
> +static void main_notify_item_free(RedPipeItem *base)
> {
> + RedNotifyPipeItem *data = SPICE_CONTAINEROF(base, RedNotifyPipeItem,
> base);
> free(data->msg);
> free(data);
> }
> @@ -318,7 +320,7 @@ static RedPipeItem *main_notify_item_new(RedChannelClient
> *rcc, void *data, int
> const char *msg = data;
>
> red_pipe_item_init_full(&item->base, RED_PIPE_ITEM_TYPE_MAIN_NOTIFY,
> - (GDestroyNotify)main_notify_item_free);
> + main_notify_item_free);
> item->msg = spice_strdup(msg);
> return &item->base;
> }
> diff --git a/server/red-channel.c b/server/red-channel.c
> index c0a9501..c422afd 100644
> --- a/server/red-channel.c
> +++ b/server/red-channel.c
> @@ -2365,8 +2365,10 @@ int
> red_channel_client_wait_outgoing_item(RedChannelClient *rcc,
> }
> }
>
> -static void marker_pipe_item_free(MarkerPipeItem *item)
> +static void marker_pipe_item_free(RedPipeItem *base)
> {
> + MarkerPipeItem *item = SPICE_CONTAINEROF(base, MarkerPipeItem, base);
> +
> if (item->item_in_pipe) {
> *item->item_in_pipe = FALSE;
> }
> @@ -2392,7 +2394,7 @@ int
> red_channel_client_wait_pipe_item_sent(RedChannelClient *rcc,
> MarkerPipeItem *mark_item = spice_new0(MarkerPipeItem, 1);
>
> red_pipe_item_init_full(&mark_item->base, RED_PIPE_ITEM_TYPE_MARKER,
> - (GDestroyNotify)marker_pipe_item_free);
> + marker_pipe_item_free);
> item_in_pipe = TRUE;
> mark_item->item_in_pipe = &item_in_pipe;
> red_channel_client_pipe_add_after(rcc, &mark_item->base, item);
> diff --git a/server/red-pipe-item.c b/server/red-pipe-item.c
> index d9c60aa..cc0ab5a 100644
> --- a/server/red-pipe-item.c
> +++ b/server/red-pipe-item.c
> @@ -44,10 +44,10 @@ void red_pipe_item_unref(gpointer object)
>
> void red_pipe_item_init_full(RedPipeItem *item,
> gint type,
> - GDestroyNotify free_func)
> + red_pipe_item_free_t *free_func)
> {
> ring_item_init(&item->link);
> item->type = type;
> item->refcount = 1;
> - item->free_func = free_func ? free_func : (GDestroyNotify)free;
> + item->free_func = free_func ? free_func : (red_pipe_item_free_t *)free;
> }
> diff --git a/server/red-pipe-item.h b/server/red-pipe-item.h
> index 0ff4852..4b3d892 100644
> --- a/server/red-pipe-item.h
> +++ b/server/red-pipe-item.h
> @@ -21,17 +21,21 @@
> #include <glib.h>
> #include <common/ring.h>
>
> -typedef struct {
> +struct RedPipeItem;
> +
> +typedef void red_pipe_item_free_t(struct RedPipeItem *item);
> +
> +typedef struct RedPipeItem {
> RingItem link;
> int type;
>
> /* private */
> int refcount;
>
> - GDestroyNotify free_func;
> + red_pipe_item_free_t *free_func;
> } RedPipeItem;
>
> -void red_pipe_item_init_full(RedPipeItem *item, int type, GDestroyNotify
> free_func);
> +void red_pipe_item_init_full(RedPipeItem *item, int type,
> red_pipe_item_free_t free_func);
> RedPipeItem *red_pipe_item_ref(gpointer item);
> void red_pipe_item_unref(gpointer item);
>
> diff --git a/server/reds.c b/server/reds.c
> index a1e589a..8a903b7 100644
> --- a/server/reds.c
> +++ b/server/reds.c
> @@ -303,7 +303,7 @@ static uint32_t reds_qxl_ram_size(RedsState *reds);
> static int calc_compression_level(RedsState *reds);
>
> static RedVDIReadBuf *vdi_port_get_read_buf(RedCharDeviceVDIPort *dev);
> -static void vdi_port_read_buf_free(RedVDIReadBuf *buf);
> +static red_pipe_item_free_t vdi_port_read_buf_free;
>
> static ChannelSecurityOptions *reds_find_channel_security(RedsState *reds,
> int id)
> {
> @@ -790,7 +790,7 @@ static void vdi_read_buf_init(RedVDIReadBuf *buf)
> * from the base class and are not going to use the type
> */
> red_pipe_item_init_full(&buf->parent, -1,
> - (GDestroyNotify)vdi_port_read_buf_free);
> + vdi_port_read_buf_free);
> }
>
> static RedVDIReadBuf *vdi_port_get_read_buf(RedCharDeviceVDIPort *dev)
> @@ -811,8 +811,10 @@ static RedVDIReadBuf
> *vdi_port_get_read_buf(RedCharDeviceVDIPort *dev)
> return buf;
> }
>
> -static void vdi_port_read_buf_free(RedVDIReadBuf *buf)
> +static void vdi_port_read_buf_free(RedPipeItem *base)
> {
> + RedVDIReadBuf *buf = SPICE_CONTAINEROF(base, RedVDIReadBuf, parent);
> +
> g_warn_if_fail(buf->parent.refcount == 0);
> ring_add(&buf->dev->priv->read_bufs, (RingItem *)buf);
>
> diff --git a/server/smartcard.c b/server/smartcard.c
> index c39aeae..2acddcf 100644
> --- a/server/smartcard.c
> +++ b/server/smartcard.c
> @@ -537,8 +537,9 @@ static void smartcard_push_error(RedChannelClient *rcc,
> uint32_t reader_id, VSCE
> smartcard_channel_client_pipe_add_push(rcc, &error_item->base);
> }
>
> -static void smartcard_free_vsc_msg_item(RedMsgItem *item)
> +static void smartcard_free_vsc_msg_item(RedPipeItem *base)
> {
> + RedMsgItem *item = SPICE_CONTAINEROF(base, RedMsgItem, base);
> free(item->vheader);
> free(item);
> }
> @@ -549,7 +550,7 @@ static RedMsgItem
> *smartcard_get_vsc_msg_item(RedChannelClient *rcc,
> RedMsgItem *msg_item = spice_new0(RedMsgItem, 1);
>
> red_pipe_item_init_full(&msg_item->base,
> RED_PIPE_ITEM_TYPE_SMARTCARD_DATA,
> - (GDestroyNotify)smartcard_free_vsc_msg_item);
> + smartcard_free_vsc_msg_item);
> msg_item->vheader = vheader;
> return msg_item;
> }
> diff --git a/server/stream.c b/server/stream.c
> index 4c733de..74df254 100644
> --- a/server/stream.c
> +++ b/server/stream.c
> @@ -76,7 +76,7 @@ static RedPipeItem
> *stream_create_destroy_item_new(StreamAgent *agent, gint type
> StreamCreateDestroyItem *item = spice_new0(StreamCreateDestroyItem, 1);
>
> red_pipe_item_init_full(&item->base, type,
> -
> (GDestroyNotify)stream_create_destroy_item_release);
> + stream_create_destroy_item_release);
> agent->stream->refs++;
> item->agent = agent;
> return &item->base;
> @@ -161,9 +161,10 @@ void stream_agent_unref(DisplayChannel *display,
> StreamAgent *agent)
> stream_unref(display, agent->stream);
> }
>
> -void red_stream_clip_item_free(RedStreamClipItem *item)
> +void red_stream_clip_item_free(RedPipeItem *base)
> {
> - g_return_if_fail(item != NULL);
> + g_return_if_fail(base != NULL);
> + RedStreamClipItem *item = SPICE_CONTAINEROF(base, RedStreamClipItem,
> base);
> DisplayChannel *display = DCC_TO_DC(item->stream_agent->dcc);
>
> g_return_if_fail(item->base.refcount == 0);
> @@ -177,7 +178,7 @@ RedStreamClipItem *red_stream_clip_item_new(StreamAgent
> *agent)
> {
> RedStreamClipItem *item = spice_new(RedStreamClipItem, 1);
> red_pipe_item_init_full((RedPipeItem *)item,
> RED_PIPE_ITEM_TYPE_STREAM_CLIP,
> - (GDestroyNotify)red_stream_clip_item_free);
> + red_stream_clip_item_free);
>
> item->stream_agent = agent;
> agent->stream->refs++;
> @@ -785,8 +786,10 @@ void stream_agent_stop(StreamAgent *agent)
> }
> }
>
> -static void red_upgrade_item_free(RedUpgradeItem *item)
> +static void red_upgrade_item_free(RedPipeItem *base)
> {
> + RedUpgradeItem *item = SPICE_CONTAINEROF(base, RedUpgradeItem, base);
> +
> g_return_if_fail(item != NULL);
> g_return_if_fail(item->base.refcount == 0);
>
> @@ -836,7 +839,7 @@ static void
> dcc_detach_stream_gracefully(DisplayChannelClient *dcc,
> rcc = RED_CHANNEL_CLIENT(dcc);
> upgrade_item = spice_new(RedUpgradeItem, 1);
> red_pipe_item_init_full(&upgrade_item->base,
> RED_PIPE_ITEM_TYPE_UPGRADE,
> - (GDestroyNotify)red_upgrade_item_free);
> + red_upgrade_item_free);
> upgrade_item->drawable = stream->current;
> upgrade_item->drawable->refs++;
> n_rects = pixman_region32_n_rects(&upgrade_item->drawable
> ->tree_item.base.rgn);
More information about the Spice-devel
mailing list