summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2011-08-22 15:36:56 +0100
committerAlon Levy <alevy@redhat.com>2011-08-23 18:28:59 +0300
commit9255515c15e4c322c35395b31e056a807b389289 (patch)
treebaec5606e52ef853c974d07af04f6cd96bc6008c /server
parent439993d7882bc5a9b1055553f30b8b18140b7f0d (diff)
downloadspice-9255515c15e4c322c35395b31e056a807b389289.tar.gz
spice-9255515c15e4c322c35395b31e056a807b389289.tar.xz
spice-9255515c15e4c322c35395b31e056a807b389289.zip
server/snd_worker.c: add red_channel_client_destroy_dummy
Diffstat (limited to 'server')
-rw-r--r--server/red_channel.c36
-rw-r--r--server/red_channel.h1
-rw-r--r--server/snd_worker.c1
3 files changed, 23 insertions, 15 deletions
diff --git a/server/red_channel.c b/server/red_channel.c
index 3f47f7f7..87320b47 100644
--- a/server/red_channel.c
+++ b/server/red_channel.c
@@ -403,21 +403,6 @@ error:
return NULL;
}
-
-RedChannelClient *red_channel_client_create_dummy(int size,
- RedChannel *channel,
- RedClient *client)
-{
- RedChannelClient *rcc;
-
- ASSERT(size >= sizeof(RedChannelClient));
- rcc = spice_malloc0(size);
- rcc->client = client;
- rcc->channel = channel;
- red_channel_add_client(channel, rcc);
- return rcc;
-}
-
static void red_channel_client_default_connect(RedChannel *channel, RedClient *client,
RedsStream *stream,
int migration,
@@ -951,6 +936,7 @@ static void red_channel_remove_client(RedChannelClient *rcc)
{
ASSERT(pthread_equal(pthread_self(), rcc->channel->thread_id));
ring_remove(&rcc->channel_link);
+ ASSERT(rcc->channel->clients_num > 0);
rcc->channel->clients_num--;
// TODO: should we set rcc->channel to NULL???
}
@@ -990,6 +976,26 @@ void red_channel_disconnect(RedChannel *channel)
}
}
+RedChannelClient *red_channel_client_create_dummy(int size,
+ RedChannel *channel,
+ RedClient *client)
+{
+ RedChannelClient *rcc;
+
+ ASSERT(size >= sizeof(RedChannelClient));
+ rcc = spice_malloc0(size);
+ rcc->client = client;
+ rcc->channel = channel;
+ red_channel_add_client(channel, rcc);
+ return rcc;
+}
+
+void red_channel_client_destroy_dummy(RedChannelClient *rcc)
+{
+ red_channel_remove_client(rcc);
+ free(rcc);
+}
+
void red_channel_apply_clients(RedChannel *channel, channel_client_callback cb)
{
RingItem *link;
diff --git a/server/red_channel.h b/server/red_channel.h
index daee8bae..a24ff7db 100644
--- a/server/red_channel.h
+++ b/server/red_channel.h
@@ -278,6 +278,7 @@ RedChannel *red_channel_create_dummy(int size, uint32_t type, uint32_t id);
RedChannelClient *red_channel_client_create_dummy(int size,
RedChannel *channel,
RedClient *client);
+void red_channel_client_destroy_dummy(RedChannelClient *rcc);
int red_channel_is_connected(RedChannel *channel);
diff --git a/server/snd_worker.c b/server/snd_worker.c
index 4c9a6f01..08947859 100644
--- a/server/snd_worker.c
+++ b/server/snd_worker.c
@@ -216,6 +216,7 @@ static void snd_disconnect_channel(SndChannel *channel)
}
channel->cleanup(channel);
worker = channel->worker;
+ red_channel_client_destroy_dummy(worker->connection->channel_client);
worker->connection = NULL;
core->watch_remove(channel->stream->watch);
channel->stream->watch = NULL;