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