From: Jonathon Jongsma <jjongsma@xxxxxxxxxx> --- server/inputs-channel.c | 1 + server/main-channel.c | 3 ++- server/red-channel.c | 26 +++++++++++++++----------- server/red-channel.h | 19 +++++++++++-------- server/red-worker.c | 2 +- server/smartcard.c | 1 + server/sound.c | 4 ++-- server/spicevmc.c | 2 +- 8 files changed, 34 insertions(+), 24 deletions(-) diff --git a/server/inputs-channel.c b/server/inputs-channel.c index f47a586..71716d5 100644 --- a/server/inputs-channel.c +++ b/server/inputs-channel.c @@ -636,6 +636,7 @@ InputsChannel* inputs_channel_new(void) inputs = (InputsChannel *)red_channel_create_parser( sizeof(InputsChannel), + reds, reds_get_core_interface(reds), SPICE_CHANNEL_INPUTS, 0, FALSE, /* handle_acks */ diff --git a/server/main-channel.c b/server/main-channel.c index 8b1d7d4..14f74ce 100644 --- a/server/main-channel.c +++ b/server/main-channel.c @@ -1179,7 +1179,8 @@ MainChannel* main_channel_new(void) channel_cbs.handle_migrate_data = main_channel_handle_migrate_data; // TODO: set the migration flag of the channel - channel = red_channel_create_parser(sizeof(MainChannel), reds_get_core_interface(reds), + channel = red_channel_create_parser(sizeof(MainChannel), reds, + reds_get_core_interface(reds), SPICE_CHANNEL_MAIN, 0, FALSE, /* handle_acks */ spice_get_client_channel_parser(SPICE_CHANNEL_MAIN, NULL), diff --git a/server/red-channel.c b/server/red-channel.c index a6069a9..490f08a 100644 --- a/server/red-channel.c +++ b/server/red-channel.c @@ -1016,6 +1016,7 @@ void red_channel_client_default_migrate(RedChannelClient *rcc) } RedChannel *red_channel_create(int size, + RedsState *reds, const SpiceCoreInterfaceInternal *core, uint32_t type, uint32_t id, int handle_acks, @@ -1039,6 +1040,7 @@ RedChannel *red_channel_create(int size, channel->migration_flags = migration_flags; memcpy(&channel->channel_cbs, channel_cbs, sizeof(ChannelCbs)); + channel->reds = reds; channel->core = core; ring_init(&channel->clients); @@ -1095,7 +1097,7 @@ SpiceCoreInterfaceInternal dummy_core = { .watch_remove = dummy_watch_remove, }; -RedChannel *red_channel_create_dummy(int size, uint32_t type, uint32_t id) +RedChannel *red_channel_create_dummy(int size, RedsState *reds, uint32_t type, uint32_t id) { RedChannel *channel; ClientCbs client_cbs = { NULL, }; @@ -1105,6 +1107,7 @@ RedChannel *red_channel_create_dummy(int size, uint32_t type, uint32_t id) channel->type = type; channel->id = id; channel->refs = 1; + channel->reds = reds; channel->core = &dummy_core; ring_init(&channel->clients); client_cbs.connect = red_channel_client_default_connect; @@ -1132,15 +1135,16 @@ static int do_nothing_handle_message(RedChannelClient *rcc, } RedChannel *red_channel_create_parser(int size, - const SpiceCoreInterfaceInternal *core, - uint32_t type, uint32_t id, - int handle_acks, - spice_parse_channel_func_t parser, - channel_handle_parsed_proc handle_parsed, - const ChannelCbs *channel_cbs, - uint32_t migration_flags) -{ - RedChannel *channel = red_channel_create(size, core, type, id, + RedsState *reds, + const SpiceCoreInterfaceInternal *core, + uint32_t type, uint32_t id, + int handle_acks, + spice_parse_channel_func_t parser, + channel_handle_parsed_proc handle_parsed, + const ChannelCbs *channel_cbs, + uint32_t migration_flags) +{ + RedChannel *channel = red_channel_create(size, reds, core, type, id, handle_acks, do_nothing_handle_message, channel_cbs, @@ -1162,7 +1166,7 @@ void red_channel_set_stat_node(RedChannel *channel, StatNodeRef stat) #ifdef RED_STATISTICS channel->stat = stat; - channel->out_bytes_counter = reds_stat_add_counter(reds, stat, "out_bytes", TRUE); + channel->out_bytes_counter = reds_stat_add_counter(channel->reds, stat, "out_bytes", TRUE); #endif } diff --git a/server/red-channel.h b/server/red-channel.h index b5ab7ac..3a12ae0 100644 --- a/server/red-channel.h +++ b/server/red-channel.h @@ -337,6 +337,7 @@ struct RedChannel { // TODO: when different channel_clients are in different threads from Channel -> need to protect! pthread_t thread_id; + RedsState *reds; #ifdef RED_STATISTICS StatNodeRef stat; uint64_t *out_bytes_counter; @@ -359,6 +360,7 @@ struct RedChannel { /* if one of the callbacks should cause disconnect, use red_channel_shutdown and don't * explicitly destroy the channel */ RedChannel *red_channel_create(int size, + RedsState *reds, const SpiceCoreInterfaceInternal *core, uint32_t type, uint32_t id, int handle_acks, @@ -369,13 +371,14 @@ RedChannel *red_channel_create(int size, /* alternative constructor, meant for marshaller based (inputs,main) channels, * will become default eventually */ RedChannel *red_channel_create_parser(int size, - const SpiceCoreInterfaceInternal *core, - uint32_t type, uint32_t id, - int handle_acks, - spice_parse_channel_func_t parser, - channel_handle_parsed_proc handle_parsed, - const ChannelCbs *channel_cbs, - uint32_t migration_flags); + RedsState *reds, + const SpiceCoreInterfaceInternal *core, + uint32_t type, uint32_t id, + int handle_acks, + spice_parse_channel_func_t parser, + channel_handle_parsed_proc handle_parsed, + const ChannelCbs *channel_cbs, + uint32_t migration_flags); void red_channel_set_stat_node(RedChannel *channel, StatNodeRef stat); void red_channel_register_client_cbs(RedChannel *channel, const ClientCbs *client_cbs); @@ -392,7 +395,7 @@ RedChannelClient *red_channel_client_create(int size, RedChannel *channel, RedCl // TODO: tmp, for channels that don't use RedChannel yet (e.g., snd channel), but // do use the client callbacks. So the channel clients are not connected (the channel doesn't // have list of them, but they do have a link to the channel, and the client has a list of them) -RedChannel *red_channel_create_dummy(int size, uint32_t type, uint32_t id); +RedChannel *red_channel_create_dummy(int size, RedsState *reds, uint32_t type, uint32_t id); RedChannelClient *red_channel_client_create_dummy(int size, RedChannel *channel, RedClient *client, diff --git a/server/red-worker.c b/server/red-worker.c index 7e5742f..d4e10d7 100644 --- a/server/red-worker.c +++ b/server/red-worker.c @@ -513,7 +513,7 @@ CommonChannel *red_worker_new_channel(RedWorker *worker, int size, channel_cbs->alloc_recv_buf = common_alloc_recv_buf; channel_cbs->release_recv_buf = common_release_recv_buf; - channel = red_channel_create_parser(size, &worker->core, + channel = red_channel_create_parser(size, reds, &worker->core, channel_type, worker->qxl->id, TRUE /* handle_acks */, spice_get_client_channel_parser(channel_type, NULL), diff --git a/server/smartcard.c b/server/smartcard.c index e9e58a8..c7b1f30 100644 --- a/server/smartcard.c +++ b/server/smartcard.c @@ -849,6 +849,7 @@ static void smartcard_init(void) channel_cbs.handle_migrate_data = smartcard_channel_client_handle_migrate_data; g_smartcard_channel = (SmartCardChannel*)red_channel_create(sizeof(SmartCardChannel), + reds, reds_get_core_interface(reds), SPICE_CHANNEL_SMARTCARD, 0, FALSE /* handle_acks */, diff --git a/server/sound.c b/server/sound.c index 3c77d77..fd0b416 100644 --- a/server/sound.c +++ b/server/sound.c @@ -1519,7 +1519,7 @@ void snd_attach_playback(SpicePlaybackInstance *sin) sin->st->frequency = SND_CODEC_CELT_PLAYBACK_FREQ; /* Default to the legacy rate */ // TODO: Make RedChannel base of worker? instead of assigning it to channel->data - channel = red_channel_create_dummy(sizeof(RedChannel), SPICE_CHANNEL_PLAYBACK, 0); + channel = red_channel_create_dummy(sizeof(RedChannel), reds, SPICE_CHANNEL_PLAYBACK, 0); client_cbs.connect = snd_set_playback_peer; client_cbs.disconnect = snd_disconnect_channel_client; @@ -1549,7 +1549,7 @@ void snd_attach_record(SpiceRecordInstance *sin) sin->st->frequency = SND_CODEC_CELT_PLAYBACK_FREQ; /* Default to the legacy rate */ // TODO: Make RedChannel base of worker? instead of assigning it to channel->data - channel = red_channel_create_dummy(sizeof(RedChannel), SPICE_CHANNEL_RECORD, 0); + channel = red_channel_create_dummy(sizeof(RedChannel), reds, SPICE_CHANNEL_RECORD, 0); client_cbs.connect = snd_set_record_peer; client_cbs.disconnect = snd_disconnect_channel_client; diff --git a/server/spicevmc.c b/server/spicevmc.c index 4fc95e3..35d1393 100644 --- a/server/spicevmc.c +++ b/server/spicevmc.c @@ -524,7 +524,7 @@ SpiceCharDeviceState *spicevmc_device_connect(RedsState *reds, channel_cbs.handle_migrate_flush_mark = spicevmc_channel_client_handle_migrate_flush_mark; channel_cbs.handle_migrate_data = spicevmc_channel_client_handle_migrate_data; - state = (SpiceVmcState*)red_channel_create(sizeof(SpiceVmcState), + state = (SpiceVmcState*)red_channel_create(sizeof(SpiceVmcState), reds, reds_get_core_interface(reds), channel_type, id[channel_type]++, FALSE /* handle_acks */, spicevmc_red_channel_client_handle_message, -- 2.5.0 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel