X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fnanomsg.cc;h=8061e2f8462c2b101f01e9ea71e48ca5724c71a1;hb=3f2142a90410755d090ace98ada1fee5a869da98;hp=0fc0dd357edc7a5b61535922c4ac96b805cc08cd;hpb=350afcbc40fffd8c8780180e153a2ee91088f562;p=dcpomatic.git diff --git a/src/lib/nanomsg.cc b/src/lib/nanomsg.cc index 0fc0dd357..8061e2f84 100644 --- a/src/lib/nanomsg.cc +++ b/src/lib/nanomsg.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2020 Carl Hetherington + Copyright (C) 2020-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -18,20 +18,24 @@ */ -#include "nanomsg.h" + #include "dcpomatic_log.h" #include "exceptions.h" +#include "nanomsg.h" #include #include -#include #include +#include + -using std::string; using std::runtime_error; +using std::string; 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 Nanomsg::get_from_pending () { if (_pending.empty()) { - return optional(); + 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 Nanomsg::receive (int timeout) { @@ -115,7 +131,7 @@ Nanomsg::receive (int timeout) nn_setsockopt (_socket, NN_SOL_SOCKET, NN_RCVTIMEO, &timeout, sizeof(int)); } - optional l = get_from_pending (); + auto l = get_from_pending (); if (l) { return *l; } @@ -123,9 +139,4 @@ Nanomsg::receive (int timeout) recv_and_parse (timeout ? 0 : NN_DONTWAIT); return get_from_pending (); - if (!l) { - throw CommunicationFailedError (); - } - - return *l; }