diff options
| -rw-r--r-- | Makefile.am | 7 | ||||
| -rw-r--r-- | lib/Globals.cpp | 36 | ||||
| -rw-r--r-- | lib/Log.cpp | 33 | ||||
| -rw-r--r-- | lib/Log.h | 14 | ||||
| -rw-r--r-- | lib/RemoteControl.cpp | 2 | ||||
| -rw-r--r-- | lib/RemoteControl.h | 2 | 
6 files changed, 73 insertions, 21 deletions
| diff --git a/Makefile.am b/Makefile.am index e9001d6..2ae6a43 100644 --- a/Makefile.am +++ b/Makefile.am @@ -143,6 +143,7 @@ odr_dabmux_SOURCES  =src/DabMux.cpp \  					 lib/crc.c \  					 lib/ClockTAI.h \  					 lib/ClockTAI.cpp \ +					 lib/Globals.cpp \  					 lib/Log.h \  					 lib/Log.cpp \  					 lib/RemoteControl.cpp \ @@ -185,8 +186,11 @@ zmqinput_keygen_CFLAGS   = -Wall $(GITVERSION_FLAGS) $(ZMQ_CPPFLAGS)  odr_zmq2farsync_SOURCES  = src/zmq2farsync/zmq2farsync.cpp \  						   src/dabOutput/dabOutput.h \  						   src/dabOutput/dabOutputRaw.cpp \ +						   lib/Globals.cpp \  						   lib/Log.h \  						   lib/Log.cpp \ +						   lib/RemoteControl.cpp \ +						   lib/RemoteControl.h \  						   lib/zmq.hpp  odr_zmq2farsync_LDADD    = $(ZMQ_LIBS) @@ -212,8 +216,11 @@ odr_zmq2edi_SOURCES  = src/zmq2edi/zmq2edi.cpp \  					   lib/edioutput/TagPacket.h \  					   lib/edioutput/Transport.cpp \  					   lib/edioutput/Transport.h \ +					   lib/Globals.cpp \  					   lib/Log.h \  					   lib/Log.cpp \ +					   lib/RemoteControl.cpp \ +					   lib/RemoteControl.h \  					   lib/crc.h \  					   lib/crc.c \  					   lib/ReedSolomon.h \ diff --git a/lib/Globals.cpp b/lib/Globals.cpp new file mode 100644 index 0000000..6be26ec --- /dev/null +++ b/lib/Globals.cpp @@ -0,0 +1,36 @@ +/* +   Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +   Her Majesty the Queen in Right of Canada (Communications Research +   Center Canada) + +   Copyright (C) 2019 +   Matthias P. Braendli, matthias.braendli@mpb.li + +    http://www.opendigitalradio.org + */ +/* +   This file is part of the ODR-mmbTools. + +   This program is free software: you can redistribute it and/or modify +   it under the terms of the GNU General Public License as +   published by the Free Software Foundation, either version 3 of the +   License, or (at your option) any later version. + +   This program is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +   GNU General Public License for more details. + +   You should have received a copy of the GNU General Public License +   along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +/* Ensure construction and destruction of static globals in the right order */ + +#include "Log.h" +#include "RemoteControl.h" + +// the RC needs logging, and needs to be initialised later. +Logger etiLog; +RemoteControllers rcs; + diff --git a/lib/Log.cpp b/lib/Log.cpp index 2417f3a..abbd69a 100644 --- a/lib/Log.cpp +++ b/lib/Log.cpp @@ -34,12 +34,23 @@  using namespace std; -/* etiLog is a singleton used in all parts of the program to output log messages. - */ -Logger etiLog; + +Logger::Logger() +{ +    m_io_thread = std::thread(&Logger::io_process, this); +} + +Logger::~Logger() { +    m_message_queue.trigger_wakeup(); +    m_io_thread.join(); + +    std::lock_guard<std::mutex> guard(m_backend_mutex); +    backends.clear(); +}  void Logger::register_backend(std::shared_ptr<LogBackend> backend)  { +    std::lock_guard<std::mutex> guard(m_backend_mutex);      backends.push_back(backend);  } @@ -75,7 +86,7 @@ void Logger::logstr(log_level_t level, std::string&& message)  {      if (level == discard) {          return; -	} +    }      log_message_t m(level, move(message));      m_message_queue.push(move(m)); @@ -101,13 +112,15 @@ void Logger::io_process()              message.resize(message.length()-1);          } -        for (auto &backend : backends) { -            backend->log(m.level, message); -        } +        { +            std::lock_guard<std::mutex> guard(m_backend_mutex); +            for (auto &backend : backends) { +                backend->log(m.level, message); +            } -        if (m.level != log_level_t::trace) { -            std::lock_guard<std::mutex> guard(m_cerr_mutex); -            std::cerr << levels_as_str[m.level] << " " << message << std::endl; +            if (m.level != log_level_t::trace) { +                std::cerr << levels_as_str[m.level] << " " << message << std::endl; +            }          }      }  } @@ -133,16 +133,10 @@ struct log_message_t {  class Logger {      public: -        Logger() { -            m_io_thread = std::thread(&Logger::io_process, this); -        } - +        Logger();          Logger(const Logger& other) = delete;          const Logger& operator=(const Logger& other) = delete; -        ~Logger() { -            m_message_queue.trigger_wakeup(); -            m_io_thread.join(); -        } +        ~Logger();          void register_backend(std::shared_ptr<LogBackend> backend); @@ -163,9 +157,11 @@ class Logger {          ThreadsafeQueue<log_message_t> m_message_queue;          std::thread m_io_thread; -        std::mutex m_cerr_mutex; +        std::mutex m_backend_mutex;  }; +/* etiLog is a singleton used in all parts of the program to output log messages. + * It is constructed in Globals.cpp */  extern Logger etiLog;  // Accumulate a line of logs, using same syntax as stringstream diff --git a/lib/RemoteControl.cpp b/lib/RemoteControl.cpp index 878af59..4adb90c 100644 --- a/lib/RemoteControl.cpp +++ b/lib/RemoteControl.cpp @@ -32,8 +32,6 @@  using namespace std; -RemoteControllers rcs; -  RemoteControllerTelnet::~RemoteControllerTelnet()  {      m_active = false; diff --git a/lib/RemoteControl.h b/lib/RemoteControl.h index bd88f82..2358b3a 100644 --- a/lib/RemoteControl.h +++ b/lib/RemoteControl.h @@ -149,6 +149,8 @@ class RemoteControllers {          std::list<std::shared_ptr<BaseRemoteController> > m_controllers;  }; +/* rcs is a singleton used in all parts of the program to interact with the RC. + * It is constructed in Globals.cpp */  extern RemoteControllers rcs;  /* Implements a Remote controller based on a simple telnet CLI | 
