[Spice-devel] [PATCH 5/9] server: add an optionnal pointer to SpiceBaseInstance
Marc-André Lureau
marcandre.lureau at gmail.com
Mon Nov 18 02:28:29 PST 2013
From: Marc-André Lureau <marcandre.lureau at redhat.com>
This is useful to associate an interface instance with a channel.
---
server/inputs_channel.c | 1 +
server/main_channel.c | 4 +++-
server/red_channel.c | 8 ++++++--
server/red_channel.h | 5 ++++-
server/red_worker.c | 10 ++++++++--
server/smartcard.c | 1 +
server/snd_worker.c | 8 ++++++--
server/spice.h | 2 ++
server/spicevmc.c | 1 +
9 files changed, 32 insertions(+), 8 deletions(-)
diff --git a/server/inputs_channel.c b/server/inputs_channel.c
index dd8f5ae..dc3fac4 100644
--- a/server/inputs_channel.c
+++ b/server/inputs_channel.c
@@ -648,6 +648,7 @@ void inputs_init(void)
g_inputs_channel = (InputsChannel *)red_channel_create_parser(
sizeof(InputsChannel),
+ NULL,
core,
SPICE_CHANNEL_INPUTS, 0,
FALSE, /* handle_acks */
diff --git a/server/main_channel.c b/server/main_channel.c
index 54718ba..a6ba7d6 100644
--- a/server/main_channel.c
+++ b/server/main_channel.c
@@ -1204,7 +1204,9 @@ MainChannel* main_channel_init(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), core,
+ channel = red_channel_create_parser(sizeof(MainChannel),
+ NULL,
+ core,
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 24a8b64..f1eb912 100644
--- a/server/red_channel.c
+++ b/server/red_channel.c
@@ -1020,6 +1020,7 @@ void red_channel_client_default_migrate(RedChannelClient *rcc)
}
RedChannel *red_channel_create(int size,
+ SpiceBaseInstance *sin,
SpiceCoreInterface *core,
uint32_t type, uint32_t id,
int handle_acks,
@@ -1041,6 +1042,7 @@ RedChannel *red_channel_create(int size,
channel->refs = 1;
channel->handle_acks = handle_acks;
channel->migration_flags = migration_flags;
+ channel->sin = sin;
memcpy(&channel->channel_cbs, channel_cbs, sizeof(ChannelCbs));
channel->core = core;
@@ -1098,7 +1100,7 @@ SpiceCoreInterface 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, SpiceBaseInstance *sin, uint32_t type, uint32_t id)
{
RedChannel *channel;
ClientCbs client_cbs = { NULL, };
@@ -1109,6 +1111,7 @@ RedChannel *red_channel_create_dummy(int size, uint32_t type, uint32_t id)
channel->id = id;
channel->refs = 1;
channel->core = &dummy_core;
+ channel->sin = sin;
ring_init(&channel->clients);
client_cbs.connect = red_channel_client_default_connect;
client_cbs.disconnect = red_channel_client_default_disconnect;
@@ -1135,6 +1138,7 @@ static int do_nothing_handle_message(RedChannelClient *rcc,
}
RedChannel *red_channel_create_parser(int size,
+ SpiceBaseInstance *sin,
SpiceCoreInterface *core,
uint32_t type, uint32_t id,
int handle_acks,
@@ -1143,7 +1147,7 @@ RedChannel *red_channel_create_parser(int size,
ChannelCbs *channel_cbs,
uint32_t migration_flags)
{
- RedChannel *channel = red_channel_create(size, core, type, id,
+ RedChannel *channel = red_channel_create(size, sin, core, type, id,
handle_acks,
do_nothing_handle_message,
channel_cbs,
diff --git a/server/red_channel.h b/server/red_channel.h
index 9e54dce..12bc640 100644
--- a/server/red_channel.h
+++ b/server/red_channel.h
@@ -308,6 +308,7 @@ struct RedChannel {
RingItem link; // channels link for reds
+ SpiceBaseInstance *sin;
SpiceCoreInterface *core;
int handle_acks;
@@ -353,6 +354,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,
+ SpiceBaseInstance *sin,
SpiceCoreInterface *core,
uint32_t type, uint32_t id,
int handle_acks,
@@ -363,6 +365,7 @@ 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,
+ SpiceBaseInstance *sin,
SpiceCoreInterface *core,
uint32_t type, uint32_t id,
int handle_acks,
@@ -385,7 +388,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, SpiceBaseInstance *sin, 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 afbdd91..d9c1fc5 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -10308,7 +10308,9 @@ CursorChannelClient *cursor_channel_create_rcc(CommonChannel *common,
return ccc;
}
-static RedChannel *__new_channel(RedWorker *worker, int size, uint32_t channel_type,
+static RedChannel *__new_channel(RedWorker *worker, int size,
+ SpiceBaseInstance *sin,
+ uint32_t channel_type,
int migration_flags,
channel_disconnect_proc on_disconnect,
channel_send_pipe_item_proc send_item,
@@ -10334,7 +10336,9 @@ static RedChannel *__new_channel(RedWorker *worker, int size, uint32_t channel_t
channel_cbs.handle_migrate_data = handle_migrate_data;
channel_cbs.handle_migrate_data_get_serial = migrate_get_serial;
- channel = red_channel_create_parser(size, &worker_core,
+ channel = red_channel_create_parser(size,
+ sin,
+ &worker_core,
channel_type, worker->id,
TRUE /* handle_acks */,
spice_get_client_channel_parser(channel_type, NULL),
@@ -10497,6 +10501,7 @@ static void display_channel_create(RedWorker *worker, int migrate)
spice_info("create display channel");
if (!(worker->display_channel = (DisplayChannel *)__new_channel(
worker, sizeof(*display_channel),
+ SPICE_BASE_INSTANCE(worker->qxl),
SPICE_CHANNEL_DISPLAY,
SPICE_MIGRATE_NEED_FLUSH | SPICE_MIGRATE_NEED_DATA_TRANSFER,
display_channel_client_on_disconnect,
@@ -10752,6 +10757,7 @@ static void cursor_channel_create(RedWorker *worker, int migrate)
spice_info("create cursor channel");
worker->cursor_channel = (CursorChannel *)__new_channel(
worker, sizeof(*worker->cursor_channel),
+ SPICE_BASE_INSTANCE(worker->qxl),
SPICE_CHANNEL_CURSOR,
0,
cursor_channel_client_on_disconnect,
diff --git a/server/smartcard.c b/server/smartcard.c
index aad22aa..c6323ae 100644
--- a/server/smartcard.c
+++ b/server/smartcard.c
@@ -842,6 +842,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),
+ NULL,
core, SPICE_CHANNEL_SMARTCARD, 0,
FALSE /* handle_acks */,
smartcard_channel_handle_message,
diff --git a/server/snd_worker.c b/server/snd_worker.c
index 9156bf5..41cf4d2 100644
--- a/server/snd_worker.c
+++ b/server/snd_worker.c
@@ -1490,7 +1490,9 @@ void snd_attach_playback(SpicePlaybackInstance *sin)
playback_worker = &sin->st->worker;
// 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),
+ SPICE_BASE_INSTANCE(sin),
+ SPICE_CHANNEL_PLAYBACK, 0);
channel->data = playback_worker;
client_cbs.connect = snd_set_playback_peer;
@@ -1517,7 +1519,9 @@ void snd_attach_record(SpiceRecordInstance *sin)
record_worker = &sin->st->worker;
// 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),
+ SPICE_BASE_INSTANCE(sin),
+ SPICE_CHANNEL_RECORD, 0);
channel->data = record_worker;
client_cbs.connect = snd_set_record_peer;
diff --git a/server/spice.h b/server/spice.h
index b645112..03e7bd8 100644
--- a/server/spice.h
+++ b/server/spice.h
@@ -46,6 +46,8 @@ struct SpiceBaseInstance {
const SpiceBaseInterface *sif;
};
+#define SPICE_BASE_INSTANCE(sin) ((SpiceBaseInstance*)sin)
+
/* core interface */
#define SPICE_INTERFACE_CORE "core"
diff --git a/server/spicevmc.c b/server/spicevmc.c
index e10f183..7897312 100644
--- a/server/spicevmc.c
+++ b/server/spicevmc.c
@@ -519,6 +519,7 @@ SpiceCharDeviceState *spicevmc_device_connect(SpiceCharDeviceInstance *sin,
channel_cbs.handle_migrate_data = spicevmc_channel_client_handle_migrate_data;
state = (SpiceVmcState*)red_channel_create(sizeof(SpiceVmcState),
+ SPICE_BASE_INSTANCE(sin),
core, channel_type, id[channel_type]++,
FALSE /* handle_acks */,
spicevmc_red_channel_client_handle_message,
--
1.8.3.1
More information about the Spice-devel
mailing list