aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Globals.cpp36
-rw-r--r--lib/Log.cpp33
-rw-r--r--lib/Log.h14
-rw-r--r--lib/RemoteControl.cpp2
-rw-r--r--lib/RemoteControl.h2
5 files changed, 66 insertions, 21 deletions
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;
+ }
}
}
}
diff --git a/lib/Log.h b/lib/Log.h
index d5c39e0..f20e698 100644
--- a/lib/Log.h
+++ b/lib/Log.h
@@ -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