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