[Spice-devel] [PATCH 07/10] server: make cursor channel private
Christophe Fergeau
cfergeau at redhat.com
Tue Nov 3 09:08:55 PST 2015
On Mon, Nov 02, 2015 at 09:56:03AM +0000, Frediano Ziglio wrote:
> From: Marc-André Lureau <marcandre.lureau at gmail.com>
>
> ---
> server/cursor-channel.c | 24 +++++++++++-
> server/cursor-channel.h | 18 ++-------
> server/red_channel.c | 12 ++++++
> server/red_channel.h | 6 +++
> server/red_worker.c | 98 ++++++++++++++++++++++---------------------------
> server/red_worker.h | 5 +++
> 6 files changed, 92 insertions(+), 71 deletions(-)
>
> diff --git a/server/cursor-channel.c b/server/cursor-channel.c
> index 6a1fcea..3ae7756 100644
> --- a/server/cursor-channel.c
> +++ b/server/cursor-channel.c
> @@ -19,6 +19,21 @@
> #include "common/generated_server_marshallers.h"
> #include "cursor-channel.h"
>
> +struct CursorChannel {
> + CommonChannel common; // Must be the first thing
> +
> + CursorItem *item;
> + int cursor_visible;
> + SpicePoint16 cursor_position;
> + uint16_t cursor_trail_length;
> + uint16_t cursor_trail_frequency;
> + uint32_t mouse_mode;
> +
> +#ifdef RED_STATISTICS
> + StatNodeRef stat;
> +#endif
> +};
> +
> #define RCC_TO_CCC(rcc) SPICE_CONTAINEROF((rcc), CursorChannelClient, common.base)
>
> #define CLIENT_CURSOR_CACHE
> @@ -372,7 +387,7 @@ CursorChannel* cursor_channel_new(RedWorker *worker)
> };
>
> spice_info("create cursor channel");
> - channel = red_worker_new_channel(worker, sizeof(CursorChannel),
> + channel = red_worker_new_channel(worker, sizeof(CursorChannel), "cursor_channel",
> SPICE_CHANNEL_CURSOR, 0,
> &cbs, red_channel_client_handle_message);
>
> @@ -480,3 +495,10 @@ void cursor_channel_reset(CursorChannel *cursor)
> }
> }
> }
> +
> +void cursor_channel_set_mouse_mode(CursorChannel *cursor, uint32_t mode)
> +{
> + spice_return_if_fail(cursor);
> +
> + cursor->mouse_mode = mode;
> +}
> diff --git a/server/cursor-channel.h b/server/cursor-channel.h
> index 1639cf9..d5e5b13 100644
> --- a/server/cursor-channel.h
> +++ b/server/cursor-channel.h
> @@ -38,6 +38,8 @@ enum {
> PIPE_ITEM_TYPE_INVAL_CURSOR_CACHE,
> };
>
> +typedef struct CursorChannel CursorChannel;
> +
> typedef struct CursorItem {
> QXLInstance *qxl;
> uint32_t group_id;
> @@ -67,21 +69,6 @@ typedef struct CursorChannelClient {
> uint32_t cursor_cache_items;
> } CursorChannelClient;
>
> -typedef struct CursorChannel {
> - CommonChannel common; // Must be the first thing
> -
> - CursorItem *item;
> - int cursor_visible;
> - SpicePoint16 cursor_position;
> - uint16_t cursor_trail_length;
> - uint16_t cursor_trail_frequency;
> - uint32_t mouse_mode;
> -
> -#ifdef RED_STATISTICS
> - StatNodeRef stat;
> -#endif
> -} CursorChannel;
> -
> G_STATIC_ASSERT(sizeof(CursorItem) <= QXL_CURSUR_DEVICE_DATA_SIZE);
>
> CursorChannel* cursor_channel_new (RedWorker *worker);
> @@ -89,6 +76,7 @@ void cursor_channel_disconnect (CursorChannel *cursor_channel);
> void cursor_channel_reset (CursorChannel *cursor);
> void cursor_channel_process_cmd (CursorChannel *cursor, RedCursorCmd *cursor_cmd,
> uint32_t group_id);
> +void cursor_channel_set_mouse_mode(CursorChannel *cursor, uint32_t mode);
>
> CursorChannelClient* cursor_channel_client_new(CursorChannel *cursor,
> RedClient *client, RedsStream *stream,
> diff --git a/server/red_channel.c b/server/red_channel.c
> index 34aa9dc..7330ae2 100644
> --- a/server/red_channel.c
> +++ b/server/red_channel.c
> @@ -1151,9 +1151,21 @@ RedChannel *red_channel_create_parser(int size,
> }
> channel->incoming_cb.handle_parsed = (handle_parsed_proc)handle_parsed;
> channel->incoming_cb.parser = parser;
> +
> return channel;
> }
>
> +void red_channel_set_stat_node(RedChannel *channel, StatNodeRef stat)
> +{
> + spice_return_if_fail(channel != NULL);
> + spice_return_if_fail(channel->stat == 0);
> +
> +#ifdef RED_STATISTICS
> + channel->stat = stat;
> + channel->out_bytes_counter = stat_add_counter(stat, "out_bytes", TRUE);
> +#endif
> +}
> +
> void red_channel_register_client_cbs(RedChannel *channel, ClientCbs *client_cbs)
> {
> spice_assert(client_cbs->connect || channel->type == SPICE_CHANNEL_MAIN);
> diff --git a/server/red_channel.h b/server/red_channel.h
> index 1f1538e..201a4d2 100644
> --- a/server/red_channel.h
> +++ b/server/red_channel.h
> @@ -32,6 +32,7 @@
> #include "red_common.h"
> #include "demarshallers.h"
> #include "reds_stream.h"
> +#include "stat.h"
>
> #define MAX_SEND_BUFS 1000
> #define CLIENT_ACK_WINDOW 20
> @@ -127,6 +128,7 @@ typedef struct OutgoingHandler {
>
> /* Red Channel interface */
>
> +typedef struct RedsStream RedsStream;
> typedef struct RedChannel RedChannel;
> typedef struct RedChannelClient RedChannelClient;
> typedef struct RedClient RedClient;
> @@ -335,10 +337,13 @@ struct RedChannel {
> // TODO: when different channel_clients are in different threads from Channel -> need to protect!
> pthread_t thread_id;
> #ifdef RED_STATISTICS
> + StatNodeRef stat;
> uint64_t *out_bytes_counter;
> #endif
> };
>
> +#define RED_CHANNEL(Channel) ((RedChannel *)(Channel))
> +
> /*
> * When an error occurs over a channel, we treat it as a warning
> * for spice-server and shutdown the channel.
> @@ -370,6 +375,7 @@ RedChannel *red_channel_create_parser(int size,
> channel_handle_parsed_proc handle_parsed,
> ChannelCbs *channel_cbs,
> uint32_t migration_flags);
> +void red_channel_set_stat_node(RedChannel *channel, StatNodeRef stat);
>
> void red_channel_register_client_cbs(RedChannel *channel, ClientCbs *client_cbs);
> // caps are freed when the channel is destroyed
> diff --git a/server/red_worker.c b/server/red_worker.c
> index 868de94..a99da27 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -390,7 +390,6 @@ struct DisplayChannel {
> RedCompressBuf *free_compress_bufs;
>
> #ifdef RED_STATISTICS
> - StatNodeRef stat;
> uint64_t *cache_hits_counter;
> uint64_t *add_to_cache_counter;
> uint64_t *non_cache_counter;
> @@ -1034,8 +1033,8 @@ static int display_is_connected(RedWorker *worker)
>
> static int cursor_is_connected(RedWorker *worker)
> {
> - return (worker->cursor_channel && red_channel_is_connected(
> - &worker->cursor_channel->common.base));
> + return worker->cursor_channel &&
> + red_channel_is_connected(RED_CHANNEL(worker->cursor_channel));
I think I've already mentioned this before, but introducing these
RED_CHANNEL() macros in a separate patch would make this one much
smaller.
Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20151103/786c6bd4/attachment.sig>
More information about the Spice-devel
mailing list