[Spice-devel] [PATCH 08/14] Use RAII to cleanup stream in case of exception or return

Christophe de Dinechin christophe at dinechin.org
Wed Feb 14 17:52:16 UTC 2018


From: Christophe de Dinechin <dinechin at redhat.com>

This lets us get rid of C-style 'goto done' in do_capture.

Signed-off-by: Christophe de Dinechin <dinechin at redhat.com>
---
 src/spice-streaming-agent.cpp | 32 ++++++++++++++++++++------------
 1 file changed, 20 insertions(+), 12 deletions(-)

diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp
index 25a38a6..e9ef310 100644
--- a/src/spice-streaming-agent.cpp
+++ b/src/spice-streaming-agent.cpp
@@ -53,6 +53,23 @@ struct SpiceStreamDataMessage
     StreamMsgData msg;
 };
 
+struct Stream
+{
+    Stream(const char *name, int &fd): fd(fd)
+    {
+        fd = open(name, O_RDWR);
+        if (fd < 0)
+            throw std::runtime_error("failed to open streaming device");
+    }
+    ~Stream()
+    {
+        if (fd >= 0)
+            close(fd);
+        fd = -1;
+    }
+    int &fd;
+};
+
 static bool streaming_requested = false;
 static bool quit_requested = false;
 static bool log_binary = false;
@@ -354,17 +371,14 @@ static void cursor_changes(Display *display, int event_base)
 static void
 do_capture(const char *streamport, FILE *f_log)
 {
-    streamfd = open(streamport.c_str(), O_RDWR);
-    if (streamfd < 0)
-        throw std::runtime_error("failed to open the streaming device (" +
-                                 streamport + "): " + strerror(errno));
+    Stream stream(streamport, streamfd);
 
     unsigned int frame_count = 0;
     while (!quit_requested) {
         while (!quit_requested && !streaming_requested) {
             if (read_command(true) < 0) {
                 syslog(LOG_ERR, "FAILED to read command\n");
-                goto done;
+                return;
             }
         }
 
@@ -422,16 +436,10 @@ do_capture(const char *streamport, FILE *f_log)
             //usleep(1);
             if (read_command(false) < 0) {
                 syslog(LOG_ERR, "FAILED to read command\n");
-                goto done;
+                return;
             }
         }
     }
-
-done:
-    if (streamfd >= 0) {
-        close(streamfd);
-        streamfd = -1;
-    }
 }
 
 #define arg_error(...) syslog(LOG_ERR, ## __VA_ARGS__);
-- 
2.13.5 (Apple Git-94)



More information about the Spice-devel mailing list