> > It's only used by these callbacks, moving it there makes things clearer > about its intended use. > --- > server/inputs-channel.c | 5 +++-- > server/main-channel.c | 2 +- > server/red-channel.c | 24 +++++++++++++++++------- > server/red-channel.h | 9 ++++----- > server/red-qxl.c | 25 ++++++++++++------------- > server/reds.c | 23 ++++++++++++++++------- > server/smartcard.c | 2 +- > server/sound.c | 26 +++++++++++++------------- > server/spicevmc.c | 2 +- > 9 files changed, 68 insertions(+), 50 deletions(-) > > diff --git a/server/inputs-channel.c b/server/inputs-channel.c > index 45e0a8f..4443825 100644 > --- a/server/inputs-channel.c > +++ b/server/inputs-channel.c > @@ -531,7 +531,8 @@ static void > inputs_channel_hold_pipe_item(RedChannelClient *rcc, PipeItem *item) > static void inputs_connect(RedChannel *channel, RedClient *client, > RedsStream *stream, int migration, > int num_common_caps, uint32_t *common_caps, > - int num_caps, uint32_t *caps) > + int num_caps, uint32_t *caps, > + gpointer cbs_data) > { > InputsChannelClient *icc; > > @@ -555,7 +556,7 @@ static void inputs_connect(RedChannel *channel, RedClient > *client, > inputs_pipe_add_init(&icc->base); > } > > -static void inputs_migrate(RedChannelClient *rcc) > +static void inputs_migrate(RedChannelClient *rcc, gpointer cbs_data) > { > InputsChannel *inputs = SPICE_CONTAINEROF(rcc->channel, InputsChannel, > base); > inputs->src_during_migrate = TRUE; > diff --git a/server/main-channel.c b/server/main-channel.c > index a9d0ce1..baa2033 100644 > --- a/server/main-channel.c > +++ b/server/main-channel.c > @@ -1148,7 +1148,7 @@ uint64_t > main_channel_client_get_roundtrip_ms(MainChannelClient *mcc) > return mcc->latency / 1000; > } > > -static void main_channel_client_migrate(RedChannelClient *rcc) > +static void main_channel_client_migrate(RedChannelClient *rcc, gpointer > cbs_data) > { > reds_on_main_channel_migrate(rcc->channel->reds, SPICE_CONTAINEROF(rcc, > MainChannelClient, base)); > red_channel_client_default_migrate(rcc); > diff --git a/server/red-channel.c b/server/red-channel.c > index d8f1d27..8c4d0ba 100644 > --- a/server/red-channel.c > +++ b/server/red-channel.c > @@ -992,12 +992,12 @@ static void > red_channel_client_default_connect(RedChannel *channel, RedClient *c > RedsStream *stream, > int migration, > int num_common_caps, uint32_t > *common_caps, > - int num_caps, uint32_t *caps) > + int num_caps, uint32_t *caps, > gpointer cbs_data) > { > spice_error("not implemented"); > } > > -static void red_channel_client_default_disconnect(RedChannelClient *base) > +static void red_channel_client_default_disconnect(RedChannelClient *base, > gpointer cbs_data) > { > red_channel_client_disconnect(base); > } > @@ -1062,7 +1062,7 @@ RedChannel *red_channel_create(int size, > > client_cbs.connect = red_channel_client_default_connect; > client_cbs.disconnect = red_channel_client_default_disconnect; > - client_cbs.migrate = red_channel_client_default_migrate; > + client_cbs.migrate = > (channel_client_migrate_proc)red_channel_client_default_migrate; > I don't like these kind of cast. Why don't you add a parameter (unused) to these functions? > red_channel_register_client_cbs(channel, &client_cbs, NULL); > red_channel_set_common_cap(channel, SPICE_COMMON_CAP_MINI_HEADER); > @@ -1113,7 +1113,7 @@ RedChannel *red_channel_create_dummy(int size, > RedsState *reds, uint32_t type, u > ring_init(&channel->clients); > client_cbs.connect = red_channel_client_default_connect; > client_cbs.disconnect = red_channel_client_default_disconnect; > - client_cbs.migrate = red_channel_client_default_migrate; > + client_cbs.migrate = > (channel_client_migrate_proc)red_channel_client_default_migrate; > > red_channel_register_client_cbs(channel, &client_cbs, NULL); > red_channel_set_common_cap(channel, SPICE_COMMON_CAP_MINI_HEADER); > @@ -1183,7 +1183,7 @@ void red_channel_register_client_cbs(RedChannel > *channel, const ClientCbs *clien > if (client_cbs->migrate) { > channel->client_cbs.migrate = client_cbs->migrate; > } > - channel->data = cbs_data; > + channel->client_cbs.cbs_data = cbs_data; > } > > int test_capability(const uint32_t *caps, int num_caps, uint32_t cap) > @@ -2106,6 +2106,16 @@ void red_client_set_migration_seamless(RedClient > *client) // dest > pthread_mutex_unlock(&client->lock); > } > > +static void red_channel_client_migrate_client(RedChannelClient *rcc) > +{ > + rcc->channel->client_cbs.migrate(rcc, > rcc->channel->client_cbs.cbs_data); > +} > + > +static void red_channel_client_disconnect_client(RedChannelClient *rcc) > +{ > + rcc->channel->client_cbs.disconnect(rcc, > rcc->channel->client_cbs.cbs_data); > +} > + > void red_client_migrate(RedClient *client) > { > RingItem *link, *next; > @@ -2121,7 +2131,7 @@ void red_client_migrate(RedClient *client) > RING_FOREACH_SAFE(link, next, &client->channels) { > rcc = SPICE_CONTAINEROF(link, RedChannelClient, client_link); > if (red_channel_client_is_connected(rcc)) { > - rcc->channel->client_cbs.migrate(rcc); > + red_channel_client_migrate_client(rcc); > } > } > } > @@ -2149,7 +2159,7 @@ void red_client_destroy(RedClient *client) > // to wait for disconnection) > // TODO: should we go back to async. For this we need to use > // ref count for channel clients. > - rcc->channel->client_cbs.disconnect(rcc); > + red_channel_client_disconnect_client(rcc); > spice_assert(ring_is_empty(&rcc->pipe)); > spice_assert(rcc->pipe_size == 0); > spice_assert(rcc->send_data.size == 0); > diff --git a/server/red-channel.h b/server/red-channel.h > index 26304bf..51d606e 100644 > --- a/server/red-channel.h > +++ b/server/red-channel.h > @@ -185,9 +185,9 @@ typedef uint64_t > (*channel_handle_migrate_data_get_serial_proc)(RedChannelClient > > typedef void (*channel_client_connect_proc)(RedChannel *channel, RedClient > *client, RedsStream *stream, > int migration, int > num_common_cap, uint32_t > *common_caps, > - int num_caps, uint32_t *caps); > -typedef void (*channel_client_disconnect_proc)(RedChannelClient *base); > -typedef void (*channel_client_migrate_proc)(RedChannelClient *base); > + int num_caps, uint32_t *caps, > gpointer cbs_data); > +typedef void (*channel_client_disconnect_proc)(RedChannelClient *base, > gpointer cbs_data); > +typedef void (*channel_client_migrate_proc)(RedChannelClient *base, gpointer > cbs_data); > > // TODO: add ASSERTS for thread_id in client and channel calls > // > @@ -217,6 +217,7 @@ typedef struct { > channel_client_connect_proc connect; > channel_client_disconnect_proc disconnect; > channel_client_migrate_proc migrate; > + gpointer cbs_data; > } ClientCbs; > > typedef struct RedChannelCapabilities { > @@ -335,8 +336,6 @@ struct RedChannel { > RedChannelCapabilities local_caps; > uint32_t migration_flags; > > - void *data; > - > // TODO: when different channel_clients are in different threads from > Channel -> need to protect! > pthread_t thread_id; > struct RedsState *reds; > diff --git a/server/red-qxl.c b/server/red-qxl.c > index ee3cab0..f720fd5 100644 > --- a/server/red-qxl.c > +++ b/server/red-qxl.c > @@ -75,13 +75,13 @@ static int red_qxl_check_qxl_version(QXLState *rq, int > major, int minor) > static void red_qxl_set_display_peer(RedChannel *channel, RedClient *client, > RedsStream *stream, int migration, > int num_common_caps, uint32_t > *common_caps, int num_caps, > - uint32_t *caps) > + uint32_t *caps, gpointer cbs_data) > { > RedWorkerMessageDisplayConnect payload = {0,}; > QXLState *qxl_state; > > spice_debug("%s", ""); > - qxl_state = (QXLState *)channel->data; > + qxl_state = (QXLState *)cbs_data; > payload.client = client; > payload.stream = stream; > payload.migration = migration; > @@ -98,7 +98,7 @@ static void red_qxl_set_display_peer(RedChannel *channel, > RedClient *client, > &payload); > } > > -static void red_qxl_disconnect_display_peer(RedChannelClient *rcc) > +static void red_qxl_disconnect_display_peer(RedChannelClient *rcc, gpointer > cbs_data) > { > RedWorkerMessageDisplayDisconnect payload; > QXLState *qxl_state; > @@ -107,8 +107,7 @@ static void > red_qxl_disconnect_display_peer(RedChannelClient *rcc) > return; > } > > - qxl_state = (QXLState *)rcc->channel->data; > - > + qxl_state = (QXLState *)cbs_data; > spice_printerr(""); > payload.rcc = rcc; > > @@ -119,14 +118,14 @@ static void > red_qxl_disconnect_display_peer(RedChannelClient *rcc) > &payload); > } > > -static void red_qxl_display_migrate(RedChannelClient *rcc) > +static void red_qxl_display_migrate(RedChannelClient *rcc, gpointer > cbs_data) > { > RedWorkerMessageDisplayMigrate payload; > QXLState *qxl_state; > if (!rcc->channel) { > return; > } > - qxl_state = (QXLState *)rcc->channel->data; > + qxl_state = (QXLState *)cbs_data; > spice_printerr("channel type %u id %u", rcc->channel->type, > rcc->channel->id); > payload.rcc = rcc; > dispatcher_send_message(&qxl_state->dispatcher, > @@ -137,10 +136,10 @@ static void red_qxl_display_migrate(RedChannelClient > *rcc) > static void red_qxl_set_cursor_peer(RedChannel *channel, RedClient *client, > RedsStream *stream, > int migration, int num_common_caps, > uint32_t *common_caps, int num_caps, > - uint32_t *caps) > + uint32_t *caps, gpointer cbs_data) > { > RedWorkerMessageCursorConnect payload = {0,}; > - QXLState *qxl_state = (QXLState *)channel->data; > + QXLState *qxl_state = (QXLState *)cbs_data; > spice_printerr(""); > payload.client = client; > payload.stream = stream; > @@ -158,7 +157,7 @@ static void red_qxl_set_cursor_peer(RedChannel *channel, > RedClient *client, Reds > &payload); > } > > -static void red_qxl_disconnect_cursor_peer(RedChannelClient *rcc) > +static void red_qxl_disconnect_cursor_peer(RedChannelClient *rcc, gpointer > cbs_data) > { > RedWorkerMessageCursorDisconnect payload; > QXLState *qxl_state; > @@ -167,7 +166,7 @@ static void > red_qxl_disconnect_cursor_peer(RedChannelClient *rcc) > return; > } > > - qxl_state = (QXLState *)rcc->channel->data; > + qxl_state = (QXLState *)cbs_data; > spice_printerr(""); > payload.rcc = rcc; > > @@ -176,7 +175,7 @@ static void > red_qxl_disconnect_cursor_peer(RedChannelClient *rcc) > &payload); > } > > -static void red_qxl_cursor_migrate(RedChannelClient *rcc) > +static void red_qxl_cursor_migrate(RedChannelClient *rcc, gpointer cbs_data) > { > RedWorkerMessageCursorMigrate payload; > QXLState *qxl_state; > @@ -184,7 +183,7 @@ static void red_qxl_cursor_migrate(RedChannelClient *rcc) > if (!rcc->channel) { > return; > } > - qxl_state = (QXLState *)rcc->channel->data; > + qxl_state = (QXLState *)cbs_data; > spice_printerr("channel type %u id %u", rcc->channel->type, > rcc->channel->id); > payload.rcc = rcc; > dispatcher_send_message(&qxl_state->dispatcher, > diff --git a/server/reds.c b/server/reds.c > index b1e1139..5d0a66e 100644 > --- a/server/reds.c > +++ b/server/reds.c > @@ -1730,6 +1730,15 @@ static void openssl_init(RedLinkInfo *link) > BN_set_word(link->tiTicketing.bn, f4); > } > > +static void red_channel_connect_client(RedChannel *channel, RedClient > *client, RedsStream *stream, > + int migration, int num_common_caps, > uint32_t *common_caps, > + int num_caps, uint32_t *caps) > +{ > + channel->client_cbs.connect(channel, client, stream, migration, > + num_common_caps, common_caps, num_caps, > caps, > + channel->client_cbs.cbs_data); > +} > + > static void reds_channel_do_link(RedChannel *channel, RedClient *client, > SpiceLinkMess *link_msg, > RedsStream *stream) > @@ -1741,13 +1750,13 @@ static void reds_channel_do_link(RedChannel *channel, > RedClient *client, > spice_assert(stream); > > caps = (uint32_t *)((uint8_t *)link_msg + link_msg->caps_offset); > - channel->client_cbs.connect(channel, client, stream, > - red_client_during_migrate_at_target(client), > - link_msg->num_common_caps, > - link_msg->num_common_caps ? caps : NULL, > - link_msg->num_channel_caps, > - link_msg->num_channel_caps ? > - caps + link_msg->num_common_caps : NULL); > + red_channel_connect_client(channel, client, stream, > + red_client_during_migrate_at_target(client), > + link_msg->num_common_caps, > + link_msg->num_common_caps ? caps : NULL, > + link_msg->num_channel_caps, > + link_msg->num_channel_caps ? > + caps + link_msg->num_common_caps : NULL); > } > > /* > diff --git a/server/smartcard.c b/server/smartcard.c > index 2b25bac..4d06784 100644 > --- a/server/smartcard.c > +++ b/server/smartcard.c > @@ -802,7 +802,7 @@ static void > smartcard_channel_hold_pipe_item(RedChannelClient *rcc, PipeItem *it > static void smartcard_connect_client(RedChannel *channel, RedClient *client, > RedsStream *stream, int migration, > int num_common_caps, uint32_t > *common_caps, > - int num_caps, uint32_t *caps) > + int num_caps, uint32_t *caps, gpointer > cbs_data) > { > SpiceCharDeviceInstance *char_device = > smartcard_readers_get_unattached(); > diff --git a/server/sound.c b/server/sound.c > index 82c14f7..672d23f 100644 > --- a/server/sound.c > +++ b/server/sound.c > @@ -987,13 +987,13 @@ error1: > return NULL; > } > > -static void snd_disconnect_channel_client(RedChannelClient *rcc) > +static void snd_disconnect_channel_client(RedChannelClient *rcc, gpointer > cbs_data) > { > SndWorker *worker; > > spice_assert(rcc->channel); > - spice_assert(rcc->channel->data); > - worker = (SndWorker *)rcc->channel->data; > + spice_assert(cbs_data); > + worker = (SndWorker *)cbs_data; > > spice_debug("channel-type=%d", rcc->channel->type); > if (worker->connection) { > @@ -1202,9 +1202,9 @@ static void snd_playback_cleanup(SndChannel *channel) > > static void snd_set_playback_peer(RedChannel *channel, RedClient *client, > RedsStream *stream, > int migration, int num_common_caps, > uint32_t *common_caps, > - int num_caps, uint32_t *caps) > + int num_caps, uint32_t *caps, gpointer > cbs_data) > { > - SndWorker *worker = channel->data; > + SndWorker *worker = cbs_data; > PlaybackChannel *playback_channel; > SpicePlaybackState *st = SPICE_CONTAINEROF(worker, SpicePlaybackState, > worker); > > @@ -1253,14 +1253,14 @@ static void snd_set_playback_peer(RedChannel > *channel, RedClient *client, RedsSt > snd_playback_send(worker->connection); > } > > -static void snd_record_migrate_channel_client(RedChannelClient *rcc) > +static void snd_record_migrate_channel_client(RedChannelClient *rcc, > gpointer cbs_data) > { > SndWorker *worker; > > spice_debug(NULL); > spice_assert(rcc->channel); > - spice_assert(rcc->channel->data); > - worker = (SndWorker *)rcc->channel->data; > + spice_assert(cbs_data); > + worker = (SndWorker *)cbs_data; > > if (worker->connection) { > spice_assert(worker->connection->channel_client == rcc); > @@ -1448,9 +1448,9 @@ static void snd_record_cleanup(SndChannel *channel) > > static void snd_set_record_peer(RedChannel *channel, RedClient *client, > RedsStream *stream, > int migration, int num_common_caps, uint32_t > *common_caps, > - int num_caps, uint32_t *caps) > + int num_caps, uint32_t *caps, gpointer > cbs_data) > { > - SndWorker *worker = channel->data; > + SndWorker *worker = cbs_data; > RecordChannel *record_channel; > SpiceRecordState *st = SPICE_CONTAINEROF(worker, SpiceRecordState, > worker); > > @@ -1482,13 +1482,13 @@ static void snd_set_record_peer(RedChannel *channel, > RedClient *client, RedsStre > snd_record_send(worker->connection); > } > > -static void snd_playback_migrate_channel_client(RedChannelClient *rcc) > +static void snd_playback_migrate_channel_client(RedChannelClient *rcc, > gpointer cbs_data) > { > SndWorker *worker; > > spice_assert(rcc->channel); > - spice_assert(rcc->channel->data); > - worker = (SndWorker *)rcc->channel->data; > + spice_assert(cbs_data); > + worker = (SndWorker *)cbs_data; > spice_debug(NULL); > > if (worker->connection) { > diff --git a/server/spicevmc.c b/server/spicevmc.c > index f745fdb..43c1eff 100644 > --- a/server/spicevmc.c > +++ b/server/spicevmc.c > @@ -453,7 +453,7 @@ static void > spicevmc_red_channel_release_pipe_item(RedChannelClient *rcc, > > static void spicevmc_connect(RedChannel *channel, RedClient *client, > RedsStream *stream, int migration, int num_common_caps, > - uint32_t *common_caps, int num_caps, uint32_t *caps) > + uint32_t *common_caps, int num_caps, uint32_t *caps, gpointer cbs_data) > { > RedChannelClient *rcc; > SpiceVmcState *state; Frediano _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel