[Spice-devel] [PATCH spice-server v2 2/3] Dispatcher: typedef enum for dispatcher flags
Jonathon Jongsma
jjongsma at redhat.com
Wed Sep 6 17:03:46 UTC 2017
On Wed, 2017-09-06 at 12:35 -0400, Frediano Ziglio wrote:
> >
> > On Wed, 2017-09-06 at 07:47 -0400, Frediano Ziglio wrote:
> > > >
> > > > dispatcher_register_handler() accepts a flag value that
> > > > determines
> > > > whether the message type requires an ACK or async_done handler.
> > > > This
> > > > parameter was previously just an int. It is now a typedef'ed
> > > > enum:
> > > > DispatcherFlag. The enum values were accordingly renamed:
> > > >
> > > > DISPATCHER_* -> DISPATCHER_FLAG_*
> > > >
> > > > Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
> > >
> > > I honestly much prefer the "ack" field name instead of the
> > > "flag".
> > > "flag" is too generic.
> > >
> > > Maybe when I see ACK I think at TCP and I understand what it
> > > means. Why not instead using this enumeration?
> > >
> > > typedef enum {
> > > DISPATCHER_ACK_NONE = 0,
> > > DISPATCHER_ACK_SYNC,
> > > DISPATCHER_ACK_ASYNC
> > > } DispatcherAck;
> > >
> > > and
> > >
> > > DispatcherAck ack;
> > >
> > > (or ack_type)
> >
> >
> > Yeah, I thought about that. But I felt like the async_done thing
> > was a
> > bit different than an 'ACK'. It allows you to call a function after
> > the
> > message has been handled. But it doesn't really place any
> > restrictions
> > on what that function does. In our case, it ends up calling the
> > QXLInterface::async_complete() function, which might update some
>
> This does not make sense if you are documenting just the Dispatcher,
> what the caller does with the acknowledge is not related,
> this interface just give the opportunity to the user to implement
> any kind of completion. But the implementation yes, does not
> allow the same method for acknowledge which is quite different.
>
> > internal state and trigger an interrupt or something. But that
> > seemed
> > like a bit of a broader concept than an 'ACK' to me. It's more like
> > an
> > async callback.
> >
> > I'm not sure that I'm totally happy with the 'flag' terminology
> > either,
> > but at the time I thought it was better than ACK. But I don't feel
> > too
> > strongly.
> >
>
> Maybe we could use a long "complete_action".. so
>
> typedef enum {
> DISPATCHER_COMPLETE_ACTION_NONE = 0,
> DISPATCHER_COMPLETE_ACTION_SEND_ACK,
> DISPATCHER_COMPLETE_ACTION_ASYNC_CALL
> } DispatcherCompleteAction;
>
> and
>
> DispatcherCompleteAction complete_action;
>
> I know... it's long, but "flag" is way too much generic.
Hmm, it feels a bit unwieldy to me. What about something like
typedef enum {
DISPATCHER_RESPONSE_TYPE_NONE = 0,
DISPATCHER_RESPONSE_TYPE_ACK,
DISPATCHER_RESPONSE_TYPE_ASYNC_CALL
} DispatcherResponseType
Or shorter: DISPATCHER_RESPONSE_* instead of DISPATCHER_RESPONSE_TYPE_*
[OT: it's a little bit unclear to me why the async_done handler is
necessary at all. It is called immediately after the message-specific
handler is called, and it is called from the same thread. So anything
that is done in the async_done callback could just as easily be done in
the message-specific handler, no? I suppose it allows you to reduce
code duplication slightly, but that seems to be the only advantage. If
this async_done feature did not exist, we could simply use a boolean
argument for whether to send an ACK or not, and the enum would be
unnecessary. But maybe I'm missing something.]
>
> > Jonathon
> >
> >
> > >
> > > Frediano
> > >
> > >
> > > > ---
> > > > server/dispatcher.c | 12 ++++-----
> > > > server/dispatcher.h | 20 +++++++--------
> > > > server/red-worker.c | 74
> > > > ++++++++++++++++++++++++++---------------------------
> > > > 3 files changed, 53 insertions(+), 53 deletions(-)
> > > >
> > > > diff --git a/server/dispatcher.c b/server/dispatcher.c
> > > > index 6f2c4d85e..76f5eeaf4 100644
> > > > --- a/server/dispatcher.c
> > > > +++ b/server/dispatcher.c
> > > > @@ -40,7 +40,7 @@ static void setup_dummy_signal_handler(void);
> > > >
> > > > typedef struct DispatcherMessage {
> > > > size_t size;
> > > > - int ack;
> > > > + DispatcherFlag flag;
> > > > dispatcher_handle_message handler;
> > > > } DispatcherMessage;
> > > >
> > > > @@ -303,13 +303,13 @@ static int
> > > > dispatcher_handle_single_read(Dispatcher
> > > > *dispatcher)
> > > > } else {
> > > > spice_printerr("error: no handler for message type
> > > > %d",
> > > > type);
> > > > }
> > > > - if (msg->ack == DISPATCHER_ACK) {
> > > > + if (msg->flag == DISPATCHER_FLAG_ACK) {
> > > > if (write_safe(dispatcher->priv->recv_fd,
> > > > (uint8_t*)&ack, sizeof(ack)) == -1) {
> > > > spice_printerr("error writing ack for message %d",
> > > > type);
> > > > /* TODO: close socketpair? */
> > > > }
> > > > - } else if (msg->ack == DISPATCHER_ASYNC &&
> > > > dispatcher->priv->handle_async_done) {
> > > > + } else if (msg->flag == DISPATCHER_FLAG_ASYNC &&
> > > > dispatcher->priv->handle_async_done) {
> > > > dispatcher->priv->handle_async_done(dispatcher->priv-
> > > > > opaque, type,
> > > >
> > > > payload);
> > > > }
> > > > return 1;
> > > > @@ -346,7 +346,7 @@ void dispatcher_send_message(Dispatcher
> > > > *dispatcher,
> > > > uint32_t message_type,
> > > > message_type);
> > > > goto unlock;
> > > > }
> > > > - if (msg->ack == DISPATCHER_ACK) {
> > > > + if (msg->flag == DISPATCHER_FLAG_ACK) {
> > > > if (read_safe(send_fd, (uint8_t*)&ack, sizeof(ack), 1)
> > > > ==
> > > > -1) {
> > > > spice_printerr("error: failed to read ack");
> > > > } else if (ack != ACK) {
> > > > @@ -369,7 +369,7 @@ void
> > > > dispatcher_register_async_done_callback(
> > > >
> > > > void dispatcher_register_handler(Dispatcher *dispatcher,
> > > > uint32_t
> > > > message_type,
> > > > dispatcher_handle_message
> > > > handler,
> > > > - size_t size, int ack)
> > > > + size_t size, DispatcherFlag
> > > > flag)
> > > > {
> > > > DispatcherMessage *msg;
> > > >
> > > > @@ -378,7 +378,7 @@ void dispatcher_register_handler(Dispatcher
> > > > *dispatcher,
> > > > uint32_t message_type,
> > > > msg = &dispatcher->priv->messages[message_type];
> > > > msg->handler = handler;
> > > > msg->size = size;
> > > > - msg->ack = ack;
> > > > + msg->flag = flag;
> > > > if (msg->size > dispatcher->priv->payload_size) {
> > > > dispatcher->priv->payload = realloc(dispatcher->priv-
> > > > > payload,
> > > >
> > > > msg->size);
> > > > dispatcher->priv->payload_size = msg->size;
> > > > diff --git a/server/dispatcher.h b/server/dispatcher.h
> > > > index 97b01de9c..862fc46b9 100644
> > > > --- a/server/dispatcher.h
> > > > +++ b/server/dispatcher.h
> > > > @@ -72,11 +72,11 @@ typedef void
> > > > (*dispatcher_handle_async_done)(void
> > > > *opaque,
> > > > void dispatcher_send_message(Dispatcher *dispatcher, uint32_t
> > > > message_type,
> > > > void *payload);
> > > >
> > > > -enum {
> > > > - DISPATCHER_NONE = 0,
> > > > - DISPATCHER_ACK,
> > > > - DISPATCHER_ASYNC
> > > > -};
> > > > +typedef enum {
> > > > + DISPATCHER_FLAG_NONE = 0,
> > > > + DISPATCHER_FLAG_ACK,
> > > > + DISPATCHER_FLAG_ASYNC
> > > > +} DispatcherFlag;
> > > >
> > > > /*
> > > > * dispatcher_register_handler
> > > > @@ -84,16 +84,16 @@ enum {
> > > > * @messsage_type: message type
> > > > * @handler: message handler
> > > > * @size: message size. Each type has a fixed
> > > > associated
> > > > size.
> > > > - * @ack: One of DISPATCHER_NONE, DISPATCHER_ACK,
> > > > DISPATCHER_ASYNC.
> > > > - * DISPATCHER_NONE - only send the message
> > > > - * DISPATCHER_ACK - send an ack after the
> > > > message
> > > > - * DISPATCHER_ASYNC - call send an ack. This
> > > > is
> > > > per message
> > > > type - you can't send the
> > > > + * @flag: One of DISPATCHER_FLAG_NONE,
> > > > DISPATCHER_FLAG_ACK,
> > > > DISPATCHER_FLAG_ASYNC.
> > > > + * DISPATCHER_FLAG_NONE - only send the
> > > > message
> > > > + * DISPATCHER_FLAG_ACK - send an ack after
> > > > the
> > > > message
> > > > + * DISPATCHER_FLAG_ASYNC - call send an ack.
> > > > This
> > > > is per
> > > > message type - you can't send the
> > > > * same message type with and without.
> > > > Register
> > > > two
> > > > different
> > > > * messages if that is what you want.
> > > > */
> > > > void dispatcher_register_handler(Dispatcher *dispatcher,
> > > > uint32_t
> > > > message_type,
> > > > dispatcher_handle_message
> > > > handler, size_t
> > > > size,
> > > > - int ack);
> > > > + DispatcherFlag flag);
> > > >
> > > > /*
> > > > * dispatcher_register_async_done_callback
> > > > diff --git a/server/red-worker.c b/server/red-worker.c
> > > > index 4d8566be7..c3f2dbfa0 100644
> > > > --- a/server/red-worker.c
> > > > +++ b/server/red-worker.c
> > > > @@ -1024,187 +1024,187 @@ static void
> > > > register_callbacks(Dispatcher
> > > > *dispatcher)
> > > > RED_WORKER_MESSAGE_DISPLAY_CON
> > > > NECT
> > > > ,
> > > > handle_dev_display_connect,
> > > > sizeof(RedWorkerMessageDisplay
> > > > Conn
> > > > ect),
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_DISPLAY_DIS
> > > > CONN
> > > > ECT,
> > > > handle_dev_display_disconnect,
> > > > sizeof(RedWorkerMessageDisplay
> > > > Disc
> > > > onnect),
> > > > - DISPATCHER_ACK);
> > > > + DISPATCHER_FLAG_ACK);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_DISPLAY_MIG
> > > > RATE
> > > > ,
> > > > handle_dev_display_migrate,
> > > > sizeof(RedWorkerMessageDisplay
> > > > Migr
> > > > ate),
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_CURSOR_CONN
> > > > ECT,
> > > > handle_dev_cursor_connect,
> > > > sizeof(RedWorkerMessageCursorC
> > > > onne
> > > > ct),
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_CURSOR_DISC
> > > > ONNE
> > > > CT,
> > > > handle_dev_cursor_disconnect,
> > > > sizeof(RedWorkerMessageCursorD
> > > > isco
> > > > nnect),
> > > > - DISPATCHER_ACK);
> > > > + DISPATCHER_FLAG_ACK);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_CURSOR_MIGR
> > > > ATE,
> > > > handle_dev_cursor_migrate,
> > > > sizeof(RedWorkerMessageCursorM
> > > > igra
> > > > te),
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_UPDATE,
> > > > handle_dev_update,
> > > > sizeof(RedWorkerMessageUpdate)
> > > > ,
> > > > - DISPATCHER_ACK);
> > > > + DISPATCHER_FLAG_ACK);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_UPDATE_ASYN
> > > > C,
> > > > handle_dev_update_async,
> > > > sizeof(RedWorkerMessageUpdateA
> > > > sync
> > > > ),
> > > > - DISPATCHER_ASYNC);
> > > > + DISPATCHER_FLAG_ASYNC);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_ADD_MEMSLOT
> > > > ,
> > > > handle_dev_add_memslot,
> > > > sizeof(RedWorkerMessageAddMems
> > > > lot)
> > > > ,
> > > > - DISPATCHER_ACK);
> > > > + DISPATCHER_FLAG_ACK);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_ADD_MEMSLOT
> > > > _ASY
> > > > NC,
> > > > handle_dev_add_memslot_async,
> > > > sizeof(RedWorkerMessageAddMems
> > > > lotA
> > > > sync),
> > > > - DISPATCHER_ASYNC);
> > > > + DISPATCHER_FLAG_ASYNC);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_DEL_MEMSLOT
> > > > ,
> > > > handle_dev_del_memslot,
> > > > sizeof(RedWorkerMessageDelMems
> > > > lot)
> > > > ,
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_DESTROY_SUR
> > > > FACE
> > > > S,
> > > > handle_dev_destroy_surfaces,
> > > > sizeof(RedWorkerMessageDestroy
> > > > Surf
> > > > aces),
> > > > - DISPATCHER_ACK);
> > > > + DISPATCHER_FLAG_ACK);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_DESTROY_SUR
> > > > FACE
> > > > S_ASYNC,
> > > > handle_dev_destroy_surfaces_as
> > > > ync,
> > > > sizeof(RedWorkerMessageDestroy
> > > > Surf
> > > > acesAsync),
> > > > - DISPATCHER_ASYNC);
> > > > + DISPATCHER_FLAG_ASYNC);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_DESTROY_PRI
> > > > MARY
> > > > _SURFACE,
> > > > handle_dev_destroy_primary_sur
> > > > face
> > > > ,
> > > > sizeof(RedWorkerMessageDestroy
> > > > Prim
> > > > arySurface),
> > > > - DISPATCHER_ACK);
> > > > + DISPATCHER_FLAG_ACK);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_DESTROY_PRI
> > > > MARY
> > > > _SURFACE_ASYNC,
> > > > handle_dev_destroy_primary_sur
> > > > face
> > > > _async,
> > > > sizeof(RedWorkerMessageDestroy
> > > > Prim
> > > > arySurfaceAsync),
> > > > - DISPATCHER_ASYNC);
> > > > + DISPATCHER_FLAG_ASYNC);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_CREATE_PRIM
> > > > ARY_
> > > > SURFACE_ASYNC,
> > > > handle_dev_create_primary_surf
> > > > ace_
> > > > async,
> > > > sizeof(RedWorkerMessageCreateP
> > > > rima
> > > > rySurfaceAsync),
> > > > - DISPATCHER_ASYNC);
> > > > + DISPATCHER_FLAG_ASYNC);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_CREATE_PRIM
> > > > ARY_
> > > > SURFACE,
> > > > handle_dev_create_primary_surf
> > > > ace,
> > > > sizeof(RedWorkerMessageCreateP
> > > > rima
> > > > rySurface),
> > > > - DISPATCHER_ACK);
> > > > + DISPATCHER_FLAG_ACK);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_RESET_IMAGE
> > > > _CAC
> > > > HE,
> > > > handle_dev_reset_image_cache,
> > > > sizeof(RedWorkerMessageResetIm
> > > > ageC
> > > > ache),
> > > > - DISPATCHER_ACK);
> > > > + DISPATCHER_FLAG_ACK);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_RESET_CURSO
> > > > R,
> > > > handle_dev_reset_cursor,
> > > > sizeof(RedWorkerMessageResetCu
> > > > rsor
> > > > ),
> > > > - DISPATCHER_ACK);
> > > > + DISPATCHER_FLAG_ACK);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_WAKEUP,
> > > > handle_dev_wakeup,
> > > > sizeof(RedWorkerMessageWakeup)
> > > > ,
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_OOM,
> > > > handle_dev_oom,
> > > > sizeof(RedWorkerMessageOom),
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_START,
> > > > handle_dev_start,
> > > > sizeof(RedWorkerMessageStart),
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_FLUSH_SURFA
> > > > CES_
> > > > ASYNC,
> > > > handle_dev_flush_surfaces_asyn
> > > > c,
> > > > sizeof(RedWorkerMessageFlushSu
> > > > rfac
> > > > esAsync),
> > > > - DISPATCHER_ASYNC);
> > > > + DISPATCHER_FLAG_ASYNC);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_STOP,
> > > > handle_dev_stop,
> > > > sizeof(RedWorkerMessageStop),
> > > > - DISPATCHER_ACK);
> > > > + DISPATCHER_FLAG_ACK);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_LOADVM_COMM
> > > > ANDS
> > > > ,
> > > > handle_dev_loadvm_commands,
> > > > sizeof(RedWorkerMessageLoadvmC
> > > > omma
> > > > nds),
> > > > - DISPATCHER_ACK);
> > > > + DISPATCHER_FLAG_ACK);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_SET_COMPRES
> > > > SION
> > > > ,
> > > > handle_dev_set_compression,
> > > > sizeof(RedWorkerMessageSetComp
> > > > ress
> > > > ion),
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_SET_STREAMI
> > > > NG_V
> > > > IDEO,
> > > > handle_dev_set_streaming_video
> > > > ,
> > > > sizeof(RedWorkerMessageSetStre
> > > > amin
> > > > gVideo),
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_SET_VIDEO_C
> > > > ODEC
> > > > S,
> > > > handle_dev_set_video_codecs,
> > > > sizeof(RedWorkerMessageSetVide
> > > > oCod
> > > > ecs),
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_SET_MOUSE_M
> > > > ODE,
> > > > handle_dev_set_mouse_mode,
> > > > sizeof(RedWorkerMessageSetMous
> > > > eMod
> > > > e),
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_DESTROY_SUR
> > > > FACE
> > > > _WAIT,
> > > > handle_dev_destroy_surface_wai
> > > > t,
> > > > sizeof(RedWorkerMessageDestroy
> > > > Surf
> > > > aceWait),
> > > > - DISPATCHER_ACK);
> > > > + DISPATCHER_FLAG_ACK);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_DESTROY_SUR
> > > > FACE
> > > > _WAIT_ASYNC,
> > > > handle_dev_destroy_surface_wai
> > > > t_as
> > > > ync,
> > > > sizeof(RedWorkerMessageDestroy
> > > > Surf
> > > > aceWaitAsync),
> > > > - DISPATCHER_ASYNC);
> > > > + DISPATCHER_FLAG_ASYNC);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_RESET_MEMSL
> > > > OTS,
> > > > handle_dev_reset_memslots,
> > > > sizeof(RedWorkerMessageResetMe
> > > > mslo
> > > > ts),
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_MONITORS_CO
> > > > NFIG
> > > > _ASYNC,
> > > > handle_dev_monitors_config_asy
> > > > nc,
> > > > sizeof(RedWorkerMessageMonitor
> > > > sCon
> > > > figAsync),
> > > > - DISPATCHER_ASYNC);
> > > > + DISPATCHER_FLAG_ASYNC);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_DRIVER_UNLO
> > > > AD,
> > > > handle_dev_driver_unload,
> > > > sizeof(RedWorkerMessageDriverU
> > > > nloa
> > > > d),
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_GL_SCANOUT,
> > > > handle_dev_gl_scanout,
> > > > sizeof(RedWorkerMessageGlScano
> > > > ut),
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_GL_DRAW_ASY
> > > > NC,
> > > > handle_dev_gl_draw_async,
> > > > sizeof(RedWorkerMessageGlDraw)
> > > > ,
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > dispatcher_register_handler(dispatcher,
> > > > RED_WORKER_MESSAGE_CLOSE_WORKE
> > > > R,
> > > > handle_dev_close,
> > > > sizeof(RedWorkerMessageClose),
> > > > - DISPATCHER_NONE);
> > > > + DISPATCHER_FLAG_NONE);
> > > > }
> > > >
> > > >
More information about the Spice-devel
mailing list