diff --git a/radio/src/os/task_pthread.cpp b/radio/src/os/task_pthread.cpp index bc7d05f1d..0b63668cc 100644 --- a/radio/src/os/task_pthread.cpp +++ b/radio/src/os/task_pthread.cpp @@ -80,7 +80,8 @@ void task_shutdown_all() pthread_join(task, nullptr); } - timer_queue::instance().stop(); + timer_queue::destroy(); + _stop_tasks = false; } struct run_context { diff --git a/radio/src/os/timer_pthread.cpp b/radio/src/os/timer_pthread.cpp index 3f575535c..0c62b5e9b 100644 --- a/radio/src/os/timer_pthread.cpp +++ b/radio/src/os/timer_pthread.cpp @@ -4,6 +4,9 @@ #include +static timer_queue* _instance = nullptr; +static std::mutex _instance_mut; + bool _timer_cmp(timer_handle_t *lh, timer_handle_t *rh) { return lh->next_trigger < rh->next_trigger; } @@ -22,8 +25,21 @@ void timer_queue::sort_timers() { timer_queue& timer_queue::instance() { - static timer_queue _instance; - return _instance; + std::lock_guard lock(_instance_mut); + if (!_instance) { + _instance = new timer_queue(); + } + return *_instance; +} + +void timer_queue::destroy() +{ + std::lock_guard lock(_instance_mut); + if (_instance) { + _instance->stop(); + delete _instance; + _instance = nullptr; + } } void timer_queue::start() diff --git a/radio/src/os/timer_pthread.h b/radio/src/os/timer_pthread.h index f879d1b80..00e6d5786 100644 --- a/radio/src/os/timer_pthread.h +++ b/radio/src/os/timer_pthread.h @@ -41,5 +41,5 @@ struct timer_handle_t { std::atomic_bool active; }; -#define TIMER_INITIALIZER {} +#define TIMER_INITIALIZER {0} diff --git a/radio/src/os/timer_pthread_impl.h b/radio/src/os/timer_pthread_impl.h index 931d3d9eb..ff4e3ca90 100644 --- a/radio/src/os/timer_pthread_impl.h +++ b/radio/src/os/timer_pthread_impl.h @@ -31,7 +31,7 @@ struct timer_req_t { class timer_queue { std::unique_ptr _thread; - bool _running; + bool _running = false; std::deque _cmds; std::mutex _cmds_mutex; @@ -54,18 +54,19 @@ class timer_queue { void async_calls(); void process_cmds(); void send_cmd(timer_req_t&& req); + void stop(); public: timer_queue(timer_queue const &) = delete; void operator=(timer_queue const &) = delete; static timer_queue &instance(); + static void destroy(); static void create_timer(timer_handle_t *timer, timer_func_t func, const char *name, unsigned period, bool repeat); void start(); - void stop(); void start_timer(timer_handle_t *timer); void stop_timer(timer_handle_t *timer);