Commit 4d49084b authored by Sergi Hernandez's avatar Sergi Hernandez
Browse files

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.
parent 0d51d948
Pipeline #6441 passed with stages
in 32 seconds
......@@ -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);
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment