[Spice-devel] [PATCH spice-server] red-stream: Remove AsyncRead::stream

Frediano Ziglio fziglio at redhat.com
Tue Jan 9 19:48:34 UTC 2018


AsyncRead is always included in RedStream and there are only
a possible operation pending on a RedStream.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 server/red-stream.c | 30 ++++++++++++++++--------------
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/server/red-stream.c b/server/red-stream.c
index 44627b65f..01ad84def 100644
--- a/server/red-stream.c
+++ b/server/red-stream.c
@@ -38,7 +38,6 @@
 #include "reds.h"
 
 struct AsyncRead {
-    RedStream *stream;
     void *opaque;
     uint8_t *now;
     uint8_t *end;
@@ -492,20 +491,20 @@ void red_stream_set_async_error_handler(RedStream *stream,
     stream->priv->async_read.error = error_handler;
 }
 
-static inline void async_read_clear_handlers(AsyncRead *async)
+static inline void async_read_clear_handlers(RedStream *stream)
 {
-    if (async->stream->watch) {
-        red_stream_remove_watch(async->stream);
-    }
-    async->stream = NULL;
+    AsyncRead *async = &stream->priv->async_read;
+    red_stream_remove_watch(stream);
+    async->now = NULL;
+    async->end = NULL;
 }
 
 static void async_read_handler(G_GNUC_UNUSED int fd,
                                G_GNUC_UNUSED int event,
                                void *data)
 {
-    AsyncRead *async = (AsyncRead *)data;
-    RedStream *stream = async->stream;
+    RedStream *stream = data;
+    AsyncRead *async = &stream->priv->async_read;
     SpiceCoreInterfaceInternal *core = stream->priv->core;
 
     for (;;) {
@@ -520,13 +519,13 @@ static void async_read_handler(G_GNUC_UNUSED int fd,
                 if (!stream->watch) {
                     stream->watch = core->watch_add(core, stream->socket,
                                                     SPICE_WATCH_EVENT_READ,
-                                                    async_read_handler, async);
+                                                    async_read_handler, stream);
                 }
                 return;
             case EINTR:
                 break;
             default:
-                async_read_clear_handlers(async);
+                async_read_clear_handlers(stream);
                 if (async->error) {
                     async->error(async->opaque, err);
                 }
@@ -535,7 +534,7 @@ static void async_read_handler(G_GNUC_UNUSED int fd,
         } else {
             async->now += n;
             if (async->now == async->end) {
-                async_read_clear_handlers(async);
+                async_read_clear_handlers(stream);
                 async->done(async->opaque);
                 return;
             }
@@ -550,13 +549,16 @@ void red_stream_async_read(RedStream *stream,
 {
     AsyncRead *async = &stream->priv->async_read;
 
-    g_return_if_fail(!async->stream);
-    async->stream = stream;
+    g_return_if_fail(async->now == NULL && async->end == NULL);
+    if (size == 0) {
+        read_done_cb(opaque);
+        return;
+    }
     async->now = data;
     async->end = async->now + size;
     async->done = read_done_cb;
     async->opaque = opaque;
-    async_read_handler(0, 0, async);
+    async_read_handler(0, 0, stream);
 
 }
 
-- 
2.14.3



More information about the Spice-devel mailing list