From 08b0a7cd82f7e4f8f9bdd86800ad256ea733f61d Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 24 Feb 2019 13:22:52 +0100 Subject: [PATCH 1/5] Fix thread termination Some boost::threads replaced by std::threads --- src/core/receiver/CMakeLists.txt | 1 - src/core/receiver/control_thread.cc | 38 ++++++++++++++--------------- src/core/receiver/control_thread.h | 10 ++++---- 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/src/core/receiver/CMakeLists.txt b/src/core/receiver/CMakeLists.txt index 469960d47..a9225792d 100644 --- a/src/core/receiver/CMakeLists.txt +++ b/src/core/receiver/CMakeLists.txt @@ -143,7 +143,6 @@ target_link_libraries(core_receiver core_libs core_monitor PRIVATE - Boost::chrono Gflags::gflags Glog::glog signal_source_adapters diff --git a/src/core/receiver/control_thread.cc b/src/core/receiver/control_thread.cc index e7cd49740..accddea95 100644 --- a/src/core/receiver/control_thread.cc +++ b/src/core/receiver/control_thread.cc @@ -54,7 +54,6 @@ #include "rtklib_conversions.h" #include "rtklib_ephemeris.h" #include "rtklib_rtkcmn.h" -#include #include #include #include @@ -197,6 +196,16 @@ ControlThread::~ControlThread() // NOLINT(modernize-use-equals-default) { msgctl(msqid, IPC_RMID, nullptr); } + + if (sysv_queue_thread_.joinable()) + { + sysv_queue_thread_.join(); + } + + if (cmd_interface_thread_.joinable()) + { + cmd_interface_thread_.join(); + } } @@ -256,12 +265,12 @@ int ControlThread::run() // launch GNSS assistance process AFTER the flowgraph is running because the GNU Radio asynchronous queues must be already running to transport msgs assist_GNSS(); // start the keyboard_listener thread - keyboard_thread_ = boost::thread(&ControlThread::keyboard_listener, this); - sysv_queue_thread_ = boost::thread(&ControlThread::sysv_queue_listener, this); + keyboard_thread_ = std::thread(&ControlThread::keyboard_listener, this); + sysv_queue_thread_ = std::thread(&ControlThread::sysv_queue_listener, this); // start the telecommand listener thread cmd_interface_.set_pvt(flowgraph_->get_pvt()); - cmd_interface_thread_ = boost::thread(&ControlThread::telecommand_listener, this); + cmd_interface_thread_ = std::thread(&ControlThread::telecommand_listener, this); bool enable_FPGA = configuration_->property("Channel.enable_FPGA", false); if (enable_FPGA == true) @@ -284,21 +293,10 @@ int ControlThread::run() stop_ = true; flowgraph_->disconnect(); - // Join keyboard thread - try - { - keyboard_thread_.try_join_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); - sysv_queue_thread_.try_join_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); - cmd_interface_thread_.try_join_until(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(1000)); - } - catch (const boost::thread_interrupted &interrupt) - { - DLOG(WARNING) << "Thread interrupted"; - } - catch (const boost::system::system_error &e) - { - LOG(WARNING) << "System error"; - } + // Terminate keyboard thread + pthread_t id = keyboard_thread_.native_handle(); + keyboard_thread_.detach(); + pthread_cancel(id); if (restart_) { @@ -1105,6 +1103,6 @@ void ControlThread::keyboard_listener() } read_keys = false; } - usleep(500000); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); } } diff --git a/src/core/receiver/control_thread.h b/src/core/receiver/control_thread.h index d8fb5584c..6507ca645 100644 --- a/src/core/receiver/control_thread.h +++ b/src/core/receiver/control_thread.h @@ -44,9 +44,9 @@ #include "gnss_sdr_supl_client.h" #include "tcp_cmd_interface.h" #include -#include #include #include +#include #include @@ -120,7 +120,7 @@ private: //Telecommand TCP interface TcpCmdInterface cmd_interface_; void telecommand_listener(); - boost::thread cmd_interface_thread_; + std::thread cmd_interface_thread_; //SUPL assistance classes Gnss_Sdr_Supl_Client supl_client_acquisition_; Gnss_Sdr_Supl_Client supl_client_ephemeris_; @@ -168,9 +168,9 @@ private: bool delete_configuration_; unsigned int processed_control_messages_; unsigned int applied_actions_; - boost::thread keyboard_thread_; - boost::thread sysv_queue_thread_; - boost::thread gps_acq_assist_data_collector_thread_; + std::thread keyboard_thread_; + std::thread sysv_queue_thread_; + std::thread gps_acq_assist_data_collector_thread_; void keyboard_listener(); void sysv_queue_listener(); From 88195f40b8f28f9a677a548bd34d9884e64c0a4c Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 24 Feb 2019 14:11:21 +0100 Subject: [PATCH 2/5] Leave CMAKE_CXX_FLAGS alone --- CMakeLists.txt | 67 ++++++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1272bc341..9d6be231f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -420,23 +420,23 @@ if(NOT (CMAKE_VERSION VERSION_LESS "3.1")) else() if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND NOT WIN32) if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "6.1.1") - set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -std=c++11") + add_compile_options(-std=c++11) else() - set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -std=c++14") + add_compile_options(-std=c++14) endif() endif() if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") if(OS_IS_MACOSX) if(CLANG_VERSION VERSION_LESS "600") - set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -std=c++11") + add_compile_options(-std=c++11) else() - set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -std=c++14") + add_compile_options(-std=c++14) endif() else() if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.5.0") - set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -std=c++11") + add_compile_options(-std=c++11) else() - set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -std=c++14") + add_compile_options(-std=c++14) endif() endif() endif() @@ -1834,10 +1834,10 @@ if(ENABLE_GPERFTOOLS) # See https://github.com/gperftools/gperftools/blob/master/README if(GPERFTOOLS_FOUND) if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND NOT WIN32) - set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free") + add_compile_options(-fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free) endif() if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -fno-builtin") + add_compile_options(-fno-builtin) endif() endif() endif() @@ -1848,7 +1848,7 @@ endif() # GNU gprof (OPTIONAL) - https://sourceware.org/binutils/docs/gprof/ ######################################################################## if(ENABLE_GPROF) - set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -pg") + add_compile_options(-pg) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg") endif() @@ -1858,35 +1858,38 @@ endif() # Set compiler flags ######################################################################## if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND NOT WIN32) - set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -Wall -Wextra") #Add warning flags: For "-Wall" see https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html + # Add warning flags + # For "-Wall" see https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html + add_compile_options(-Wall -Wextra) + if(CMAKE_CROSSCOMPILING) + add_compile_options(-Wno-psabi) + endif() endif() # Processor-architecture related flags # See https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html -if(NOT ARCH_COMPILER_FLAGS) - if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND NOT WIN32) - if(OS_IS_MACOSX) - set(ARCH_COMPILER_FLAGS "-march=corei7 -mfpmath=sse") - else() - if(NOT ${ENABLE_GENERIC_ARCH}) - if(IS_ARM) # ARM-specific options (https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html) - if(NOT CMAKE_CROSSCOMPILING) - if(ARM_VERSION STREQUAL "arm") - # Unknown arm version - try our best to detect - set(ARCH_COMPILER_FLAGS "-mcpu=native") - else() - set(ARCH_COMPILER_FLAGS "-march=${ARM_VERSION}") - endif() - endif() - else() - set(ARCH_COMPILER_FLAGS "-march=native -mfpmath=sse") - endif() - endif() - endif() +if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND NOT WIN32) + if(OS_IS_MACOSX) + add_compile_options(-march=corei7 -mfpmath=sse) + else() + if(NOT ENABLE_GENERIC_ARCH) + if(IS_ARM) + # ARM-specific options + # See https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html + if(NOT CMAKE_CROSSCOMPILING) + if(ARM_VERSION STREQUAL "arm") + # Unknown arm version - try our best to detect + add_compile_options(-mcpu=native) + else() + add_compile_options(-march=${ARM_VERSION}) + endif() + endif() + else() + add_compile_options(-march=native -mfpmath=sse) + endif() + endif() endif() endif() -set(MY_CXX_FLAGS "${MY_CXX_FLAGS} ${ARCH_COMPILER_FLAGS}") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MY_CXX_FLAGS}") From 46f985d7632f3599d5ae29f046f39dc3fb5b4dae Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 24 Feb 2019 14:35:18 +0100 Subject: [PATCH 3/5] Fix for CMake < 3.1 --- CMakeLists.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d6be231f..c988a8003 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -420,23 +420,23 @@ if(NOT (CMAKE_VERSION VERSION_LESS "3.1")) else() if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND NOT WIN32) if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "6.1.1") - add_compile_options(-std=c++11) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") else() - add_compile_options(-std=c++14) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") endif() endif() if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") if(OS_IS_MACOSX) if(CLANG_VERSION VERSION_LESS "600") - add_compile_options(-std=c++11) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") else() - add_compile_options(-std=c++14) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") endif() else() if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.5.0") - add_compile_options(-std=c++11) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") else() - add_compile_options(-std=c++14) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") endif() endif() endif() From 869aadc731e2f67304292d173313ca993cfe6bc0 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 24 Feb 2019 19:17:32 +0100 Subject: [PATCH 4/5] Pass warning flags only to C++ targets --- CMakeLists.txt | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c988a8003..ccedec774 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -418,25 +418,26 @@ if(NOT (CMAKE_VERSION VERSION_LESS "3.1")) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_EXTENSIONS OFF) else() + add_compile_options("$<$,C>:-std=gnu11>") if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND NOT WIN32) if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "6.1.1") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + add_compile_options("$<$,CXX>:-std=c++11>") else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") + add_compile_options("$<$,CXX>:-std=c++14>") endif() endif() if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") if(OS_IS_MACOSX) if(CLANG_VERSION VERSION_LESS "600") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + add_compile_options("$<$,CXX>:-std=c++11>") else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") + add_compile_options("$<$,CXX>:-std=c++14>") endif() else() if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.5.0") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + add_compile_options("$<$,CXX>:-std=c++11>") else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") + add_compile_options("$<$,CXX>:-std=c++14>") endif() endif() endif() @@ -1860,7 +1861,8 @@ endif() if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND NOT WIN32) # Add warning flags # For "-Wall" see https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html - add_compile_options(-Wall -Wextra) + set(cxx_warning_flags -Wall -Wextra) + add_compile_options("$<$,CXX>:${cxx_warning_flags}>") if(CMAKE_CROSSCOMPILING) add_compile_options(-Wno-psabi) endif() From d2a3de3c5871c727a72bfaeff094ff8205eddad8 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sun, 24 Feb 2019 20:22:15 +0100 Subject: [PATCH 5/5] Improve compilation options --- CMakeLists.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ccedec774..492169801 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1862,7 +1862,14 @@ if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND NOT WIN32) # Add warning flags # For "-Wall" see https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html set(cxx_warning_flags -Wall -Wextra) - add_compile_options("$<$,CXX>:${cxx_warning_flags}>") + if(NOT (CMAKE_VERSION VERSION_LESS "3.3")) + add_compile_options("$<$:${cxx_warning_flags}>") + else() + add_compile_options("$<$,CXX>:${cxx_warning_flags}>") + endif() + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0") + add_compile_options(-Wno-missing-field-initializers) + endif() if(CMAKE_CROSSCOMPILING) add_compile_options(-Wno-psabi) endif()