Allow threads to reopen after closing

pull/4/head
Paul Hollinsky 2018-11-16 17:08:53 -05:00
parent 0cf1e7fe7f
commit 07a5dc4118
7 changed files with 14 additions and 1 deletions

View File

@ -31,8 +31,10 @@ void Communication::spawnThreads() {
} }
void Communication::joinThreads() { void Communication::joinThreads() {
closing = true;
if(readTaskThread.joinable()) if(readTaskThread.joinable())
readTaskThread.join(); readTaskThread.join();
closing = false;
} }
bool Communication::close() { bool Communication::close() {
@ -40,7 +42,6 @@ bool Communication::close() {
return false; return false;
isOpen = false; isOpen = false;
closing = true;
joinThreads(); joinThreads();
return impl->close(); return impl->close();

View File

@ -12,8 +12,10 @@ void MultiChannelCommunication::spawnThreads() {
} }
void MultiChannelCommunication::joinThreads() { void MultiChannelCommunication::joinThreads() {
closing = true;
if(mainChannelReadThread.joinable()) if(mainChannelReadThread.joinable())
mainChannelReadThread.join(); mainChannelReadThread.join();
closing = false;
} }
bool MultiChannelCommunication::sendPacket(std::vector<uint8_t>& bytes) { bool MultiChannelCommunication::sendPacket(std::vector<uint8_t>& bytes) {

View File

@ -180,6 +180,7 @@ bool Device::close() {
if(internalHandlerCallbackID) if(internalHandlerCallbackID)
com->removeMessageCallback(internalHandlerCallbackID); com->removeMessageCallback(internalHandlerCallbackID);
goOffline();
return com->close(); return com->close();
} }

View File

@ -97,6 +97,8 @@ bool FTDI::close() {
if(writeThread.joinable()) if(writeThread.joinable())
writeThread.join(); writeThread.join();
closing = false;
if(ftdiDevice.close()) if(ftdiDevice.close())
return false; return false;

View File

@ -252,6 +252,8 @@ bool STM32::close() {
if(writeThread.joinable()) if(writeThread.joinable())
writeThread.join(); writeThread.join();
closing = false;
int ret = ::close(fd); int ret = ::close(fd);
fd = -1; fd = -1;

View File

@ -228,6 +228,7 @@ bool PCAP::close() {
closing = true; // Signal the threads that we are closing closing = true; // Signal the threads that we are closing
readThread.join(); readThread.join();
writeThread.join(); writeThread.join();
closing = false;
pcap.close(interface.fp); pcap.close(interface.fp);
interface.fp = nullptr; interface.fp = nullptr;

View File

@ -214,6 +214,7 @@ bool VCP::close() {
t->join(); // Wait for the threads to close t->join(); // Wait for the threads to close
readThread.join(); readThread.join();
writeThread.join(); writeThread.join();
closing = false;
if(!CloseHandle(handle)) if(!CloseHandle(handle))
return false; return false;
@ -224,14 +225,17 @@ bool VCP::close() {
if(overlappedRead.hEvent != INVALID_HANDLE_VALUE) { if(overlappedRead.hEvent != INVALID_HANDLE_VALUE) {
if(!CloseHandle(overlappedRead.hEvent)) if(!CloseHandle(overlappedRead.hEvent))
ret = false; ret = false;
overlappedRead.hEvent = INVALID_HANDLE_VALUE;
} }
if(overlappedWrite.hEvent != INVALID_HANDLE_VALUE) { if(overlappedWrite.hEvent != INVALID_HANDLE_VALUE) {
if(!CloseHandle(overlappedWrite.hEvent)) if(!CloseHandle(overlappedWrite.hEvent))
ret = false; ret = false;
overlappedWrite.hEvent = INVALID_HANDLE_VALUE;
} }
if(overlappedWait.hEvent != INVALID_HANDLE_VALUE) { if(overlappedWait.hEvent != INVALID_HANDLE_VALUE) {
if(!CloseHandle(overlappedWait.hEvent)) if(!CloseHandle(overlappedWait.hEvent))
ret = false; ret = false;
overlappedWait.hEvent = INVALID_HANDLE_VALUE;
} }
// TODO Set up some sort of shared memory, free which COM port we had open so we can try to open it again // TODO Set up some sort of shared memory, free which COM port we had open so we can try to open it again