summaryrefslogtreecommitdiffstats
path: root/server/reds.h
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2011-04-11 12:44:00 +0300
committerAlon Levy <alevy@redhat.com>2011-08-23 17:56:44 +0300
commit448ed75bd6c8db7ca48cab8aa1256a262e87fcc0 (patch)
tree653fa73b47966052cc0cec9184090c0b3349fc89 /server/reds.h
parent22084c4703282699a34dfb72f3c6318159ddcedf (diff)
downloadspice-448ed75bd6c8db7ca48cab8aa1256a262e87fcc0.tar.gz
spice-448ed75bd6c8db7ca48cab8aa1256a262e87fcc0.tar.xz
spice-448ed75bd6c8db7ca48cab8aa1256a262e87fcc0.zip
server: Add RedClient
That means RedClient tracks a ring of channels. Right now there will be only a single client because of the disconnection mechanism - whenever a new client comes we disconnect all existing clients. But this patch adds already a ring of clients to reds.c (stored in RedServer). There is a known problem handling many connections and disconnections at the same time, trigerrable easily by the following script: export NEW_DISPLAY=:3.0 Xephyr $NEW_DISPLAY -noreset & for ((i = 0 ; i < 5; ++i)); do for ((j = 0 ; j < 10; ++j)); do DISPLAY=$NEW_DISPLAY c_win7x86_qxl_tests & done sleep 2; done I fixed a few of the problems resulting from this in the same patch. This required already introducing a few other changes: * make sure all removal of channels happens in the main thread, for that two additional dispatcher calls are added to remove a specific channel client (RED_WORKER_MESSAGE_CURSOR_DISCONNECT_CLIENT and RED_WORKER_MESSAGE_DISPLAY_DISCONNECT_CLIENT). * change some asserts in input channel. * make main channel disconnect not recursive * introduce disconnect call back to red_channel_create_parser The remaining abort is from a double free in the main channel, still can't find it (doesn't happen when running under valgrind - probably due to the slowness resulting from that), but is easy to see when running under gdb.
Diffstat (limited to 'server/reds.h')
-rw-r--r--server/reds.h6
1 files changed, 4 insertions, 2 deletions
diff --git a/server/reds.h b/server/reds.h
index 4ab7f63d..87737156 100644
--- a/server/reds.h
+++ b/server/reds.h
@@ -35,6 +35,7 @@
#define SPICE_GNUC_VISIBLE __attribute__ ((visibility ("default")))
typedef struct RedsStream RedsStream;
+typedef struct RedClient RedClient;
typedef struct MainChannelClient MainChannelClient;
#if HAVE_SASL
@@ -95,7 +96,8 @@ typedef struct Channel {
uint32_t *common_caps;
int num_caps;
uint32_t *caps;
- void (*link)(struct Channel *, RedsStream *stream, int migration, int num_common_caps,
+ void (*link)(struct Channel *, RedClient *client, RedsStream *stream,
+ int migration, int num_common_caps,
uint32_t *common_caps, int num_caps, uint32_t *caps);
void (*shutdown)(struct Channel *);
void (*migrate)(struct Channel *);
@@ -138,7 +140,7 @@ extern uint64_t bitrate_per_sec;
#define IS_LOW_BANDWIDTH() (bitrate_per_sec < 10 * 1024 * 1024)
// Temporary measures to make splitting reds.c to inputs_channel.c easier
-void reds_disconnect(void);
+void reds_client_disconnect(RedClient *client);
// Temporary (?) for splitting main channel
typedef struct MainMigrateData MainMigrateData;