summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2011-08-25 10:41:51 +0200
committerHans de Goede <hdegoede@redhat.com>2011-08-25 14:04:27 +0200
commit073cf20ac57b9e035f247f180a109f29333dacb8 (patch)
tree9d8cd007e8d9bff6f4c1e4f168cd99c5407aa6c4
parent22a6eef60dbeb49b07461107c55fb0cbc7ae73c0 (diff)
downloadspice-073cf20ac57b9e035f247f180a109f29333dacb8.tar.gz
spice-073cf20ac57b9e035f247f180a109f29333dacb8.tar.xz
spice-073cf20ac57b9e035f247f180a109f29333dacb8.zip
usbredir: Merge UsbRedirState and UsbRedirChannel
Now that the Channel struct is gone and the RedChannel has the same lifetime as the chardev interface there is no need to have these 2 separate. Signed-off-by: Hans de Goede <hdegoede@redhat.com>
-rw-r--r--server/usbredir.c51
1 files changed, 18 insertions, 33 deletions
diff --git a/server/usbredir.c b/server/usbredir.c
index eb9b91ff..7860389a 100644
--- a/server/usbredir.c
+++ b/server/usbredir.c
@@ -39,7 +39,7 @@ typedef struct UsbRedirPipeItem {
} UsbRedirPipeItem;
typedef struct UsbRedirState {
- RedChannel *channel;
+ RedChannel channel; /* Must be the first item */
RedChannelClient *rcc;
SpiceCharDeviceState chardev_st;
SpiceCharDeviceInstance *chardev_sin;
@@ -49,11 +49,6 @@ typedef struct UsbRedirState {
int rcv_buf_in_use;
} UsbRedirState;
-typedef struct UsbRedirChannel {
- RedChannel base;
- UsbRedirState *state;
-} UsbRedirChannel;
-
static void usbredir_chardev_wakeup(SpiceCharDeviceInstance *sin)
{
UsbRedirState *state;
@@ -70,7 +65,7 @@ static void usbredir_chardev_wakeup(SpiceCharDeviceInstance *sin)
do {
if (!state->pipe_item) {
state->pipe_item = spice_malloc(sizeof(UsbRedirPipeItem));
- red_channel_pipe_item_init(state->rcc->channel,
+ red_channel_pipe_item_init(&state->channel,
&state->pipe_item->base, 0);
}
@@ -100,7 +95,7 @@ static void usbredir_red_channel_client_on_disconnect(RedChannelClient *rcc)
return;
}
- state = SPICE_CONTAINEROF(rcc->channel, UsbRedirChannel, base)->state;
+ state = SPICE_CONTAINEROF(rcc->channel, UsbRedirState, channel);
sin = state->chardev_sin;
sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
@@ -118,7 +113,7 @@ static int usbredir_red_channel_client_handle_message(RedChannelClient *rcc,
SpiceCharDeviceInstance *sin;
SpiceCharDeviceInterface *sif;
- state = SPICE_CONTAINEROF(rcc->channel, UsbRedirChannel, base)->state;
+ state = SPICE_CONTAINEROF(rcc->channel, UsbRedirState, channel);
sin = state->chardev_sin;
sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
@@ -141,7 +136,7 @@ static uint8_t *usbredir_red_channel_alloc_msg_rcv_buf(RedChannelClient *rcc,
{
UsbRedirState *state;
- state = SPICE_CONTAINEROF(rcc->channel, UsbRedirChannel, base)->state;
+ state = SPICE_CONTAINEROF(rcc->channel, UsbRedirState, channel);
assert(!state->rcv_buf_in_use);
@@ -160,7 +155,7 @@ static void usbredir_red_channel_release_msg_rcv_buf(RedChannelClient *rcc,
{
UsbRedirState *state;
- state = SPICE_CONTAINEROF(rcc->channel, UsbRedirChannel, base)->state;
+ state = SPICE_CONTAINEROF(rcc->channel, UsbRedirState, channel);
/* NOOP, we re-use the buffer every time and only free it on destruction */
state->rcv_buf_in_use = 0;
@@ -195,12 +190,10 @@ static void usbredir_connect(RedChannel *channel, RedClient *client,
{
RedChannelClient *rcc;
UsbRedirState *state;
- UsbRedirChannel *redir_chan;
SpiceCharDeviceInstance *sin;
SpiceCharDeviceInterface *sif;
- redir_chan = SPICE_CONTAINEROF(channel, UsbRedirChannel, base);
- state = redir_chan->state;
+ state = SPICE_CONTAINEROF(channel, UsbRedirState, channel);
sin = state->chardev_sin;
sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
@@ -234,7 +227,6 @@ int usbredir_device_connect(SpiceCharDeviceInstance *sin)
{
static int id = 0;
UsbRedirState *state;
- UsbRedirChannel *redir_chan;
ChannelCbs channel_cbs = {0,};
ClientCbs client_cbs = {0,};
@@ -246,28 +238,25 @@ int usbredir_device_connect(SpiceCharDeviceInstance *sin)
channel_cbs.alloc_recv_buf = usbredir_red_channel_alloc_msg_rcv_buf;
channel_cbs.release_recv_buf = usbredir_red_channel_release_msg_rcv_buf;
- redir_chan = (UsbRedirChannel*)red_channel_create(sizeof(UsbRedirChannel),
- core, SPICE_CHANNEL_USBREDIR, id++,
- FALSE /* migration - TODO?*/,
- FALSE /* handle_acks */,
- usbredir_red_channel_client_handle_message,
- &channel_cbs);
- red_channel_init_outgoing_messages_window(&redir_chan->base);
- state = spice_new0(UsbRedirState, 1);
- state->channel = &redir_chan->base;
+ state = (UsbRedirState*)red_channel_create(sizeof(UsbRedirState),
+ core, SPICE_CHANNEL_USBREDIR, id++,
+ FALSE /* migration - TODO? */,
+ FALSE /* handle_acks */,
+ usbredir_red_channel_client_handle_message,
+ &channel_cbs);
+ red_channel_init_outgoing_messages_window(&state->channel);
state->chardev_st.wakeup = usbredir_chardev_wakeup;
state->chardev_sin = sin;
state->rcv_buf = spice_malloc(BUF_SIZE);
state->rcv_buf_size = BUF_SIZE;
- redir_chan->state = state;
client_cbs.connect = usbredir_connect;
client_cbs.migrate = usbredir_migrate;
- red_channel_register_client_cbs(&redir_chan->base, &client_cbs);
+ red_channel_register_client_cbs(&state->channel, &client_cbs);
sin->st = &state->chardev_st;
- reds_register_channel(&redir_chan->base);
+ reds_register_channel(&state->channel);
return 0;
}
@@ -279,13 +268,9 @@ void usbredir_device_disconnect(SpiceCharDeviceInstance *sin)
state = SPICE_CONTAINEROF(sin->st, UsbRedirState, chardev_st);
- reds_unregister_channel(state->channel);
-
- red_channel_client_destroy(state->rcc);
- red_channel_disconnect(state->channel);
+ reds_unregister_channel(&state->channel);
free(state->pipe_item);
free(state->rcv_buf);
- free(state->channel);
- free(state);
+ red_channel_destroy(&state->channel);
}