From 4d49084b2e14474107d15fb0e71c03a194077dff Mon Sep 17 00:00:00 2001 From: Sergi Hernandez Juan <shernand@iri.upc.edu> Date: Thu, 10 Dec 2020 17:34:00 +0100 Subject: [PATCH] Used the pthread_setcancelstate function to configure where the thread can be cancelled. Added a mutex unlock in the exception catch in the thread to avoid blocking when an error occurs. --- src/comm.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/comm.cpp b/src/comm.cpp index 3acf8a7..a1078ba 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); } -- GitLab