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@xxxxxxxxxx> > --- > 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 */ _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel