[Spice-devel] [spice-gtk v3 1/6] spice-channel: move out non blocking logic of _read_wire()
Victor Toso
victortoso at redhat.com
Tue Feb 28 11:21:46 UTC 2017
From: Victor Toso <me at victortoso.com>
This patch introduces spice_channel_read_wire_nonblocking() helper
without changing any logic.
Related: https://bugs.freedesktop.org/show_bug.cgi?id=96598
Signed-off-by: Victor Toso <victortoso at redhat.com>
Acked-by: Christophe Fergeau <cfergeau at redhat.com>
---
src/spice-channel.c | 45 ++++++++++++++++++++++++++++++++++-----------
1 file changed, 34 insertions(+), 11 deletions(-)
diff --git a/src/spice-channel.c b/src/spice-channel.c
index af67931..4210c31 100644
--- a/src/spice-channel.c
+++ b/src/spice-channel.c
@@ -971,29 +971,32 @@ gint spice_channel_unix_read_fd(SpiceChannel *channel)
#endif
/*
- * Read at least 1 more byte of data straight off the wire
- * into the requested buffer.
+ * Helper function to deal with the nonblocking part of _read_wire() function.
+ * It returns the result of the read and will set the proper bits in @cond in
+ * case the read function would block.
+ *
+ * Returns -1 in case of any problems.
*/
/* coroutine context */
-static int spice_channel_read_wire(SpiceChannel *channel, void *data, size_t len)
+static int spice_channel_read_wire_nonblocking(SpiceChannel *channel,
+ void *data,
+ size_t len,
+ GIOCondition *cond)
{
SpiceChannelPrivate *c = channel->priv;
gssize ret;
- GIOCondition cond;
-
-reread:
- if (c->has_error) return 0; /* has_error is set by disconnect(), return no error */
+ g_assert(cond != NULL);
+ *cond = 0;
- cond = 0;
if (c->tls) {
ret = SSL_read(c->ssl, data, len);
if (ret < 0) {
ret = SSL_get_error(c->ssl, ret);
if (ret == SSL_ERROR_WANT_READ)
- cond |= G_IO_IN;
+ *cond |= G_IO_IN;
if (ret == SSL_ERROR_WANT_WRITE)
- cond |= G_IO_OUT;
+ *cond |= G_IO_OUT;
ret = -1;
}
} else {
@@ -1002,7 +1005,7 @@ reread:
data, len, NULL, &error);
if (ret < 0) {
if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
- cond = G_IO_IN;
+ *cond = G_IO_IN;
} else {
CHANNEL_DEBUG(channel, "Read error %s", error->message);
}
@@ -1011,6 +1014,26 @@ reread:
}
}
+ return ret;
+}
+
+/*
+ * Read at least 1 more byte of data straight off the wire
+ * into the requested buffer.
+ */
+/* coroutine context */
+static int spice_channel_read_wire(SpiceChannel *channel, void *data, size_t len)
+{
+ SpiceChannelPrivate *c = channel->priv;
+ GIOCondition cond;
+ gssize ret;
+
+reread:
+
+ if (c->has_error) return 0; /* has_error is set by disconnect(), return no error */
+
+ ret = spice_channel_read_wire_nonblocking(channel, data, len, &cond);
+
if (ret == -1) {
if (cond != 0) {
// TODO: should use g_pollable_input/output_stream_create_source() ?
--
2.9.3
More information about the Spice-devel
mailing list