[Spice-devel] [PATCH spice-server v4] Add documentation for Dispatcher
Frediano Ziglio
fziglio at redhat.com
Thu Sep 7 16:23:16 UTC 2017
>
> ---
> Changes since v3:
> - removed documentation for 'opaque' argument from dispatcher_new()
>
> server/dispatcher.h | 95
> ++++++++++++++++++++++++++++++++++++++++++++---------
> 1 file changed, 80 insertions(+), 15 deletions(-)
>
> diff --git a/server/dispatcher.h b/server/dispatcher.h
> index ab7713845..1aaba13bc 100644
> --- a/server/dispatcher.h
> +++ b/server/dispatcher.h
> @@ -35,6 +35,18 @@ typedef struct Dispatcher Dispatcher;
> typedef struct DispatcherClass DispatcherClass;
> typedef struct DispatcherPrivate DispatcherPrivate;
>
> +/* A Dispatcher provides inter-thread communication by serializing messages.
> + * Currently the Dispatcher uses a unix socket (socketpair) for dispatching
> the
> + * messages.
> + *
> + * Message types are identified by a unique integer value and must first be
> + * registered with the class (see dispatcher_register_handler()) before they
> + * can be sent. Sending threads can send a message using the
> + * dispatcher_send_message() function. The receiving thread can monitor the
> + * dispatcher's 'receive' file descriptor (see dispatcher_get_recv_fd()) for
> + * activity and should call dispatcher_handle_recv_read() to process
> incoming
> + * messages.
> + */
> struct Dispatcher
> {
> GObject parent;
> @@ -49,26 +61,52 @@ struct DispatcherClass
>
> GType dispatcher_get_type(void) G_GNUC_CONST;
>
> +/* dispatcher_new
> + *
> + * Create a new Dispatcher object
> + *
> + * @max_message_type: indicates the number of unique message types that
> can
> + * be handled by this dispatcher. Each message type is
> + * identified by an integer value between 0 and
> + * max_message_type-1.
> + */
> Dispatcher *dispatcher_new(size_t max_message_type);
>
>
> +/* The function signature for handlers of a specific message type */
> typedef void (*dispatcher_handle_message)(void *opaque,
> void *payload);
>
> +/* The signature for a function that handles all messages (see
> + * dispatcher_register_universal_handler()) */
> typedef void (*dispatcher_handle_any_message)(void *opaque,
> uint32_t message_type,
> void *payload);
>
> -/*
> - * dispatcher_send_message
> +/* dispatcher_send_message
> + *
> + * Sends a message to the receiving thread. The message type must have been
> + * registered first (see dispatcher_register_handler()). @payload must be a
> + * buffer of the same size as the size registered for @message_type
> + *
> + * If the sent message is a message type requires an ACK, this function will
> + * block until it receives an ACK from the receiving thread.
> + *
> * @message_type: message type
> * @payload: payload
> */
> void dispatcher_send_message(Dispatcher *dispatcher, uint32_t message_type,
> void *payload);
>
> -/*
> - * dispatcher_register_handler
> +/* dispatcher_register_handler
> + *
> + * This function registers a message type with the dispatcher, and registers
> + * @handler as the function that will handle incoming messages of this type.
> + * If @ack is true, the dispatcher will also send an ACK in response to the
> + * message after the message has been passed to the handler. You can only
> + * register a given message type once. For example, you cannot register two
> + * different handlers for the same message type with different @ack values.
> + *
> * @dispatcher: dispatcher
> * @messsage_type: message type
> * @handler: message handler
> @@ -79,32 +117,59 @@ void dispatcher_register_handler(Dispatcher *dispatcher,
> uint32_t message_type,
> dispatcher_handle_message handler, size_t
> size,
> bool ack);
>
> -/*
> - * Hack to allow red_record to see the message being sent so it can record
> - * it to file.
> +/* dispatcher_register_universal_handler
> + *
> + * Register a universal handler that will be called when *any* message is
> + * received by the dispatcher. When a message is received, this handler will
> be
> + * called first. If the received message type was registered via
> + * dispatcher_register_handler(), the message-specific handler will then be
> + * called. Only one universal handler can be registered. This feature can be
> + * used to record all messages to a file for replay and debugging.
> + *
> + * @dispatcher: dispatcher
> + * @handler: a handler function
> */
> void dispatcher_register_universal_handler(Dispatcher *dispatcher,
> dispatcher_handle_any_message handler);
>
> -/*
> - * dispatcher_handle_recv_read
> - * @dispatcher: Dispatcher instance
> +/* dispatcher_handle_recv_read
> + *
> + * A convenience function that is intended to be called by the receiving
> thread
> + * to handle all incoming messages and execute any handlers for those
> messages.
> + * This function will handle all incoming messages until there is no more
> data
> + * to read, so multiple handlers may be executed from a single call to
> + * dispatcher_handle_recv_read().
> + *
> + * @dispatcher: Dispatcher instance
> */
> void dispatcher_handle_recv_read(Dispatcher *);
>
> -/*
> - * dispatcher_get_recv_fd
> - * @return: receive file descriptor of the dispatcher
> +/* dispatcher_get_recv_fd
> + *
> + * This function returns the file descriptor that is used by the receiving
> + * thread to listen for incoming messages. You should not read or write
> + * directly to this fd, but should only use it to watch for read events.
> When
> + * there is a read event, you should use dispatcher_handle_recv_read() to
> + * handle the incoming messages.
> + *
> + * @return: receive file descriptor of the dispatcher
> */
> int dispatcher_get_recv_fd(Dispatcher *);
>
> -/*
> - * dispatcher_set_opaque
> +/* dispatcher_set_opaque
> + *
> + * This @opaque pointer is user-defined data that will be passed as the
> first
> + * argument to all handler functions.
> + *
> * @dispatcher: Dispatcher instance
> * @opaque: opaque to use for callbacks
> */
> void dispatcher_set_opaque(Dispatcher *dispatcher, void *opaque);
>
> +/* dispatcher_get_thread_id
> + *
> + * Returns the id of the thread that created this Dispatcher object
> + */
> pthread_t dispatcher_get_thread_id(Dispatcher *self);
>
> #endif /* DISPATCHER_H_ */
For the series
Acked-by: Frediano Ziglio <fziglio at redhat.com>
Frediano
More information about the Spice-devel
mailing list