[glib] gsocket: Factor out blocking parameter from g_socket_receive_message()
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] gsocket: Factor out blocking parameter from g_socket_receive_message()
- Date: Thu, 1 Oct 2015 13:17:07 +0000 (UTC)
commit 7f985b35ce599a37144f852903993300e8f1f197
Author: Philip Withnall <philip withnall collabora co uk>
Date: Mon Jul 27 14:21:00 2015 +0100
gsocket: Factor out blocking parameter from g_socket_receive_message()
This will make future API additions easier. The factored version is
internal for the time being.
https://bugzilla.gnome.org/show_bug.cgi?id=751924
gio/gsocket.c | 214 ++++++++++++++++++++++++++++++++------------------------
1 files changed, 122 insertions(+), 92 deletions(-)
---
diff --git a/gio/gsocket.c b/gio/gsocket.c
index 7a87690..42c313e 100644
--- a/gio/gsocket.c
+++ b/gio/gsocket.c
@@ -138,6 +138,17 @@ static gboolean g_socket_initable_init (GInitable *initable,
static GSocketAddress *
cache_recv_address (GSocket *socket, struct sockaddr *native, int native_len);
+static gssize
+g_socket_receive_message_with_blocking (GSocket *socket,
+ GSocketAddress **address,
+ GInputVector *vectors,
+ gint num_vectors,
+ GSocketControlMessage ***messages,
+ gint *num_messages,
+ gint *flags,
+ gboolean blocking,
+ GCancellable *cancellable,
+ GError **error);
static gint
g_socket_send_messages_with_blocking (GSocket *socket,
GOutputMessage *messages,
@@ -4440,96 +4451,17 @@ cache_recv_address (GSocket *socket, struct sockaddr *native, int native_len)
return saddr;
}
-/**
- * g_socket_receive_message:
- * @socket: a #GSocket
- * @address: (out) (allow-none): a pointer to a #GSocketAddress
- * pointer, or %NULL
- * @vectors: (array length=num_vectors): an array of #GInputVector structs
- * @num_vectors: the number of elements in @vectors, or -1
- * @messages: (array length=num_messages) (allow-none): a pointer which
- * may be filled with an array of #GSocketControlMessages, or %NULL
- * @num_messages: a pointer which will be filled with the number of
- * elements in @messages, or %NULL
- * @flags: a pointer to an int containing #GSocketMsgFlags flags
- * @cancellable: (allow-none): a %GCancellable or %NULL
- * @error: a #GError pointer, or %NULL
- *
- * Receive data from a socket. This is the most complicated and
- * fully-featured version of this call. For easier use, see
- * g_socket_receive() and g_socket_receive_from().
- *
- * If @address is non-%NULL then @address will be set equal to the
- * source address of the received packet.
- * @address is owned by the caller.
- *
- * @vector must point to an array of #GInputVector structs and
- * @num_vectors must be the length of this array. These structs
- * describe the buffers that received data will be scattered into.
- * If @num_vectors is -1, then @vectors is assumed to be terminated
- * by a #GInputVector with a %NULL buffer pointer.
- *
- * As a special case, if @num_vectors is 0 (in which case, @vectors
- * may of course be %NULL), then a single byte is received and
- * discarded. This is to facilitate the common practice of sending a
- * single '\0' byte for the purposes of transferring ancillary data.
- *
- * @messages, if non-%NULL, will be set to point to a newly-allocated
- * array of #GSocketControlMessage instances or %NULL if no such
- * messages was received. These correspond to the control messages
- * received from the kernel, one #GSocketControlMessage per message
- * from the kernel. This array is %NULL-terminated and must be freed
- * by the caller using g_free() after calling g_object_unref() on each
- * element. If @messages is %NULL, any control messages received will
- * be discarded.
- *
- * @num_messages, if non-%NULL, will be set to the number of control
- * messages received.
- *
- * If both @messages and @num_messages are non-%NULL, then
- * @num_messages gives the number of #GSocketControlMessage instances
- * in @messages (ie: not including the %NULL terminator).
- *
- * @flags is an in/out parameter. The commonly available arguments
- * for this are available in the #GSocketMsgFlags enum, but the
- * values there are the same as the system values, and the flags
- * are passed in as-is, so you can pass in system-specific flags too
- * (and g_socket_receive_message() may pass system-specific flags out).
- * Flags passed in to the parameter affect the receive operation; flags returned
- * out of it are relevant to the specific returned message.
- *
- * As with g_socket_receive(), data may be discarded if @socket is
- * %G_SOCKET_TYPE_DATAGRAM or %G_SOCKET_TYPE_SEQPACKET and you do not
- * provide enough buffer space to read a complete message. You can pass
- * %G_SOCKET_MSG_PEEK in @flags to peek at the current message without
- * removing it from the receive queue, but there is no portable way to find
- * out the length of the message other than by reading it into a
- * sufficiently-large buffer.
- *
- * If the socket is in blocking mode the call will block until there
- * is some data to receive, the connection is closed, or there is an
- * error. If there is no data available and the socket is in
- * non-blocking mode, a %G_IO_ERROR_WOULD_BLOCK error will be
- * returned. To be notified when data is available, wait for the
- * %G_IO_IN condition.
- *
- * On error -1 is returned and @error is set accordingly.
- *
- * Returns: Number of bytes read, or 0 if the connection was closed by
- * the peer, or -1 on error
- *
- * Since: 2.22
- */
-gssize
-g_socket_receive_message (GSocket *socket,
- GSocketAddress **address,
- GInputVector *vectors,
- gint num_vectors,
- GSocketControlMessage ***messages,
- gint *num_messages,
- gint *flags,
- GCancellable *cancellable,
- GError **error)
+static gssize
+g_socket_receive_message_with_blocking (GSocket *socket,
+ GSocketAddress **address,
+ GInputVector *vectors,
+ gint num_vectors,
+ GSocketControlMessage ***messages,
+ gint *num_messages,
+ gint *flags,
+ gboolean blocking,
+ GCancellable *cancellable,
+ GError **error)
{
GInputVector one_vector;
char one_byte;
@@ -4605,7 +4537,7 @@ g_socket_receive_message (GSocket *socket,
if (errsv == EINTR)
continue;
- if (socket->priv->blocking &&
+ if (blocking &&
(errsv == EWOULDBLOCK ||
errsv == EAGAIN))
{
@@ -4679,7 +4611,7 @@ g_socket_receive_message (GSocket *socket,
{
win32_unset_event_mask (socket, FD_READ);
- if (socket->priv->blocking)
+ if (blocking)
{
if (!g_socket_condition_wait (socket,
G_IO_IN, cancellable, error))
@@ -4717,6 +4649,104 @@ g_socket_receive_message (GSocket *socket,
}
/**
+ * g_socket_receive_message:
+ * @socket: a #GSocket
+ * @address: (out) (allow-none): a pointer to a #GSocketAddress
+ * pointer, or %NULL
+ * @vectors: (array length=num_vectors): an array of #GInputVector structs
+ * @num_vectors: the number of elements in @vectors, or -1
+ * @messages: (array length=num_messages) (allow-none): a pointer which
+ * may be filled with an array of #GSocketControlMessages, or %NULL
+ * @num_messages: a pointer which will be filled with the number of
+ * elements in @messages, or %NULL
+ * @flags: a pointer to an int containing #GSocketMsgFlags flags
+ * @cancellable: (allow-none): a %GCancellable or %NULL
+ * @error: a #GError pointer, or %NULL
+ *
+ * Receive data from a socket. This is the most complicated and
+ * fully-featured version of this call. For easier use, see
+ * g_socket_receive() and g_socket_receive_from().
+ *
+ * If @address is non-%NULL then @address will be set equal to the
+ * source address of the received packet.
+ * @address is owned by the caller.
+ *
+ * @vector must point to an array of #GInputVector structs and
+ * @num_vectors must be the length of this array. These structs
+ * describe the buffers that received data will be scattered into.
+ * If @num_vectors is -1, then @vectors is assumed to be terminated
+ * by a #GInputVector with a %NULL buffer pointer.
+ *
+ * As a special case, if @num_vectors is 0 (in which case, @vectors
+ * may of course be %NULL), then a single byte is received and
+ * discarded. This is to facilitate the common practice of sending a
+ * single '\0' byte for the purposes of transferring ancillary data.
+ *
+ * @messages, if non-%NULL, will be set to point to a newly-allocated
+ * array of #GSocketControlMessage instances or %NULL if no such
+ * messages was received. These correspond to the control messages
+ * received from the kernel, one #GSocketControlMessage per message
+ * from the kernel. This array is %NULL-terminated and must be freed
+ * by the caller using g_free() after calling g_object_unref() on each
+ * element. If @messages is %NULL, any control messages received will
+ * be discarded.
+ *
+ * @num_messages, if non-%NULL, will be set to the number of control
+ * messages received.
+ *
+ * If both @messages and @num_messages are non-%NULL, then
+ * @num_messages gives the number of #GSocketControlMessage instances
+ * in @messages (ie: not including the %NULL terminator).
+ *
+ * @flags is an in/out parameter. The commonly available arguments
+ * for this are available in the #GSocketMsgFlags enum, but the
+ * values there are the same as the system values, and the flags
+ * are passed in as-is, so you can pass in system-specific flags too
+ * (and g_socket_receive_message() may pass system-specific flags out).
+ * Flags passed in to the parameter affect the receive operation; flags returned
+ * out of it are relevant to the specific returned message.
+ *
+ * As with g_socket_receive(), data may be discarded if @socket is
+ * %G_SOCKET_TYPE_DATAGRAM or %G_SOCKET_TYPE_SEQPACKET and you do not
+ * provide enough buffer space to read a complete message. You can pass
+ * %G_SOCKET_MSG_PEEK in @flags to peek at the current message without
+ * removing it from the receive queue, but there is no portable way to find
+ * out the length of the message other than by reading it into a
+ * sufficiently-large buffer.
+ *
+ * If the socket is in blocking mode the call will block until there
+ * is some data to receive, the connection is closed, or there is an
+ * error. If there is no data available and the socket is in
+ * non-blocking mode, a %G_IO_ERROR_WOULD_BLOCK error will be
+ * returned. To be notified when data is available, wait for the
+ * %G_IO_IN condition.
+ *
+ * On error -1 is returned and @error is set accordingly.
+ *
+ * Returns: Number of bytes read, or 0 if the connection was closed by
+ * the peer, or -1 on error
+ *
+ * Since: 2.22
+ */
+gssize
+g_socket_receive_message (GSocket *socket,
+ GSocketAddress **address,
+ GInputVector *vectors,
+ gint num_vectors,
+ GSocketControlMessage ***messages,
+ gint *num_messages,
+ gint *flags,
+ GCancellable *cancellable,
+ GError **error)
+{
+ return g_socket_receive_message_with_blocking (socket, address, vectors,
+ num_vectors, messages,
+ num_messages, flags,
+ socket->priv->blocking,
+ cancellable, error);
+}
+
+/**
* g_socket_get_credentials:
* @socket: a #GSocket.
* @error: #GError for error reporting, or %NULL to ignore.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]