diff options
author | Alon Levy <alevy@redhat.com> | 2011-04-11 12:44:00 +0300 |
---|---|---|
committer | Alon Levy <alevy@redhat.com> | 2011-08-23 17:56:44 +0300 |
commit | 448ed75bd6c8db7ca48cab8aa1256a262e87fcc0 (patch) | |
tree | 653fa73b47966052cc0cec9184090c0b3349fc89 /server/reds.h | |
parent | 22084c4703282699a34dfb72f3c6318159ddcedf (diff) | |
download | spice-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.h | 6 |
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; |