From 1575e2d01534dba7892cc4922ebf0d200673983c Mon Sep 17 00:00:00 2001 From: gscalamera <graziano.scalamera@elettra.eu> Date: Tue, 5 Jan 2021 13:07:13 +0100 Subject: [PATCH] Fix crash when stopping --- src/AlarmHandler.cpp | 7 ++++--- src/update-thread.cpp | 20 +++++++++++++++----- src/update-thread.h | 3 ++- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/AlarmHandler.cpp b/src/AlarmHandler.cpp index 59f9cd5..47e4ddf 100644 --- a/src/AlarmHandler.cpp +++ b/src/AlarmHandler.cpp @@ -192,6 +192,7 @@ void AlarmHandler::delete_device() DEBUG_STREAM << __func__ << " starting="<<(int)starting << " shutting_down="<<(int)shutting_down<<" restarting="<<(int)restarting; abortflag = true; + updateloop->signal(); DEBUG_STREAM << "AlarmHandler::delete_device(): after abortflag=true..." << endl; try { events->unsubscribe_events(); @@ -210,10 +211,11 @@ void AlarmHandler::delete_device() if(!shutting_down && !restarting) alarms.del_rwlock(); //otherwise moved in alarm_table destructor alarms.stop_cmdthread(); - sleep(1); //wait for alarm_thread and log_thread to exit + delete events; + sleep(1); //wait for alarm_thread, update_thread and log_thread to exit //delete almloop; DEBUG_STREAM << "AlarmHandler::delete_device(): stopped alarm and log threads!" << endl; - + //delete proxy for actions for(alarm_container_t::iterator i = alarms.v_alarm.begin(); i!=alarms.v_alarm.end(); i++) @@ -314,7 +316,6 @@ void AlarmHandler::delete_device() delete alarmedlock; delete internallock; delete dslock; - delete events; instanceCounter--; //Tango::leavefunc(); diff --git a/src/update-thread.cpp b/src/update-thread.cpp index 6064f4f..1249e5f 100644 --- a/src/update-thread.cpp +++ b/src/update-thread.cpp @@ -26,7 +26,7 @@ static const char __FILE__rev[] = __FILE__ " $Revision: 1.2 $"; /* * alarm_thread::alarm_thread() */ -update_thread::update_thread(AlarmHandler_ns::AlarmHandler *p) : p_Alarm(p) +update_thread::update_thread(AlarmHandler_ns::AlarmHandler *p) : p_Alarm(p),Tango::LogAdapter(p) { //cout << __FILE__rev << endl; } @@ -36,6 +36,7 @@ update_thread::update_thread(AlarmHandler_ns::AlarmHandler *p) : p_Alarm(p) */ update_thread::~update_thread() { + DEBUG_STREAM << __func__ << "update_thread::run(): exiting!" << endl; p_Alarm = NULL; } @@ -52,14 +53,23 @@ void update_thread::run(void *) while (!p_Alarm->abortflag) { try { - omni_thread::sleep(pausasec,pausanano); - p_Alarm->timer_update(); + //omni_thread::sleep(pausasec,pausanano); + abort_sleep(pausasec+(double)pausanano/1000000000); + if(!p_Alarm->abortflag) + p_Alarm->timer_update(); //printf("update_thread::run(): TIMER!!\n"); } catch(...) { - printf("update_thread::run(): catched unknown exception!!\n"); + INFO_STREAM << "update_thread::run(): catched unknown exception!!"; } } - //cout << "update_thread::run(): exiting!" << endl; + DEBUG_STREAM << "update_thread::run(): exiting!" << endl; } /* update_thread::run() */ + +void update_thread::abort_sleep(double time) +{ + omni_mutex_lock sync(*this); + long time_millis = (long)(time*1000); + int res = wait(time_millis); +} diff --git a/src/update-thread.h b/src/update-thread.h index ef97c4f..1d299a1 100644 --- a/src/update-thread.h +++ b/src/update-thread.h @@ -24,13 +24,14 @@ #include <tango.h> #include <AlarmHandler.h> -class update_thread : public omni_thread { +class update_thread : public omni_thread, public Tango::TangoMonitor, public Tango::LogAdapter { public: update_thread(AlarmHandler_ns::AlarmHandler *p); ~update_thread(); protected: void run(void *); private: + void abort_sleep(double time); AlarmHandler_ns::AlarmHandler *p_Alarm; }; -- GitLab