[Spice-devel] [PATCH spice-server] char-device: Make RedClient an opaque structure again
Frediano Ziglio
fziglio at redhat.com
Wed Mar 27 08:24:31 UTC 2019
ping
> >
> > On Tue, Mar 12, 2019 at 05:58:40AM -0400, Frediano Ziglio wrote:
> > > ping
> > >
> > > >
> > > > 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.
> >
> > It seems we don't put the same meaning to 'opaque'. For me, RedClient is
> > already an opaque structure from a char-device.c perspective as it's not
> > dereferencing RedClient * (ie it does not know/care which fields are
> > defined in struct RedClient).
> >
>
> Maybe "generic" ? Anything ?
> The idea was to have a "RedCharDeviceClientOpaque" pointer with
> RedCharDeviceClientOpaque as a typename so you could have something
> like
>
> #ifndef RedCharDeviceClientOpaque
> typedef struct RedCharDeviceClientOpaque RedCharDeviceClientOpaque;
> #define RedCharDeviceClientOpaque RedCharDeviceClientOpaque
> #endif
>
> in char-device.h
>
> > This commit goes further than that as it removes any calls to
> > red_client_* API. char-device.c still cares that it is handling a
> > pointer to a RedClient * (as opposed to a gpointer client_handle which
> > could be anything). Do you have some longer term goal with respect to
> > RedClient and RedCharDevice, or is this just an isolated patch?
> >
>
> I have a follow up that uses RedChannelClient as RedCharDeviceClientOpaque
> instead.
> But I still not decided the future plan but this way I can change to
> RedChannel without touching RedCharDevice. There are parts of the code
> handling multi-channel while other parts are broken in this respect.
> Personally I think multi-channel does not make sense for this object.
> Also token handling is broken (unlimited queue) and only used for the
> agent.
> I started splitting the agent which seemed to make more sense.
> It is getting into shape and I think it would help defining what to do
> with RedCharDevice. But time is scarce and progress is slow.
>
> > Christophe
> >
> >
> > > >
> > > > Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> > > > ---
> > > > server/char-device.c | 16 +++++++---------
> > > > 1 file changed, 7 insertions(+), 9 deletions(-)
> > > >
> > > > diff --git a/server/char-device.c b/server/char-device.c
> > > > index 040b91147..465c1a125 100644
> > > > --- a/server/char-device.c
> > > > +++ b/server/char-device.c
> > > > @@ -22,8 +22,8 @@
> > > >
> > > > #include <config.h>
> > > > #include <inttypes.h>
> > > > +
> > > > #include "char-device.h"
> > > > -#include "red-client.h"
> > > > #include "reds.h"
> > > > #include "glib-compat.h"
> > > >
> > > > @@ -703,11 +703,10 @@ 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, RedClient *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 +716,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);
> > > > @@ -757,7 +754,8 @@ 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);
More information about the Spice-devel
mailing list