Fix the build for older macOS.
[dcpomatic.git] / src / lib / nanomsg.cc
index 4cc071370d0f9674e8de56a6b86df0912e06eab1..61e6c08ce9e66fa738300b9a417267356f71a8b6 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2020 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2020-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -18,6 +18,7 @@
 
 */
 
+
 #include "nanomsg.h"
 #include "dcpomatic_log.h"
 #include "exceptions.h"
 #include <stdexcept>
 #include <cerrno>
 
+
 using std::string;
 using std::runtime_error;
 using boost::optional;
 
+
 #define NANOMSG_URL "ipc:///tmp/dcpomatic.ipc"
 
+
 Nanomsg::Nanomsg (bool server)
 {
        _socket = nn_socket (AF_SP, NN_PAIR);
@@ -39,16 +43,24 @@ Nanomsg::Nanomsg (bool server)
                throw runtime_error("Could not set up nanomsg socket");
        }
        if (server) {
-               if (nn_bind(_socket, NANOMSG_URL) < 0) {
+               if ((_endpoint = nn_bind(_socket, NANOMSG_URL)) < 0) {
                        throw runtime_error(String::compose("Could not bind nanomsg socket (%1)", errno));
                }
        } else {
-               if (nn_connect(_socket, NANOMSG_URL) < 0) {
+               if ((_endpoint = nn_connect(_socket, NANOMSG_URL)) < 0) {
                        throw runtime_error(String::compose("Could not connect nanomsg socket (%1)", errno));
                }
        }
 }
 
+
+Nanomsg::~Nanomsg ()
+{
+       nn_shutdown (_socket, _endpoint);
+       nn_close (_socket);
+}
+
+
 bool
 Nanomsg::send (string s, int timeout)
 {
@@ -69,18 +81,20 @@ Nanomsg::send (string s, int timeout)
        return true;
 }
 
+
 optional<string>
 Nanomsg::get_from_pending ()
 {
        if (_pending.empty()) {
-               return optional<string>();
+               return {};
        }
 
-       string const l = _pending.back();
+       auto const l = _pending.back();
        _pending.pop_back();
        return l;
 }
 
+
 void
 Nanomsg::recv_and_parse (int flags)
 {
@@ -92,6 +106,7 @@ Nanomsg::recv_and_parse (int flags)
                        return;
                }
 
+               LOG_DISK_NC("nn_recv failed");
                throw CommunicationFailedError ();
        }
 
@@ -108,6 +123,7 @@ Nanomsg::recv_and_parse (int flags)
        nn_freemsg (buf);
 }
 
+
 optional<string>
 Nanomsg::receive (int timeout)
 {
@@ -115,7 +131,7 @@ Nanomsg::receive (int timeout)
                nn_setsockopt (_socket, NN_SOL_SOCKET, NN_RCVTIMEO, &timeout, sizeof(int));
        }
 
-       optional<string> l = get_from_pending ();
+       auto l = get_from_pending ();
        if (l) {
                return *l;
        }