[Spice-devel] [PATCH 04/14] server: start separate display/cursor channel headers
Fabiano FidĂȘncio
fidencio at redhat.com
Fri Oct 23 06:28:56 PDT 2015
On Fri, Oct 23, 2015 at 3:25 PM, Frediano Ziglio <fziglio at redhat.com> wrote:
>
>>
>> From: Marc-André Lureau <marcandre.lureau at gmail.com>
>>
>> Just move some declarations around
>> ---
>> server/Makefile.am | 2 +
>> server/cursor_channel.h | 62 +++++++++++
>> server/display-channel.h | 211 +++++++++++++++++++++++++++++++++++++
>> server/red_worker.c | 264
>> +----------------------------------------------
>> server/red_worker.h | 20 ++++
>> 5 files changed, 297 insertions(+), 262 deletions(-)
>> create mode 100644 server/cursor_channel.h
>> create mode 100644 server/display-channel.h
>>
>> diff --git a/server/Makefile.am b/server/Makefile.am
>> index cd4686a..a701170 100644
>> --- a/server/Makefile.am
>> +++ b/server/Makefile.am
>> @@ -106,6 +106,8 @@ libspice_server_la_SOURCES = \
>> red_time.h \
>> red_worker.c \
>> red_worker.h \
>> + display-channel.h \
>> + cursor_channel.h \
>
> I think this file should cursor-channel.h as renamed some patches later
Good catch, but here I have to disagree.
I would not start having two "nomenclatures" for files at this point.
The most part of the files are using "_" instead of "-". I would go
for "_" for all of them, including display-channel. :-)
>
>> reds.c \
>> reds.h \
>> reds-private.h \
>> diff --git a/server/cursor_channel.h b/server/cursor_channel.h
>> new file mode 100644
>> index 0000000..0104988
>> --- /dev/null
>> +++ b/server/cursor_channel.h
>> @@ -0,0 +1,62 @@
>> +#ifndef CURSOR_CHANNEL_H_
>> +# define CURSOR_CHANNEL_H_
>> +
>> +#include "red_worker.h"
>> +#include "stat.h"
>> +
>> +#define CLIENT_CURSOR_CACHE_SIZE 256
>> +
>> +#define CURSOR_CACHE_HASH_SHIFT 8
>> +#define CURSOR_CACHE_HASH_SIZE (1 << CURSOR_CACHE_HASH_SHIFT)
>> +#define CURSOR_CACHE_HASH_MASK (CURSOR_CACHE_HASH_SIZE - 1)
>> +#define CURSOR_CACHE_HASH_KEY(id) ((id) & CURSOR_CACHE_HASH_MASK)
>> +
>> +typedef struct CursorItem {
>> + uint32_t group_id;
>> + int refs;
>> + RedCursorCmd *red_cursor;
>> +} CursorItem;
>> +
>> +typedef struct CursorPipeItem {
>> + PipeItem base;
>> + CursorItem *cursor_item;
>> + int refs;
>> +} CursorPipeItem;
>> +
>> +typedef struct LocalCursor {
>> + CursorItem base;
>> + SpicePoint16 position;
>> + uint32_t data_size;
>> + SpiceCursor red_cursor;
>> +} LocalCursor;
>> +
>> +typedef struct CursorChannelClient {
>> + CommonChannelClient common;
>> +
>> + CacheItem *cursor_cache[CURSOR_CACHE_HASH_SIZE];
>> + Ring cursor_cache_lru;
>> + long cursor_cache_available;
>> + uint32_t cursor_cache_items;
>> +} CursorChannelClient;
>> +
>> +typedef struct CursorChannel {
>> + CommonChannel common; // Must be the first thing
>> +
>> +#ifdef RED_STATISTICS
>> + StatNodeRef stat;
>> +#endif
>> +} CursorChannel;
>> +
>> +typedef struct _CursorItem _CursorItem;
>> +
>> +struct _CursorItem {
>> + union {
>> + CursorItem cursor_item;
>> + _CursorItem *next;
>> + } u;
>> +};
>> +
>> +G_STATIC_ASSERT(sizeof(CursorItem) <= QXL_CURSUR_DEVICE_DATA_SIZE);
>> +
>> +
>> +#endif /* CURSOR_CHANNEL_H_ */
>> diff --git a/server/display-channel.h b/server/display-channel.h
>> new file mode 100644
>> index 0000000..ecf764d
>> --- /dev/null
>> +++ b/server/display-channel.h
>> @@ -0,0 +1,211 @@
>> +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
>> +/*
>> + Copyright (C) 2009-2015 Red Hat, Inc.
>> +
>> + This library is free software; you can redistribute it and/or
>> + modify it under the terms of the GNU Lesser General Public
>> + License as published by the Free Software Foundation; either
>> + version 2.1 of the License, or (at your option) any later version.
>> +
>> + This library is distributed in the hope that it will be useful,
>> + but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
>> + Lesser General Public License for more details.
>> +
>> + You should have received a copy of the GNU Lesser General Public
>> + License along with this library; if not, see
>> <http://www.gnu.org/licenses/>.
>> +*/
>> +#ifndef RED_WORKER_CLIENT_H_
>> +# define RED_WORKER_CLIENT_H_
>> +
>> +#include "red_worker.h"
>> +#include "pixmap-cache.h"
>> +
>> +typedef int64_t red_time_t;
>> +
>> +typedef struct Drawable Drawable;
>> +
>> +#define PALETTE_CACHE_HASH_SHIFT 8
>> +#define PALETTE_CACHE_HASH_SIZE (1 << PALETTE_CACHE_HASH_SHIFT)
>> +#define PALETTE_CACHE_HASH_MASK (PALETTE_CACHE_HASH_SIZE - 1)
>> +#define PALETTE_CACHE_HASH_KEY(id) ((id) & PALETTE_CACHE_HASH_MASK)
>> +
>> +/* Each drawable can refer to at most 3 images: src, brush and mask */
>> +#define MAX_DRAWABLE_PIXMAP_CACHE_ITEMS 3
>> +
>> +#define NUM_STREAMS 50
>> +#define NUM_SURFACES 10000
>> +
>> +typedef struct CacheItem CacheItem;
>> +
>> +struct CacheItem {
>> + union {
>> + PipeItem pipe_data;
>> + struct {
>> + RingItem lru_link;
>> + CacheItem *next;
>> + } cache_data;
>> + } u;
>> + uint64_t id;
>> + size_t size;
>> + uint32_t inval_type;
>> +};
>> +
>> +#define RED_COMPRESS_BUF_SIZE (1024 * 64)
>> +typedef struct RedCompressBuf RedCompressBuf;
>> +struct RedCompressBuf {
>> + uint32_t buf[RED_COMPRESS_BUF_SIZE / 4];
>> + RedCompressBuf *next;
>> + RedCompressBuf *send_next;
>> +};
>> +
>> +typedef struct WaitForChannels {
>> + SpiceMsgWaitForChannels header;
>> + SpiceWaitForChannel buf[MAX_CACHE_CLIENTS];
>> +} WaitForChannels;
>> +
>> +typedef struct FreeList {
>> + int res_size;
>> + SpiceResourceList *res;
>> + uint64_t sync[MAX_CACHE_CLIENTS];
>> + WaitForChannels wait;
>> +} FreeList;
>> +
>> +typedef struct GlzSharedDictionary {
>> + RingItem base;
>> + GlzEncDictContext *dict;
>> + uint32_t refs;
>> + uint8_t id;
>> + pthread_rwlock_t encode_lock;
>> + int migrate_freeze;
>> + RedClient *client; // channel clients of the same client share the dict
>> +} GlzSharedDictionary;
>> +
>> +typedef struct {
>> + DisplayChannelClient *dcc;
>> + RedCompressBuf *bufs_head;
>> + RedCompressBuf *bufs_tail;
>> + jmp_buf jmp_env;
>> + union {
>> + struct {
>> + SpiceChunks *chunks;
>> + int next;
>> + int stride;
>> + int reverse;
>> + } lines_data;
>> + struct {
>> + RedCompressBuf* next;
>> + int size_left;
>> + } compressed_data; // for encoding data that was already compressed
>> by another method
>> + } u;
>> + char message_buf[512];
>> +} EncoderData;
>> +
>> +typedef struct {
>> + GlzEncoderUsrContext usr;
>> + EncoderData data;
>> +} GlzData;
>> +
>> +typedef struct Stream Stream;
>> +struct Stream {
>> + uint8_t refs;
>> + Drawable *current;
>> + red_time_t last_time;
>> + int width;
>> + int height;
>> + SpiceRect dest_area;
>> + int top_down;
>> + Stream *next;
>> + RingItem link;
>> +
>> + uint32_t num_input_frames;
>> + uint64_t input_fps_start_time;
>> + uint32_t input_fps;
>> +};
>> +
>> +#define STREAM_STATS
>> +#ifdef STREAM_STATS
>> +typedef struct StreamStats {
>> + uint64_t num_drops_pipe;
>> + uint64_t num_drops_fps;
>> + uint64_t num_frames_sent;
>> + uint64_t num_input_frames;
>> + uint64_t size_sent;
>> +
>> + uint64_t start;
>> + uint64_t end;
>> +} StreamStats;
>> +#endif
>> +
>> +typedef struct StreamAgent {
>> + QRegion vis_region; /* the part of the surface area that is currently
>> occupied by video
>> + fragments */
>> + QRegion clip; /* the current video clipping. It can be different
>> from vis_region:
>> + for example, let c1 be the clip area at time t1,
>> and c2
>> + be the clip area at time t2, where t1 < t2. If c1
>> contains c2, and
>> + at least part of c1/c2, hasn't been covered by a
>> non-video images,
>> + vis_region will contain c2 and also the part of
>> c1/c2 that still
>> + displays fragments of the video */
>> +
>> + PipeItem create_item;
>> + PipeItem destroy_item;
>> + Stream *stream;
>> + uint64_t last_send_time;
>> + MJpegEncoder *mjpeg_encoder;
>> + DisplayChannelClient *dcc;
>> +
>> + int frames;
>> + int drops;
>> + int fps;
>> +
>> + uint32_t report_id;
>> + uint32_t client_required_latency;
>> +#ifdef STREAM_STATS
>> + StreamStats stats;
>> +#endif
>> +} StreamAgent;
>> +
>> +struct DisplayChannelClient {
>> + CommonChannelClient common;
>> +
>> + int expect_init;
>> +
>> + PixmapCache *pixmap_cache;
>> + uint32_t pixmap_cache_generation;
>> + int pending_pixmaps_sync;
>> +
>> + CacheItem *palette_cache[PALETTE_CACHE_HASH_SIZE];
>> + Ring palette_cache_lru;
>> + long palette_cache_available;
>> + uint32_t palette_cache_items;
>> +
>> + struct {
>> + uint32_t stream_outbuf_size;
>> + uint8_t *stream_outbuf; // caution stream buffer is also used as
>> compress bufs!!!
>> +
>> + RedCompressBuf *used_compress_bufs;
>> +
>> + FreeList free_list;
>> + uint64_t pixmap_cache_items[MAX_DRAWABLE_PIXMAP_CACHE_ITEMS];
>> + int num_pixmap_cache_items;
>> + } send_data;
>> +
>> + /* global lz encoding entities */
>> + GlzSharedDictionary *glz_dict;
>> + GlzEncoderContext *glz;
>> + GlzData glz_data;
>> +
>> + Ring glz_drawables; // all the living lz drawable, ordered
>> by encoding time
>> + Ring glz_drawables_inst_to_free; // list of instances to
>> be freed
>> + pthread_mutex_t glz_drawables_inst_to_free_lock;
>> +
>> + uint8_t surface_client_created[NUM_SURFACES];
>> + QRegion surface_client_lossy_region[NUM_SURFACES];
>> +
>> + StreamAgent stream_agents[NUM_STREAMS];
>> + int use_mjpeg_encoder_rate_control;
>> + uint32_t streams_max_latency;
>> + uint64_t streams_max_bit_rate;
>> +};
>> +
>> +#endif /* RED_WORKER_CLIENT_H_ */
>> diff --git a/server/red_worker.c b/server/red_worker.c
>> index b254ee0..4b69a38 100644
>> --- a/server/red_worker.c
>> +++ b/server/red_worker.c
>> @@ -93,6 +93,8 @@
>> #include "spice_bitmap_utils.h"
>> #include "spice_image_cache.h"
>> #include "pixmap-cache.h"
>> +#include "display-channel.h"
>> +#include "cursor_channel.h"
>>
>> //#define COMPRESS_STAT
>> //#define DUMP_BITMAP
>> @@ -127,13 +129,9 @@
>> #define FPS_TEST_INTERVAL 1
>> #define MAX_FPS 30
>>
>> -#define RED_COMPRESS_BUF_SIZE (1024 * 64)
>> -
>> #define ZLIB_DEFAULT_COMPRESSION_LEVEL 3
>> #define MIN_GLZ_SIZE_FOR_ZLIB 100
>>
>> -typedef int64_t red_time_t;
>> -
>> #define VALIDATE_SURFACE_RET(worker, surface_id) \
>> if (!validate_surface(worker, surface_id)) { \
>> rendering_incorrect(__func__); \
>> @@ -300,21 +298,6 @@ typedef struct VerbItem {
>>
>> #define MAX_LZ_ENCODERS MAX_CACHE_CLIENTS
>>
>> -typedef struct CacheItem CacheItem;
>> -
>> -struct CacheItem {
>> - union {
>> - PipeItem pipe_data;
>> - struct {
>> - RingItem lru_link;
>> - CacheItem *next;
>> - } cache_data;
>> - } u;
>> - uint64_t id;
>> - size_t size;
>> - uint32_t inval_type;
>> -};
>> -
>> typedef struct SurfaceCreateItem {
>> SpiceMsgSurfaceCreate surface_create;
>> PipeItem pipe_item;
>> @@ -343,45 +326,13 @@ typedef struct StreamActivateReportItem {
>> uint32_t stream_id;
>> } StreamActivateReportItem;
>>
>> -typedef struct CursorItem {
>> - uint32_t group_id;
>> - int refs;
>> - RedCursorCmd *red_cursor;
>> -} CursorItem;
>> -
>> -typedef struct CursorPipeItem {
>> - PipeItem base;
>> - CursorItem *cursor_item;
>> - int refs;
>> -} CursorPipeItem;
>> -
>> -typedef struct LocalCursor {
>> - CursorItem base;
>> - SpicePoint16 position;
>> - uint32_t data_size;
>> - SpiceCursor red_cursor;
>> -} LocalCursor;
>> -
>> #define MAX_PIPE_SIZE 50
>> -#define CHANNEL_RECEIVE_BUF_SIZE 1024
>>
>> #define WIDE_CLIENT_ACK_WINDOW 40
>> #define NARROW_CLIENT_ACK_WINDOW 20
>>
>> -#define CLIENT_CURSOR_CACHE_SIZE 256
>> -
>> -#define CURSOR_CACHE_HASH_SHIFT 8
>> -#define CURSOR_CACHE_HASH_SIZE (1 << CURSOR_CACHE_HASH_SHIFT)
>> -#define CURSOR_CACHE_HASH_MASK (CURSOR_CACHE_HASH_SIZE - 1)
>> -#define CURSOR_CACHE_HASH_KEY(id) ((id) & CURSOR_CACHE_HASH_MASK)
>> -
>> #define CLIENT_PALETTE_CACHE_SIZE 128
>>
>> -#define PALETTE_CACHE_HASH_SHIFT 8
>> -#define PALETTE_CACHE_HASH_SIZE (1 << PALETTE_CACHE_HASH_SHIFT)
>> -#define PALETTE_CACHE_HASH_MASK (PALETTE_CACHE_HASH_SIZE - 1)
>> -#define PALETTE_CACHE_HASH_KEY(id) ((id) & PALETTE_CACHE_HASH_MASK)
>> -
>> typedef struct ImageItem {
>> PipeItem link;
>> int refs;
>> @@ -397,8 +348,6 @@ typedef struct ImageItem {
>> uint8_t data[0];
>> } ImageItem;
>>
>> -typedef struct Drawable Drawable;
>> -
>> typedef struct DisplayChannel DisplayChannel;
>>
>> enum {
>> @@ -407,65 +356,6 @@ enum {
>> STREAM_FRAME_CONTAINER,
>> };
>>
>> -typedef struct Stream Stream;
>> -struct Stream {
>> - uint8_t refs;
>> - Drawable *current;
>> - red_time_t last_time;
>> - int width;
>> - int height;
>> - SpiceRect dest_area;
>> - int top_down;
>> - Stream *next;
>> - RingItem link;
>> -
>> - uint32_t num_input_frames;
>> - uint64_t input_fps_start_time;
>> - uint32_t input_fps;
>> -};
>> -
>> -#define STREAM_STATS
>> -#ifdef STREAM_STATS
>> -typedef struct StreamStats {
>> - uint64_t num_drops_pipe;
>> - uint64_t num_drops_fps;
>> - uint64_t num_frames_sent;
>> - uint64_t num_input_frames;
>> - uint64_t size_sent;
>> -
>> - uint64_t start;
>> - uint64_t end;
>> -} StreamStats;
>> -#endif
>> -
>> -typedef struct StreamAgent {
>> - QRegion vis_region; /* the part of the surface area that is currently
>> occupied by video
>> - fragments */
>> - QRegion clip; /* the current video clipping. It can be different
>> from vis_region:
>> - for example, let c1 be the clip area at time t1,
>> and c2
>> - be the clip area at time t2, where t1 < t2. If c1
>> contains c2, and
>> - at least part of c1/c2, hasn't been covered by a
>> non-video images,
>> - vis_region will contain c2 and also the part of
>> c1/c2 that still
>> - displays fragments of the video */
>> -
>> - PipeItem create_item;
>> - PipeItem destroy_item;
>> - Stream *stream;
>> - uint64_t last_send_time;
>> - MJpegEncoder *mjpeg_encoder;
>> - DisplayChannelClient *dcc;
>> -
>> - int frames;
>> - int drops;
>> - int fps;
>> -
>> - uint32_t report_id;
>> - uint32_t client_required_latency;
>> -#ifdef STREAM_STATS
>> - StreamStats stats;
>> -#endif
>> -} StreamAgent;
>> -
>> typedef struct StreamClipItem {
>> PipeItem base;
>> int refs;
>> @@ -474,13 +364,6 @@ typedef struct StreamClipItem {
>> SpiceClipRects *rects;
>> } StreamClipItem;
>>
>> -typedef struct RedCompressBuf RedCompressBuf;
>> -struct RedCompressBuf {
>> - uint32_t buf[RED_COMPRESS_BUF_SIZE / 4];
>> - RedCompressBuf *next;
>> - RedCompressBuf *send_next;
>> -};
>> -
>> static const int BITMAP_FMT_IS_PLT[] = {0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0};
>> static const int BITMAP_FMP_BYTES_PER_PIXEL[] = {0, 0, 0, 0, 0, 1, 2, 3, 4,
>> 4, 1};
>>
>> @@ -488,40 +371,6 @@ static const int BITMAP_FMP_BYTES_PER_PIXEL[] = {0, 0,
>> 0, 0, 0, 1, 2, 3, 4, 4, 1
>> (bitmap_fmt_is_rgb(f) && \
>> ((f) != SPICE_BITMAP_FMT_8BIT_A))
>>
>> -#define NUM_STREAMS 50
>> -
>> -typedef struct WaitForChannels {
>> - SpiceMsgWaitForChannels header;
>> - SpiceWaitForChannel buf[MAX_CACHE_CLIENTS];
>> -} WaitForChannels;
>> -
>> -typedef struct FreeList {
>> - int res_size;
>> - SpiceResourceList *res;
>> - uint64_t sync[MAX_CACHE_CLIENTS];
>> - WaitForChannels wait;
>> -} FreeList;
>> -
>> -typedef struct {
>> - DisplayChannelClient *dcc;
>> - RedCompressBuf *bufs_head;
>> - RedCompressBuf *bufs_tail;
>> - jmp_buf jmp_env;
>> - union {
>> - struct {
>> - SpiceChunks *chunks;
>> - int next;
>> - int stride;
>> - int reverse;
>> - } lines_data;
>> - struct {
>> - RedCompressBuf* next;
>> - int size_left;
>> - } compressed_data; // for encoding data that was already compressed
>> by another method
>> - } u;
>> - char message_buf[512];
>> -} EncoderData;
>> -
>> typedef struct {
>> QuicUsrContext usr;
>> EncoderData data;
>> @@ -533,11 +382,6 @@ typedef struct {
>> } LzData;
>>
>> typedef struct {
>> - GlzEncoderUsrContext usr;
>> - EncoderData data;
>> -} GlzData;
>> -
>> -typedef struct {
>> JpegEncoderUsrContext usr;
>> EncoderData data;
>> } JpegData;
>> @@ -590,83 +434,6 @@ struct RedGlzDrawable {
>> pthread_mutex_t glz_dictionary_list_lock = PTHREAD_MUTEX_INITIALIZER;
>> Ring glz_dictionary_list = {&glz_dictionary_list, &glz_dictionary_list};
>>
>> -typedef struct GlzSharedDictionary {
>> - RingItem base;
>> - GlzEncDictContext *dict;
>> - uint32_t refs;
>> - uint8_t id;
>> - pthread_rwlock_t encode_lock;
>> - int migrate_freeze;
>> - RedClient *client; // channel clients of the same client share the dict
>> -} GlzSharedDictionary;
>> -
>> -#define NUM_SURFACES 10000
>> -
>> -typedef struct CommonChannel {
>> - RedChannel base; // Must be the first thing
>> - struct RedWorker *worker;
>> - uint8_t recv_buf[CHANNEL_RECEIVE_BUF_SIZE];
>> - uint32_t id_alloc; // bitfield. TODO - use this instead of shift scheme.
>> - int during_target_migrate; /* TRUE when the client that is associated
>> with the channel
>> - is during migration. Turned off when the
>> vm is started.
>> - The flag is used to avoid sending messages
>> that are artifacts
>> - of the transition from stopped vm to
>> loaded vm (e.g., recreation
>> - of the primary surface) */
>> -} CommonChannel;
>> -
>> -typedef struct CommonChannelClient {
>> - RedChannelClient base;
>> - uint32_t id;
>> - struct RedWorker *worker;
>> - int is_low_bandwidth;
>> -} CommonChannelClient;
>> -
>> -/* Each drawable can refer to at most 3 images: src, brush and mask */
>> -#define MAX_DRAWABLE_PIXMAP_CACHE_ITEMS 3
>> -
>> -struct DisplayChannelClient {
>> - CommonChannelClient common;
>> -
>> - int expect_init;
>> -
>> - PixmapCache *pixmap_cache;
>> - uint32_t pixmap_cache_generation;
>> - int pending_pixmaps_sync;
>> -
>> - CacheItem *palette_cache[PALETTE_CACHE_HASH_SIZE];
>> - Ring palette_cache_lru;
>> - long palette_cache_available;
>> - uint32_t palette_cache_items;
>> -
>> - struct {
>> - uint32_t stream_outbuf_size;
>> - uint8_t *stream_outbuf; // caution stream buffer is also used as
>> compress bufs!!!
>> -
>> - RedCompressBuf *used_compress_bufs;
>> -
>> - FreeList free_list;
>> - uint64_t pixmap_cache_items[MAX_DRAWABLE_PIXMAP_CACHE_ITEMS];
>> - int num_pixmap_cache_items;
>> - } send_data;
>> -
>> - /* global lz encoding entities */
>> - GlzSharedDictionary *glz_dict;
>> - GlzEncoderContext *glz;
>> - GlzData glz_data;
>> -
>> - Ring glz_drawables; // all the living lz drawable, ordered
>> by encoding time
>> - Ring glz_drawables_inst_to_free; // list of instances to
>> be freed
>> - pthread_mutex_t glz_drawables_inst_to_free_lock;
>> -
>> - uint8_t surface_client_created[NUM_SURFACES];
>> - QRegion surface_client_lossy_region[NUM_SURFACES];
>> -
>> - StreamAgent stream_agents[NUM_STREAMS];
>> - int use_mjpeg_encoder_rate_control;
>> - uint32_t streams_max_latency;
>> - uint64_t streams_max_bit_rate;
>> -};
>> -
>> struct DisplayChannel {
>> CommonChannel common; // Must be the first thing
>>
>> @@ -694,23 +461,6 @@ struct DisplayChannel {
>> #endif
>> };
>>
>> -typedef struct CursorChannelClient {
>> - CommonChannelClient common;
>> -
>> - CacheItem *cursor_cache[CURSOR_CACHE_HASH_SIZE];
>> - Ring cursor_cache_lru;
>> - long cursor_cache_available;
>> - uint32_t cursor_cache_items;
>> -} CursorChannelClient;
>> -
>> -typedef struct CursorChannel {
>> - CommonChannel common; // Must be the first thing
>> -
>> -#ifdef RED_STATISTICS
>> - StatNodeRef stat;
>> -#endif
>> -} CursorChannel;
>> -
>> enum {
>> TREE_ITEM_TYPE_DRAWABLE,
>> TREE_ITEM_TYPE_CONTAINER,
>> @@ -802,14 +552,6 @@ struct _Drawable {
>> } u;
>> };
>>
>> -typedef struct _CursorItem _CursorItem;
>> -struct _CursorItem {
>> - union {
>> - CursorItem cursor_item;
>> - _CursorItem *next;
>> - } u;
>> -};
>> -
>> typedef struct UpgradeItem {
>> PipeItem base;
>> int refs;
>> @@ -11859,8 +11601,6 @@ RedWorker* red_worker_new(QXLInstance *qxl,
>> RedDispatcher *red_dispatcher)
>> int i;
>> const char *record_filename;
>>
>> - spice_assert(sizeof(CursorItem) <= QXL_CURSUR_DEVICE_DATA_SIZE);
>> -
>> qxl->st->qif->get_init_info(qxl, &init_info);
>>
>> worker = spice_new0(RedWorker, 1);
>> diff --git a/server/red_worker.h b/server/red_worker.h
>> index c1adca4..0f5fac7 100644
>> --- a/server/red_worker.h
>> +++ b/server/red_worker.h
>> @@ -25,6 +25,26 @@
>>
>> typedef struct RedWorker RedWorker;
>>
>> +typedef struct CommonChannelClient {
>> + RedChannelClient base;
>> + uint32_t id;
>> + struct RedWorker *worker;
>> + int is_low_bandwidth;
>> +} CommonChannelClient;
>> +
>> +#define CHANNEL_RECEIVE_BUF_SIZE 1024
>> +typedef struct CommonChannel {
>> + RedChannel base; // Must be the first thing
>> + struct RedWorker *worker;
>> + uint8_t recv_buf[CHANNEL_RECEIVE_BUF_SIZE];
>> + uint32_t id_alloc; // bitfield. TODO - use this instead of shift scheme.
>> + int during_target_migrate; /* TRUE when the client that is associated
>> with the channel
>> + is during migration. Turned off when the
>> vm is started.
>> + The flag is used to avoid sending messages
>> that are artifacts
>> + of the transition from stopped vm to
>> loaded vm (e.g., recreation
>> + of the primary surface) */
>> +} CommonChannel;
>> +
>> RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher);
>> bool red_worker_run(RedWorker *worker);
>>
>
> Beside above rename I would ack
>
> Frediano
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
More information about the Spice-devel
mailing list