[Spice-devel] [PATCH 2/5] Use red_channel_client_get_client() everywhere
Frediano Ziglio
fziglio at redhat.com
Tue Aug 30 16:03:37 UTC 2016
>
> Instead of having all other classes poke into the RedChannelClient
> struct to get the RedClient associated with the channel client, call the
> accessor function. This commit allows us to encapsulate RedChannelClient
> and move it to its own file soon.
> ---
> server/dcc.c | 9 +++++----
> server/main-channel-client.c | 27 ++++++++++++++++-----------
> server/main-channel.c | 8 +++++---
> server/reds.c | 22 +++++++++++++---------
> server/smartcard.c | 15 ++++++++++-----
> server/sound.c | 2 +-
> server/spicevmc.c | 18 +++++++++++-------
> server/stream.c | 13 +++++++------
> 8 files changed, 68 insertions(+), 46 deletions(-)
>
> diff --git a/server/dcc.c b/server/dcc.c
> index 9c3ab64..8eca28b 100644
> --- a/server/dcc.c
> +++ b/server/dcc.c
> @@ -892,18 +892,19 @@ int dcc_pixmap_cache_unlocked_add(DisplayChannelClient
> *dcc, uint64_t id,
> static int dcc_handle_init(DisplayChannelClient *dcc, SpiceMsgcDisplayInit
> *init)
> {
> gboolean success;
> + RedClient *client =
> red_channel_client_get_client(RED_CHANNEL_CLIENT(dcc));
>
> spice_return_val_if_fail(dcc->expect_init, FALSE);
> dcc->expect_init = FALSE;
>
> spice_return_val_if_fail(!dcc->pixmap_cache, FALSE);
> - dcc->pixmap_cache = pixmap_cache_get(RED_CHANNEL_CLIENT(dcc)->client,
> + dcc->pixmap_cache = pixmap_cache_get(client,
> init->pixmap_cache_id,
> init->pixmap_cache_size);
> spice_return_val_if_fail(dcc->pixmap_cache, FALSE);
>
> success = image_encoders_get_glz_dictionary(&dcc->encoders,
> -
> RED_CHANNEL_CLIENT(dcc)->client,
> + client,
> init->glz_dictionary_id,
> init->glz_dictionary_window_size);
> spice_return_val_if_fail(success, FALSE);
> @@ -1007,7 +1008,7 @@ static int
> dcc_handle_migrate_glz_dictionary(DisplayChannelClient *dcc,
> SpiceMigrateDataDisplay
> *migrate)
> {
> return image_encoders_restore_glz_dictionary(&dcc->encoders,
> -
> RED_CHANNEL_CLIENT(dcc)->client,
> +
> red_channel_client_get_client(RED_CHANNEL_CLIENT(dcc)),
> migrate->glz_dict_id,
> &migrate->glz_dict_data);
> }
> @@ -1083,7 +1084,7 @@ int dcc_handle_migrate_data(DisplayChannelClient *dcc,
> uint32_t size, void *mess
> * channel client that froze the cache on the src size receives the
> migrate
> * data and unfreezes the cache by setting its size > 0 and by
> triggering
> * pixmap_cache_reset */
> - dcc->pixmap_cache = pixmap_cache_get(RED_CHANNEL_CLIENT(dcc)->client,
> + dcc->pixmap_cache =
> pixmap_cache_get(red_channel_client_get_client(RED_CHANNEL_CLIENT(dcc)),
> migrate_data->pixmap_cache_id, -1);
> spice_return_val_if_fail(dcc->pixmap_cache, FALSE);
>
> diff --git a/server/main-channel-client.c b/server/main-channel-client.c
> index 7a96a57..12151a7 100644
> --- a/server/main-channel-client.c
> +++ b/server/main-channel-client.c
> @@ -335,7 +335,8 @@ void
> main_channel_client_handle_migrate_connected(MainChannelClient *mcc,
> int success,
> int seamless)
> {
> - spice_printerr("client %p connected: %d seamless %d", mcc->base.client,
> success, seamless);
> + RedClient *client = red_channel_client_get_client(&mcc->base);
> + spice_printerr("client %p connected: %d seamless %d", client, success,
> seamless);
> if (mcc->mig_wait_connect) {
> RedChannel *channel = red_channel_client_get_channel(&mcc->base);
> MainChannel *main_channel = SPICE_CONTAINEROF(channel, MainChannel,
> base);
> @@ -349,7 +350,7 @@ void
> main_channel_client_handle_migrate_connected(MainChannelClient *mcc,
> }
> } else {
> if (success) {
> - spice_printerr("client %p MIGRATE_CANCEL", mcc->base.client);
> + spice_printerr("client %p MIGRATE_CANCEL", client);
> red_channel_client_pipe_add_empty_msg(&mcc->base,
> SPICE_MSG_MAIN_MIGRATE_CANCEL);
> }
> }
> @@ -432,7 +433,8 @@ void main_channel_client_handle_pong(MainChannelClient
> *mcc, SpiceMsgPing *ping,
>
> void main_channel_client_handle_migrate_end(MainChannelClient *mcc)
> {
> - if (!red_client_during_migrate_at_target(mcc->base.client)) {
> + RedClient *client = red_channel_client_get_client(&mcc->base);
> + if (!red_client_during_migrate_at_target(client)) {
> spice_printerr("unexpected SPICE_MSGC_MIGRATE_END");
> return;
> }
> @@ -442,13 +444,14 @@ void
> main_channel_client_handle_migrate_end(MainChannelClient *mcc)
> "client does not support semi-seamless migration");
> return;
> }
> - red_client_semi_seamless_migrate_complete(mcc->base.client);
> + red_client_semi_seamless_migrate_complete(client);
> }
>
> void main_channel_client_migrate_cancel_wait(MainChannelClient *mcc)
> {
> if (mcc->mig_wait_connect) {
> - spice_printerr("client %p cancel wait connect", mcc->base.client);
> + spice_printerr("client %p cancel wait connect",
> + red_channel_client_get_client(&mcc->base));
> mcc->mig_wait_connect = FALSE;
> mcc->mig_connect_ok = FALSE;
> }
> @@ -475,20 +478,21 @@ gboolean
> main_channel_client_migrate_src_complete(MainChannelClient *mcc,
> gboolean success)
> {
> gboolean ret = FALSE;
> + RedClient *client = red_channel_client_get_client(&mcc->base);
> int semi_seamless_support =
> red_channel_client_test_remote_cap(&mcc->base,
> SPICE_MAIN_CAP_SEMI_SEAMLESS_MIGRATE);
> if (semi_seamless_support && mcc->mig_connect_ok) {
> if (success) {
> - spice_printerr("client %p MIGRATE_END", mcc->base.client);
> + spice_printerr("client %p MIGRATE_END", client);
> red_channel_client_pipe_add_empty_msg(&mcc->base,
> SPICE_MSG_MAIN_MIGRATE_END);
> ret = TRUE;
> } else {
> - spice_printerr("client %p MIGRATE_CANCEL", mcc->base.client);
> + spice_printerr("client %p MIGRATE_CANCEL", client);
> red_channel_client_pipe_add_empty_msg(&mcc->base,
> SPICE_MSG_MAIN_MIGRATE_CANCEL);
> }
> } else {
> if (success) {
> - spice_printerr("client %p SWITCH_HOST", mcc->base.client);
> + spice_printerr("client %p SWITCH_HOST", client);
> red_channel_client_pipe_add_type(&mcc->base,
> RED_PIPE_ITEM_TYPE_MAIN_MIGRATE_SWITCH_HOST);
> }
> }
> @@ -607,10 +611,11 @@ gboolean
> main_channel_client_connect_semi_seamless(MainChannelClient *mcc)
>
> void main_channel_client_connect_seamless(MainChannelClient *mcc)
> {
> + RedClient *client = red_channel_client_get_client(&mcc->base);
> spice_assert(red_channel_client_test_remote_cap(&mcc->base,
> SPICE_MAIN_CAP_SEAMLESS_MIGRATE));
> - if (red_client_during_migrate_at_target(mcc->base.client)) {
> - spice_printerr("client %p: wait till previous migration completes",
> mcc->base.client);
> + if (red_client_during_migrate_at_target(client)) {
> + spice_printerr("client %p: wait till previous migration completes",
> client);
> mcc->mig_wait_prev_complete = TRUE;
> mcc->mig_wait_prev_try_seamless = TRUE;
> } else {
> @@ -865,7 +870,7 @@ void main_channel_client_send_item(RedChannelClient *rcc,
> RedPipeItem *base)
> base->type != RED_PIPE_ITEM_TYPE_MAIN_INIT) {
> spice_printerr("Init msg for client %p was not sent yet "
> "(client is probably during semi-seamless migration).
> Ignoring msg type %d",
> - rcc->client, base->type);
> + red_channel_client_get_client(rcc), base->type);
> return;
> }
> switch (base->type) {
> diff --git a/server/main-channel.c b/server/main-channel.c
> index 7c6c1f7..8bb874b 100644
> --- a/server/main-channel.c
> +++ b/server/main-channel.c
> @@ -37,7 +37,8 @@ static void
> main_channel_client_on_disconnect(RedChannelClient *rcc)
> {
> RedsState *reds =
> red_channel_get_server(red_channel_client_get_channel(rcc));
> spice_printerr("rcc=%p", rcc);
> - main_dispatcher_client_disconnect(reds_get_main_dispatcher(reds),
> rcc->client);
> + main_dispatcher_client_disconnect(reds_get_main_dispatcher(reds),
> + red_channel_client_get_client(rcc));
> }
>
> RedClient *main_channel_get_client_by_link_id(MainChannel *main_chan,
> uint32_t connection_id)
> @@ -48,7 +49,7 @@ RedClient *main_channel_get_client_by_link_id(MainChannel
> *main_chan, uint32_t c
> FOREACH_CLIENT(main_chan, link, next, rcc) {
> MainChannelClient *mcc = (MainChannelClient*) rcc;
> if (main_channel_client_get_connection_id(mcc) == connection_id) {
> - return rcc->client;
> + return red_channel_client_get_client(rcc);
> }
> }
> return NULL;
> @@ -56,7 +57,8 @@ RedClient *main_channel_get_client_by_link_id(MainChannel
> *main_chan, uint32_t c
>
> static void main_channel_push_channels(MainChannelClient *mcc)
> {
> - if
> (red_client_during_migrate_at_target((main_channel_client_get_base(mcc))->client))
> {
> + RedChannelClient *rcc = main_channel_client_get_base(mcc);
> + if
> (red_client_during_migrate_at_target(red_channel_client_get_client(rcc))) {
> spice_printerr("warning: ignoring unexpected
> SPICE_MSGC_MAIN_ATTACH_CHANNELS"
> "during migration");
> return;
> diff --git a/server/reds.c b/server/reds.c
> index 6f88649..90358e4 100644
> --- a/server/reds.c
> +++ b/server/reds.c
> @@ -1042,12 +1042,14 @@ void reds_on_main_agent_start(RedsState *reds,
> MainChannelClient *mcc, uint32_t
> {
> RedCharDevice *dev_state = RED_CHAR_DEVICE(reds->agent_dev);
> RedChannelClient *rcc;
> + RedClient *client;
>
> if (!reds->vdagent) {
> return;
> }
> spice_assert(reds->vdagent->st && reds->vdagent->st == dev_state);
> rcc = main_channel_client_get_base(mcc);
> + client = red_channel_client_get_client(rcc);
> reds->agent_dev->priv->client_agent_started = TRUE;
> /*
> * Note that in older releases, send_tokens were set to ~0 on both
> client
> @@ -1056,11 +1058,11 @@ void reds_on_main_agent_start(RedsState *reds,
> MainChannelClient *mcc, uint32_t
> * and vice versa, the sending from the server to the client won't have
> * flow control, but will have no other problem.
> */
> - if (!red_char_device_client_exists(dev_state, rcc->client)) {
> + if (!red_char_device_client_exists(dev_state, client)) {
> int client_added;
>
> client_added = red_char_device_client_add(dev_state,
> - rcc->client,
> + client,
> TRUE, /* flow control */
> REDS_VDI_PORT_NUM_RECEIVE_BUFFS,
> REDS_AGENT_WINDOW_SIZE,
> @@ -1074,7 +1076,7 @@ void reds_on_main_agent_start(RedsState *reds,
> MainChannelClient *mcc, uint32_t
> }
> } else {
> red_char_device_send_to_client_tokens_set(dev_state,
> - rcc->client,
> + client,
> num_tokens);
> }
>
> @@ -1086,12 +1088,13 @@ void reds_on_main_agent_start(RedsState *reds,
> MainChannelClient *mcc, uint32_t
>
> void reds_on_main_agent_tokens(RedsState *reds, MainChannelClient *mcc,
> uint32_t num_tokens)
> {
> + RedClient *client =
> red_channel_client_get_client(main_channel_client_get_base(mcc));
> if (!reds->vdagent) {
> return;
> }
> spice_assert(reds->vdagent->st);
> red_char_device_send_to_client_tokens_add(reds->vdagent->st,
> -
> main_channel_client_get_base(mcc)->client,
> + client,
> num_tokens);
> }
>
> @@ -1112,7 +1115,7 @@ uint8_t *reds_get_agent_data_buffer(RedsState *reds,
> MainChannelClient *mcc, siz
> }
>
> spice_assert(dev->priv->recv_from_client_buf == NULL);
> - client = main_channel_client_get_base(mcc)->client;
> + client =
> red_channel_client_get_client(main_channel_client_get_base(mcc));
> dev->priv->recv_from_client_buf =
> red_char_device_write_buffer_get(RED_CHAR_DEVICE(dev),
> client,
> size
> +
> sizeof(VDIChunkHeader));
> @@ -1483,9 +1486,9 @@ int reds_handle_migrate_data(RedsState *reds,
> MainChannelClient *mcc,
> } else {
> spice_debug("agent was not attached on the source host");
> if (reds->vdagent) {
> + RedClient *client =
> red_channel_client_get_client(main_channel_client_get_base(mcc));
> /* red_char_device_client_remove disables waiting for migration
> data */
> - red_char_device_client_remove(RED_CHAR_DEVICE(agent_dev),
> -
> main_channel_client_get_base(mcc)->client);
> + red_char_device_client_remove(RED_CHAR_DEVICE(agent_dev),
> client);
> main_channel_push_agent_connected(reds->main_channel);
> }
> }
> @@ -1929,10 +1932,11 @@ int reds_on_migrate_dst_set_seamless(RedsState *reds,
> MainChannelClient *mcc, ui
> reds->dst_do_seamless_migrate = FALSE;
> } else {
> RedChannelClient *rcc = main_channel_client_get_base(mcc);
> + RedClient *client = red_channel_client_get_client(rcc);
>
> - red_client_set_migration_seamless(rcc->client);
> + red_client_set_migration_seamless(client);
> /* linking all the channels that have been connected before
> migration handshake */
> - reds->dst_do_seamless_migrate = reds_link_mig_target_channels(reds,
> rcc->client);
> + reds->dst_do_seamless_migrate = reds_link_mig_target_channels(reds,
> client);
> }
> return reds->dst_do_seamless_migrate;
> }
> diff --git a/server/smartcard.c b/server/smartcard.c
> index b69ac17..a8a16c7 100644
> --- a/server/smartcard.c
> +++ b/server/smartcard.c
> @@ -172,7 +172,8 @@ static void smartcard_send_msg_to_client(RedPipeItem
> *msg,
> {
> RedCharDeviceSmartcard *dev = opaque;
>
> - spice_assert(dev->priv->scc && dev->priv->scc->base.client == client);
> + spice_assert(dev->priv->scc &&
> + red_channel_client_get_client(&dev->priv->scc->base) ==
> client);
> red_pipe_item_ref(msg);
> smartcard_channel_client_pipe_add_push(&dev->priv->scc->base, msg);
> }
> @@ -187,7 +188,8 @@ static void smartcard_remove_client(RedClient *client,
> void *opaque)
> RedCharDeviceSmartcard *dev = opaque;
>
> spice_printerr("smartcard dev %p, client %p", dev, client);
> - spice_assert(dev->priv->scc && dev->priv->scc->base.client == client);
> + spice_assert(dev->priv->scc &&
> + red_channel_client_get_client(&dev->priv->scc->base) ==
> client);
> red_channel_client_shutdown(&dev->priv->scc->base);
> }
>
> @@ -318,7 +320,7 @@ static void
> smartcard_char_device_attach_client(SpiceCharDeviceInstance *char_de
> dev->priv->scc = scc;
> scc->smartcard = dev;
> client_added = red_char_device_client_add(RED_CHAR_DEVICE(dev),
> - scc->base.client,
> +
> red_channel_client_get_client(&scc->base),
> FALSE, /* no flow control yet
> */
> 0, /* send queue size */
> ~0,
> @@ -364,7 +366,8 @@ static void
> smartcard_char_device_detach_client(SmartCardChannelClient *scc)
> }
> dev = scc->smartcard;
> spice_assert(dev->priv->scc == scc);
> - red_char_device_client_remove(RED_CHAR_DEVICE(dev), scc->base.client);
> + red_char_device_client_remove(RED_CHAR_DEVICE(dev),
> +
> red_channel_client_get_client(&scc->base));
> scc->smartcard = NULL;
> dev->priv->scc = NULL;
> }
> @@ -393,7 +396,9 @@ static uint8_t
> *smartcard_channel_alloc_msg_rcv_buf(RedChannelClient *rcc,
> dev = scc->smartcard;
> spice_assert(dev->priv->scc || scc->smartcard);
> spice_assert(!scc->write_buf);
> - scc->write_buf =
> red_char_device_write_buffer_get(RED_CHAR_DEVICE(dev), rcc->client, size);
> + scc->write_buf =
> red_char_device_write_buffer_get(RED_CHAR_DEVICE(dev),
> +
> red_channel_client_get_client(rcc),
> + size);
>
> if (!scc->write_buf) {
> spice_error("failed to allocate write buffer");
> diff --git a/server/sound.c b/server/sound.c
> index 06fab7f..84cbab4 100644
> --- a/server/sound.c
> +++ b/server/sound.c
> @@ -1143,7 +1143,7 @@ void snd_set_playback_latency(RedClient *client,
> uint32_t latency)
>
> for (; now; now = now->next) {
> if (now->base_channel->type == SPICE_CHANNEL_PLAYBACK &&
> now->connection &&
> - now->connection->channel_client->client == client) {
> + red_channel_client_get_client(now->connection->channel_client)
> == client) {
>
> if
> (red_channel_client_test_remote_cap(now->connection->channel_client,
> SPICE_PLAYBACK_CAP_LATENCY)) {
> diff --git a/server/spicevmc.c b/server/spicevmc.c
> index 08b3730..5e310a6 100644
> --- a/server/spicevmc.c
> +++ b/server/spicevmc.c
> @@ -211,7 +211,7 @@ static void
> spicevmc_chardev_send_msg_to_client(RedPipeItem *msg,
> {
> SpiceVmcState *state = opaque;
>
> - spice_assert(state->rcc->client == client);
> + spice_assert(red_channel_client_get_client(state->rcc) == client);
> red_pipe_item_ref(msg);
> red_channel_client_pipe_add_push(state->rcc, msg);
> }
> @@ -255,7 +255,8 @@ static void spicevmc_char_dev_remove_client(RedClient
> *client, void *opaque)
> SpiceVmcState *state = opaque;
>
> spice_printerr("vmc state %p, client %p", state, client);
> - spice_assert(state->rcc && state->rcc->client == client);
> + spice_assert(state->rcc &&
> + red_channel_client_get_client(state->rcc) == client);
>
> red_channel_client_shutdown(state->rcc);
> }
> @@ -283,6 +284,7 @@ static void
> spicevmc_red_channel_client_on_disconnect(RedChannelClient *rcc)
> {
> SpiceVmcState *state;
> SpiceCharDeviceInterface *sif;
> + RedClient *client = red_channel_client_get_client(rcc);
>
> if (!rcc) {
> return;
> @@ -294,11 +296,11 @@ static void
> spicevmc_red_channel_client_on_disconnect(RedChannelClient *rcc)
> red_char_device_write_buffer_release(state->chardev,
> &state->recv_from_client_buf);
>
> if (state->chardev) {
> - if (red_char_device_client_exists(state->chardev, rcc->client)) {
> - red_char_device_client_remove(state->chardev, rcc->client);
> + if (red_char_device_client_exists(state->chardev, client)) {
> + red_char_device_client_remove(state->chardev, client);
> } else {
> spice_printerr("client %p have already been removed from char
> dev %p",
> - rcc->client, state->chardev);
> + client, state->chardev);
> }
> }
>
> @@ -349,7 +351,8 @@ static int handle_compressed_msg(SpiceVmcState *state,
> RedChannelClient *rcc,
> int decompressed_size;
> RedCharDeviceWriteBuffer *write_buf;
>
> - write_buf = red_char_device_write_buffer_get(state->chardev,
> rcc->client,
> + write_buf = red_char_device_write_buffer_get(state->chardev,
> +
> red_channel_client_get_client(rcc),
> compressed_data_msg->uncompressed_size);
> if (!write_buf) {
> return FALSE;
> @@ -424,6 +427,7 @@ static uint8_t
> *spicevmc_red_channel_alloc_msg_rcv_buf(RedChannelClient *rcc,
> uint32_t size)
> {
> SpiceVmcState *state;
> + RedClient *client = red_channel_client_get_client(rcc);
>
> state = spicevmc_red_channel_client_get_state(rcc);
>
> @@ -432,7 +436,7 @@ static uint8_t
> *spicevmc_red_channel_alloc_msg_rcv_buf(RedChannelClient *rcc,
> assert(!state->recv_from_client_buf);
>
> state->recv_from_client_buf =
> red_char_device_write_buffer_get(state->chardev,
> -
> rcc->client,
> +
> client,
> size);
> if (!state->recv_from_client_buf) {
> spice_error("failed to allocate write buffer");
> diff --git a/server/stream.c b/server/stream.c
> index d302168..4819723 100644
> --- a/server/stream.c
> +++ b/server/stream.c
> @@ -634,7 +634,7 @@ static uint64_t get_initial_bit_rate(DisplayChannelClient
> *dcc, Stream *stream)
> MainChannelClient *mcc;
> uint64_t net_test_bit_rate;
>
> - mcc = red_client_get_main(RED_CHANNEL_CLIENT(dcc)->client);
> + mcc =
> red_client_get_main(red_channel_client_get_client(RED_CHANNEL_CLIENT(dcc)));
> net_test_bit_rate =
> main_channel_client_is_network_info_initialized(mcc) ?
> main_channel_client_get_bitrate_per_sec(mcc)
> :
> 0;
> @@ -663,10 +663,11 @@ static uint32_t get_roundtrip_ms(void *opaque)
> {
> StreamAgent *agent = opaque;
> int roundtrip;
> + RedChannelClient *rcc = RED_CHANNEL_CLIENT(agent->dcc);
>
> - roundtrip =
> red_channel_client_get_roundtrip_ms(RED_CHANNEL_CLIENT(agent->dcc));
> + roundtrip = red_channel_client_get_roundtrip_ms(rcc);
> if (roundtrip < 0) {
> - MainChannelClient *mcc =
> red_client_get_main(RED_CHANNEL_CLIENT(agent->dcc)->client);
> + MainChannelClient *mcc =
> red_client_get_main(red_channel_client_get_client(rcc));
>
> /*
> * the main channel client roundtrip might not have been
> @@ -697,10 +698,10 @@ static void update_client_playback_delay(void *opaque,
> uint32_t delay_ms)
> dcc_update_streams_max_latency(dcc, agent);
>
> agent->client_required_latency = delay_ms;
> - if (delay_ms > dcc_get_max_stream_latency(agent->dcc)) {
> - dcc_set_max_stream_latency(agent->dcc, delay_ms);
> + if (delay_ms > dcc_get_max_stream_latency(dcc)) {
> + dcc_set_max_stream_latency(dcc, delay_ms);
> }
> - spice_debug("resetting client latency: %u",
> dcc_get_max_stream_latency(agent->dcc));
> + spice_debug("resetting client latency: %u",
> dcc_get_max_stream_latency(dcc));
> main_dispatcher_set_mm_time_latency(reds_get_main_dispatcher(reds),
> client,
> dcc_get_max_stream_latency(agent->dcc));
Acked-by: Frediano Ziglio <fziglio at redhat.com>
Frediano
More information about the Spice-devel
mailing list