diff --git a/src/comm.cpp b/src/comm.cpp index 3acf8a7f841046905bc147af039a0e6b65096813..a1078ba3328a6e68baf42d466da3f6ef23c18cc7 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -4,6 +4,7 @@ #include "comm.h" #include "commexceptions.h" #include "ctime.h" +#include "pthread.h" CComm::CComm(const std::string& comm_id) { @@ -212,7 +213,9 @@ void CComm::close(void) { /* finish the thread */ if(this->state==configured) + { this->thread_server->kill_thread(this->comm_thread_id); + } /* close the communication device */ this->access_comm.try_enter(); try{ @@ -238,7 +241,9 @@ void *CComm::comm_thread(void *param) while(!end) { + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); wait_result=comm_dev->hard_wait_comm_event(); + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL); try{ comm_dev->access_comm.enter(); if(wait_result==-1) @@ -256,6 +261,8 @@ void *CComm::comm_thread(void *param) } comm_dev->access_comm.exit(); }catch(CException &e){ + comm_dev->access_comm.exit(); + std::cout << e.what() << std::endl; end=true; } } @@ -309,16 +316,12 @@ void CComm::on_error(void) CComm::~CComm() { + this->close(); /* delete the events */ - if(this->rx_event_id.size()!=0) - this->event_server->delete_event(this->rx_event_id); - if(this->error_event_id.size()!=0) - { - this->event_server->delete_event(this->error_event_id); - } + this->event_server->delete_event(this->rx_event_id); + this->rx_event_id=""; + this->event_server->delete_event(this->error_event_id); + this->error_event_id=""; /* delete the thread */ - if(this->comm_thread_id.size()!=0) - { - this->thread_server->delete_thread(this->comm_thread_id); - } + this->thread_server->delete_thread(this->comm_thread_id); }