[Spice-devel] [spice-server 2/8] Move RedChannel::data to ClientCbs::cbs_data
Christophe Fergeau
cfergeau at redhat.com
Mon Mar 14 17:10:28 UTC 2016
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;
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;
--
2.5.0
More information about the Spice-devel
mailing list