diff options
Diffstat (limited to 'host/lib/utils/tasks.cpp')
-rw-r--r-- | host/lib/utils/tasks.cpp | 116 |
1 files changed, 58 insertions, 58 deletions
diff --git a/host/lib/utils/tasks.cpp b/host/lib/utils/tasks.cpp index a2d7f82d3..ce6e1716c 100644 --- a/host/lib/utils/tasks.cpp +++ b/host/lib/utils/tasks.cpp @@ -21,19 +21,19 @@ using namespace uhd; -class task_impl : public task{ +class task_impl : public task +{ public: - - task_impl(const task_fcn_type &task_fcn, const std::string &name): - _exit(false) + task_impl(const task_fcn_type& task_fcn, const std::string& name) : _exit(false) { - _task = std::thread([this, task_fcn](){ this->task_loop(task_fcn); }); + _task = std::thread([this, task_fcn]() { this->task_loop(task_fcn); }); if (not name.empty()) { set_thread_name(&_task, name); } } - ~task_impl(void){ + ~task_impl(void) + { _exit = true; if (_task.joinable()) { _task.join(); @@ -41,37 +41,37 @@ public: } private: - void task_loop(const task_fcn_type &task_fcn){ - try{ - while (!_exit){ + void task_loop(const task_fcn_type& task_fcn) + { + try { + while (!_exit) { task_fcn(); } - } - catch(const std::exception &e){ + } catch (const std::exception& e) { do_error_msg(e.what()); - } - catch(...){ + } catch (...) { UHD_THROW_INVALID_CODE_PATH(); } } - void do_error_msg(const std::string &msg){ + void do_error_msg(const std::string& msg) + { UHD_LOGGER_ERROR("UHD") << "An unexpected exception was caught in a task loop." - << "The task loop will now exit, things may not work." - << msg - ; + << "The task loop will now exit, things may not work." << msg; } std::atomic<bool> _exit; std::thread _task; }; -task::sptr task::make(const task_fcn_type &task_fcn, const std::string &name){ +task::sptr task::make(const task_fcn_type& task_fcn, const std::string& name) +{ return task::sptr(new task_impl(task_fcn, name)); } -msg_task::~msg_task(void){ +msg_task::~msg_task(void) +{ /* NOP */ } @@ -81,17 +81,18 @@ msg_task::~msg_task(void){ * ctrl_cores can check this queue for stranded messages. */ -class msg_task_impl : public msg_task{ +class msg_task_impl : public msg_task +{ public: - - msg_task_impl(const task_fcn_type &task_fcn): - _spawn_barrier(2) + msg_task_impl(const task_fcn_type& task_fcn) : _spawn_barrier(2) { - (void)_thread_group.create_thread(std::bind(&msg_task_impl::task_loop, this, task_fcn)); + (void)_thread_group.create_thread( + std::bind(&msg_task_impl::task_loop, this, task_fcn)); _spawn_barrier.wait(); } - ~msg_task_impl(void){ + ~msg_task_impl(void) + { _running = false; _thread_group.interrupt_all(); _thread_group.join_all(); @@ -99,8 +100,8 @@ public: /* * Returns the first message for the given SID. - * This way a radio_ctrl_core doesn't have to die in timeout but can check for stranded messages here. - * This might happen during shutdown when dtors are called. + * This way a radio_ctrl_core doesn't have to die in timeout but can check for + * stranded messages here. This might happen during shutdown when dtors are called. * See also: comments in b200_io_impl->handle_async_task */ msg_payload_t get_msg_from_dump_queue(uint32_t sid) @@ -118,43 +119,40 @@ public: } private: - - void task_loop(const task_fcn_type &task_fcn){ + void task_loop(const task_fcn_type& task_fcn) + { _running = true; _spawn_barrier.wait(); - try{ - while (_running){ - boost::optional<msg_type_t> buff = task_fcn(); - if(buff != boost::none){ - /* - * If a message gets stranded it is returned by task_fcn and then pushed to the dump_queue. - * This way ctrl_cores can check dump_queue for missing messages. - */ - boost::mutex::scoped_lock lock(_mutex); - _dump_queue.push_back(buff.get() ); - } + try { + while (_running) { + boost::optional<msg_type_t> buff = task_fcn(); + if (buff != boost::none) { + /* + * If a message gets stranded it is returned by task_fcn and then + * pushed to the dump_queue. This way ctrl_cores can check dump_queue + * for missing messages. + */ + boost::mutex::scoped_lock lock(_mutex); + _dump_queue.push_back(buff.get()); + } } - } - catch(const boost::thread_interrupted &){ - //this is an ok way to exit the task loop - } - catch(const std::exception &e){ + } catch (const boost::thread_interrupted&) { + // this is an ok way to exit the task loop + } catch (const std::exception& e) { do_error_msg(e.what()); - } - catch(...){ - //FIXME - //Unfortunately, this is also an ok way to end a task, - //because on some systems boost throws uncatchables. + } catch (...) { + // FIXME + // Unfortunately, this is also an ok way to end a task, + // because on some systems boost throws uncatchables. } } - void do_error_msg(const std::string &msg){ + void do_error_msg(const std::string& msg) + { UHD_LOGGER_ERROR("UHD") - << "An unexpected exception was caught in a task loop." - << "The task loop will now exit, things may not work." - << msg - ; + << "An unexpected exception was caught in a task loop." + << "The task loop will now exit, things may not work." << msg; } boost::mutex _mutex; @@ -163,11 +161,13 @@ private: bool _running; /* - * This queue holds stranded messages until a radio_ctrl_core grabs them via 'get_msg_from_dump_queue'. + * This queue holds stranded messages until a radio_ctrl_core grabs them via + * 'get_msg_from_dump_queue'. */ - std::vector <msg_type_t> _dump_queue; + std::vector<msg_type_t> _dump_queue; }; -msg_task::sptr msg_task::make(const task_fcn_type &task_fcn){ +msg_task::sptr msg_task::make(const task_fcn_type& task_fcn) +{ return msg_task::sptr(new msg_task_impl(task_fcn)); } |