Thoughts on bindability of GIO socket API



Hi all,

We’re looking at adding a recvmmsg()-like function to GSocket here:

https://bugzilla.gnome.org/show_bug.cgi?id=751924

And are wondering about how bindable the GInputMessage struct (which
mirrors struct mmsghdr (see `man recvmmsg` and `man recvmsg`) will be.
The address and control_messages fields can either be set to NULL by
the caller, or set to return locations for a message address and
ancillary data (allocated by the callee). Would this map nicely to
various GIR-bound languages? Would it require additions to the GIR
semantics for annotations of struct fields (which I believe are
currently loosely defined)?

/**
 * GInputMessage:
 * @address: (optional) (out callee-allocates) (transfer full): return
location
 *   for a #GSocketAddress, or %NULL
 * @vectors: (array length=num_vectors) (out caller-allocates): pointer
to an
 *   array of input vectors
 * @num_vectors: the number of input vectors pointed to by @vectors
 * @bytes_received: (out): will be set to the number of bytes that have
been
 *   received
 * @flags: (out): collection of #GSocketMsgFlags for the received
message,
 *   outputted by the call
 * @control_messages: (array length=num_control_messages) (optional)
 *   (out callee-allocates) (transfer full): return location for a
 *   caller-allocated array of #GSocketControlMessages, or %NULL
 * @num_control_messages: (out) (optional): return location for the
number of
 *   elements in @control_messages
 *
 * Structure used for scatter/gather data input when receiving multiple
 * messages or packets in one go. You generally pass in an array of
empty
 * #GInputVectors and the operation will use all the buffers as if they
 * were one buffer, and will set @bytes_received to the total number of
bytes
 * received across all #GInputVectors.
 *
 * This structure closely mirrors `struct mmsghdr` and `struct msghdr`
from
 * the [POSIX sockets
 * API](
http://man7.org/linux/man-pages/man2/recvmmsg.2.html#DESCRIPTION).
 *
 * If @address is non-%NULL then it is set to the source address the
message
 * was received from, and ownership is transferred to the caller.
 *
 * If @control_messages is non-%NULL then it is set to an array of
control
 * messages received with the message (if any), and ownership is
transferred
 * to the caller. @num_control_messages is set to the number of
elements in
 * this array, which may be zero.
 *
 * Flags relevant to this message will be returned in @flags. For
example,
 * `MSG_EOR` or `MSG_TRUNC`.
 *
 * Since: 2.46
 */
typedef struct _GInputMessage GInputMessage;

struct _GInputMessage {
  GSocketAddress         **address;

  GInputVector            *vectors;
  guint                    num_vectors;

  gsize                    bytes_received;
  gint                     flags;

  GSocketControlMessage ***control_messages;
  guint                   *num_control_messages;
};

Replies here or on the bug report please.

Philip

Attachment: signature.asc
Description: This is a digitally signed message part



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]