[Spice-devel] [PATCH spice-server v2 1/2] char-device: Don't use RedClient API
Frediano Ziglio
fziglio at redhat.com
Wed Jun 19 10:07:08 UTC 2019
ping the series
>
> RedClient was an opaque structure for RedCharDevice.
> It started to be used when RedsState started to contain all
> the global state.
> Make it opaque again using a new RedCharDeviceClientOpaque.
> The RedCharDeviceClientOpaque define in the header allows users
> of the class to override the type to get a more safe type
> than RedClient.
> The define at the beginning of C file is to make sure we don't
> use the opaque type as a specific one.
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> server/char-device.c | 52 ++++++++++++++++++++++++--------------------
> server/char-device.h | 22 +++++++++++--------
> 2 files changed, 42 insertions(+), 32 deletions(-)
>
> This patch was named "char-device: Make RedClient an opaque structure again"
>
> diff --git a/server/char-device.c b/server/char-device.c
> index 9ee255664..82255e811 100644
> --- a/server/char-device.c
> +++ b/server/char-device.c
> @@ -22,8 +22,12 @@
>
> #include <config.h>
> #include <inttypes.h>
> +
> +
> +typedef struct RedCharDeviceClientOpaque RedCharDeviceClientOpaque;
> +#define RedCharDeviceClientOpaque RedCharDeviceClientOpaque
> +
> #include "char-device.h"
> -#include "red-client.h"
> #include "reds.h"
> #include "glib-compat.h"
>
> @@ -39,7 +43,7 @@ typedef enum {
> } WriteBufferOrigin;
>
> struct RedCharDeviceWriteBufferPrivate {
> - RedClient *client; /* The client that sent the message to the device.
> + RedCharDeviceClientOpaque *client; /* The client that sent the message
> to the device.
> NULL if the server created the message */
> WriteBufferOrigin origin;
> uint32_t token_price;
> @@ -49,7 +53,7 @@ struct RedCharDeviceWriteBufferPrivate {
> typedef struct RedCharDeviceClient RedCharDeviceClient;
> struct RedCharDeviceClient {
> RedCharDevice *dev;
> - RedClient *client;
> + RedCharDeviceClientOpaque *client;
> int do_flow_control;
> uint64_t num_client_tokens;
> uint64_t num_client_tokens_free; /* client messages that were consumed
> by the device */
> @@ -108,7 +112,7 @@ red_char_device_read_one_msg_from_device(RedCharDevice
> *dev)
> static void
> red_char_device_send_msg_to_client(RedCharDevice *dev,
> RedPipeItem *msg,
> - RedClient *client)
> + RedCharDeviceClientOpaque *client)
> {
> RedCharDeviceClass *klass = RED_CHAR_DEVICE_GET_CLASS(dev);
>
> @@ -117,7 +121,7 @@ red_char_device_send_msg_to_client(RedCharDevice *dev,
>
> static void
> red_char_device_send_tokens_to_client(RedCharDevice *dev,
> - RedClient *client,
> + RedCharDeviceClientOpaque *client,
> uint32_t tokens)
> {
> RedCharDeviceClass *klass = RED_CHAR_DEVICE_GET_CLASS(dev);
> @@ -140,7 +144,7 @@ red_char_device_on_free_self_token(RedCharDevice *dev)
> }
>
> static void
> -red_char_device_remove_client(RedCharDevice *dev, RedClient *client)
> +red_char_device_remove_client(RedCharDevice *dev, RedCharDeviceClientOpaque
> *client)
> {
> RedCharDeviceClass *klass = RED_CHAR_DEVICE_GET_CLASS(dev);
>
> @@ -222,7 +226,7 @@ static void
> red_char_device_handle_client_overflow(RedCharDeviceClient *dev_clie
> }
>
> static RedCharDeviceClient *red_char_device_client_find(RedCharDevice *dev,
> - RedClient *client)
> +
> RedCharDeviceClientOpaque
> *client)
> {
> GList *item;
>
> @@ -400,7 +404,7 @@ static void
> red_char_device_send_to_client_tokens_absorb(RedCharDeviceClient *de
> }
>
> void red_char_device_send_to_client_tokens_add(RedCharDevice *dev,
> - RedClient *client,
> + RedCharDeviceClientOpaque
> *client,
> uint32_t tokens)
> {
> RedCharDeviceClient *dev_client;
> @@ -415,7 +419,7 @@ void
> red_char_device_send_to_client_tokens_add(RedCharDevice *dev,
> }
>
> void red_char_device_send_to_client_tokens_set(RedCharDevice *dev,
> - RedClient *client,
> + RedCharDeviceClientOpaque
> *client,
> uint32_t tokens)
> {
> RedCharDeviceClient *dev_client;
> @@ -534,7 +538,7 @@ static void red_char_device_write_retry(void *opaque)
> }
>
> static RedCharDeviceWriteBuffer *
> -red_char_device_write_buffer_get(RedCharDevice *dev, RedClient *client, int
> size,
> +red_char_device_write_buffer_get(RedCharDevice *dev,
> RedCharDeviceClientOpaque *client, int size,
> WriteBufferOrigin origin, int
> migrated_data_tokens)
> {
> RedCharDeviceWriteBuffer *ret;
> @@ -598,7 +602,7 @@ error:
> }
>
> RedCharDeviceWriteBuffer
> *red_char_device_write_buffer_get_client(RedCharDevice *dev,
> - RedClient
> *client,
> +
> RedCharDeviceClientOpaque
> *client,
> int size)
> {
> spice_assert(client);
> @@ -658,7 +662,7 @@ void red_char_device_write_buffer_release(RedCharDevice
> *dev,
>
> WriteBufferOrigin buf_origin = write_buf->priv->origin;
> uint32_t buf_token_price = write_buf->priv->token_price;
> - RedClient *client = write_buf->priv->client;
> + RedCharDeviceClientOpaque *client = write_buf->priv->client;
>
> if (!dev) {
> g_warning("no device. write buffer is freed");
> @@ -703,11 +707,13 @@ void red_char_device_destroy(RedCharDevice *char_dev)
> g_object_unref(char_dev);
> }
>
> -static RedCharDeviceClient *red_char_device_client_new(RedClient *client,
> - int do_flow_control,
> - uint32_t
> max_send_queue_size,
> - uint32_t
> num_client_tokens,
> - uint32_t
> num_send_tokens)
> +static RedCharDeviceClient *
> +red_char_device_client_new(RedsState *reds,
> + RedCharDeviceClientOpaque *client,
> + int do_flow_control,
> + uint32_t max_send_queue_size,
> + uint32_t num_client_tokens,
> + uint32_t num_send_tokens)
> {
> RedCharDeviceClient *dev_client;
>
> @@ -717,8 +723,6 @@ static RedCharDeviceClient
> *red_char_device_client_new(RedClient *client,
> dev_client->max_send_queue_size = max_send_queue_size;
> dev_client->do_flow_control = do_flow_control;
> if (do_flow_control) {
> - RedsState *reds = red_client_get_server(client);
> -
> dev_client->wait_for_tokens_timer =
> reds_core_timer_add(reds, device_client_wait_for_tokens_timeout,
> dev_client);
> @@ -736,7 +740,7 @@ static RedCharDeviceClient
> *red_char_device_client_new(RedClient *client,
> }
>
> bool red_char_device_client_add(RedCharDevice *dev,
> - RedClient *client,
> + RedCharDeviceClientOpaque *client,
> int do_flow_control,
> uint32_t max_send_queue_size,
> uint32_t num_client_tokens,
> @@ -757,7 +761,9 @@ bool red_char_device_client_add(RedCharDevice *dev,
> dev->priv->wait_for_migrate_data = wait_for_migrate_data;
>
> spice_debug("char device %p, client %p", dev, client);
> - dev_client = red_char_device_client_new(client, do_flow_control,
> + dev_client = red_char_device_client_new(dev->priv->reds,
> + client,
> + do_flow_control,
> max_send_queue_size,
> num_client_tokens,
> num_send_tokens);
> @@ -769,7 +775,7 @@ bool red_char_device_client_add(RedCharDevice *dev,
> }
>
> void red_char_device_client_remove(RedCharDevice *dev,
> - RedClient *client)
> + RedCharDeviceClientOpaque *client)
> {
> RedCharDeviceClient *dev_client;
>
> @@ -796,7 +802,7 @@ void red_char_device_client_remove(RedCharDevice *dev,
> }
>
> int red_char_device_client_exists(RedCharDevice *dev,
> - RedClient *client)
> + RedCharDeviceClientOpaque *client)
> {
> return (red_char_device_client_find(dev, client) != NULL);
> }
> diff --git a/server/char-device.h b/server/char-device.h
> index 32ee4f78a..9d4cf9d92 100644
> --- a/server/char-device.h
> +++ b/server/char-device.h
> @@ -38,6 +38,10 @@ typedef struct SpiceCharDeviceState RedCharDevice;
> typedef struct RedCharDeviceClass RedCharDeviceClass;
> typedef struct RedCharDevicePrivate RedCharDevicePrivate;
>
> +#ifndef RedCharDeviceClientOpaque
> +#define RedCharDeviceClientOpaque RedClient
> +#endif
> +
> /* 'SpiceCharDeviceState' name is used for consistency with what
> spice-char.h exports */
> struct SpiceCharDeviceState
> {
> @@ -62,12 +66,12 @@ struct RedCharDeviceClass
> /* after this call, the message is unreferenced */
> void (*send_msg_to_client)(RedCharDevice *self,
> RedPipeItem *msg,
> - RedClient *client);
> + RedCharDeviceClientOpaque *client);
>
> /* The cb is called when a predefined number of write buffers were
> consumed by the
> * device */
> void (*send_tokens_to_client)(RedCharDevice *self,
> - RedClient *client,
> + RedCharDeviceClientOpaque *client,
> uint32_t tokens);
>
> /* The cb is called when a server (self) message that was addressed to
> the device,
> @@ -77,7 +81,7 @@ struct RedCharDeviceClass
> /* This cb is called if it is recommended to remove the client
> * due to slow flow or due to some other error.
> * The called instance should disconnect the client, or at least the
> corresponding channel */
> - void (*remove_client)(RedCharDevice *self, RedClient *client);
> + void (*remove_client)(RedCharDevice *self, RedCharDeviceClientOpaque
> *client);
>
> /* This cb is called when device receives an event */
> void (*port_event)(RedCharDevice *self, uint8_t event);
> @@ -188,7 +192,7 @@ void red_char_device_reset(RedCharDevice *dev);
> /* max_send_queue_size = how many messages we can read from the device and
> enqueue for this client,
> * when we have tokens for other clients and no tokens for this one */
> bool red_char_device_client_add(RedCharDevice *dev,
> - RedClient *client,
> + RedCharDeviceClientOpaque *client,
> int do_flow_control,
> uint32_t max_send_queue_size,
> uint32_t num_client_tokens,
> @@ -196,9 +200,9 @@ bool red_char_device_client_add(RedCharDevice *dev,
> int wait_for_migrate_data);
>
> void red_char_device_client_remove(RedCharDevice *dev,
> - RedClient *client);
> + RedCharDeviceClientOpaque *client);
> int red_char_device_client_exists(RedCharDevice *dev,
> - RedClient *client);
> + RedCharDeviceClientOpaque *client);
>
> void red_char_device_start(RedCharDevice *dev);
> void red_char_device_stop(RedCharDevice *dev);
> @@ -209,17 +213,17 @@ SpiceServer* red_char_device_get_server(RedCharDevice
> *dev);
> void red_char_device_wakeup(RedCharDevice *dev);
>
> void red_char_device_send_to_client_tokens_add(RedCharDevice *dev,
> - RedClient *client,
> + RedCharDeviceClientOpaque
> *client,
> uint32_t tokens);
>
>
> void red_char_device_send_to_client_tokens_set(RedCharDevice *dev,
> - RedClient *client,
> + RedCharDeviceClientOpaque
> *client,
> uint32_t tokens);
> /** Write to device **/
>
> RedCharDeviceWriteBuffer
> *red_char_device_write_buffer_get_client(RedCharDevice *dev,
> - RedClient
> *client,
> +
> RedCharDeviceClientOpaque
> *client,
> int size);
>
> /* Returns NULL if use_token == true and no tokens are available */
More information about the Spice-devel
mailing list