Protect controller list updates with mutex

This commit is contained in:
Adam Honse 2020-09-30 22:45:03 -05:00
parent fde002707a
commit 716b2aaac3
2 changed files with 70 additions and 4 deletions

View file

@ -34,6 +34,7 @@ NetworkClient::NetworkClient(std::vector<RGBController *>& control) : controller
client_sock = -1; client_sock = -1;
server_connected = false; server_connected = false;
server_controller_count = 0; server_controller_count = 0;
change_in_progress = false;
ListenThread = NULL; ListenThread = NULL;
ConnectionThread = NULL; ConnectionThread = NULL;
@ -47,6 +48,7 @@ NetworkClient::~NetworkClient()
void NetworkClient::ClientInfoChanged() void NetworkClient::ClientInfoChanged()
{ {
ClientInfoChangeMutex.lock(); ClientInfoChangeMutex.lock();
ControllerListMutex.lock();
/*-------------------------------------------------*\ /*-------------------------------------------------*\
| Client info has changed, call the callbacks | | Client info has changed, call the callbacks |
@ -56,6 +58,7 @@ void NetworkClient::ClientInfoChanged()
ClientInfoChangeCallbacks[callback_idx](ClientInfoChangeCallbackArgs[callback_idx]); ClientInfoChangeCallbacks[callback_idx](ClientInfoChangeCallbackArgs[callback_idx]);
} }
ControllerListMutex.unlock();
ClientInfoChangeMutex.unlock(); ClientInfoChangeMutex.unlock();
} }
@ -229,6 +232,8 @@ void NetworkClient::ConnectionThreadFunction()
requested_controllers++; requested_controllers++;
} }
ControllerListMutex.lock();
//All controllers received, add them to master list //All controllers received, add them to master list
printf("Client: All controllers received, adding them to master list\r\n"); printf("Client: All controllers received, adding them to master list\r\n");
for(std::size_t controller_idx = 0; controller_idx < server_controllers.size(); controller_idx++) for(std::size_t controller_idx = 0; controller_idx < server_controllers.size(); controller_idx++)
@ -236,6 +241,8 @@ void NetworkClient::ConnectionThreadFunction()
controllers.push_back(server_controllers[controller_idx]); controllers.push_back(server_controllers[controller_idx]);
} }
ControllerListMutex.unlock();
server_initialized = true; server_initialized = true;
/*-------------------------------------------------*\ /*-------------------------------------------------*\
@ -409,6 +416,8 @@ listen_done:
server_initialized = false; server_initialized = false;
server_connected = false; server_connected = false;
ControllerListMutex.lock();
for(size_t server_controller_idx = 0; server_controller_idx < server_controllers.size(); server_controller_idx++) for(size_t server_controller_idx = 0; server_controller_idx < server_controllers.size(); server_controller_idx++)
{ {
for(size_t controller_idx = 0; controller_idx < controllers.size(); controller_idx++) for(size_t controller_idx = 0; controller_idx < controllers.size(); controller_idx++)
@ -419,12 +428,19 @@ listen_done:
break; break;
} }
} }
delete server_controllers[server_controller_idx];
} }
std::vector<RGBController *> server_controllers_copy = server_controllers;
server_controllers.clear(); server_controllers.clear();
for(size_t server_controller_idx = 0; server_controller_idx < server_controllers_copy.size(); server_controller_idx++)
{
delete server_controllers_copy[server_controller_idx];
}
ControllerListMutex.unlock();
/*-------------------------------------------------*\ /*-------------------------------------------------*\
| Client info has changed, call the callbacks | | Client info has changed, call the callbacks |
\*-------------------------------------------------*/ \*-------------------------------------------------*/
@ -460,6 +476,8 @@ void NetworkClient::ProcessReply_ControllerData(unsigned int /*data_size*/, char
new_controller->ReadDeviceDescription((unsigned char *)data); new_controller->ReadDeviceDescription((unsigned char *)data);
ControllerListMutex.lock();
if(dev_idx >= server_controllers.size()) if(dev_idx >= server_controllers.size())
{ {
server_controllers.push_back(new_controller); server_controllers.push_back(new_controller);
@ -470,11 +488,17 @@ void NetworkClient::ProcessReply_ControllerData(unsigned int /*data_size*/, char
delete new_controller; delete new_controller;
} }
ControllerListMutex.unlock();
controller_data_received = true; controller_data_received = true;
} }
void NetworkClient::ProcessRequest_DeviceListChanged() void NetworkClient::ProcessRequest_DeviceListChanged()
{ {
change_in_progress = true;
ControllerListMutex.lock();
for(size_t server_controller_idx = 0; server_controller_idx < server_controllers.size(); server_controller_idx++) for(size_t server_controller_idx = 0; server_controller_idx < server_controllers.size(); server_controller_idx++)
{ {
for(size_t controller_idx = 0; controller_idx < controllers.size(); controller_idx++) for(size_t controller_idx = 0; controller_idx < controllers.size(); controller_idx++)
@ -485,12 +509,19 @@ void NetworkClient::ProcessRequest_DeviceListChanged()
break; break;
} }
} }
delete server_controllers[server_controller_idx];
} }
std::vector<RGBController *> server_controllers_copy = server_controllers;
server_controllers.clear(); server_controllers.clear();
for(size_t server_controller_idx = 0; server_controller_idx < server_controllers_copy.size(); server_controller_idx++)
{
delete server_controllers_copy[server_controller_idx];
}
ControllerListMutex.unlock();
/*-------------------------------------------------*\ /*-------------------------------------------------*\
| Client info has changed, call the callbacks | | Client info has changed, call the callbacks |
\*-------------------------------------------------*/ \*-------------------------------------------------*/
@ -500,6 +531,8 @@ void NetworkClient::ProcessRequest_DeviceListChanged()
| Mark server as uninitialized and delete the list | | Mark server as uninitialized and delete the list |
\*-------------------------------------------------*/ \*-------------------------------------------------*/
server_initialized = false; server_initialized = false;
change_in_progress = false;
} }
void NetworkClient::SendData_ClientString() void NetworkClient::SendData_ClientString()
@ -555,6 +588,11 @@ void NetworkClient::SendRequest_ControllerData(unsigned int dev_idx)
void NetworkClient::SendRequest_RGBController_ResizeZone(unsigned int dev_idx, int zone, int new_size) void NetworkClient::SendRequest_RGBController_ResizeZone(unsigned int dev_idx, int zone, int new_size)
{ {
if(change_in_progress)
{
return;
}
NetPacketHeader reply_hdr; NetPacketHeader reply_hdr;
int reply_data[2]; int reply_data[2];
@ -576,6 +614,11 @@ void NetworkClient::SendRequest_RGBController_ResizeZone(unsigned int dev_idx, i
void NetworkClient::SendRequest_RGBController_UpdateLEDs(unsigned int dev_idx, unsigned char * data, unsigned int size) void NetworkClient::SendRequest_RGBController_UpdateLEDs(unsigned int dev_idx, unsigned char * data, unsigned int size)
{ {
if(change_in_progress)
{
return;
}
NetPacketHeader reply_hdr; NetPacketHeader reply_hdr;
reply_hdr.pkt_magic[0] = 'O'; reply_hdr.pkt_magic[0] = 'O';
@ -593,6 +636,11 @@ void NetworkClient::SendRequest_RGBController_UpdateLEDs(unsigned int dev_idx, u
void NetworkClient::SendRequest_RGBController_UpdateZoneLEDs(unsigned int dev_idx, unsigned char * data, unsigned int size) void NetworkClient::SendRequest_RGBController_UpdateZoneLEDs(unsigned int dev_idx, unsigned char * data, unsigned int size)
{ {
if(change_in_progress)
{
return;
}
NetPacketHeader reply_hdr; NetPacketHeader reply_hdr;
reply_hdr.pkt_magic[0] = 'O'; reply_hdr.pkt_magic[0] = 'O';
@ -610,6 +658,11 @@ void NetworkClient::SendRequest_RGBController_UpdateZoneLEDs(unsigned int dev_id
void NetworkClient::SendRequest_RGBController_UpdateSingleLED(unsigned int dev_idx, unsigned char * data, unsigned int size) void NetworkClient::SendRequest_RGBController_UpdateSingleLED(unsigned int dev_idx, unsigned char * data, unsigned int size)
{ {
if(change_in_progress)
{
return;
}
NetPacketHeader reply_hdr; NetPacketHeader reply_hdr;
reply_hdr.pkt_magic[0] = 'O'; reply_hdr.pkt_magic[0] = 'O';
@ -627,6 +680,11 @@ void NetworkClient::SendRequest_RGBController_UpdateSingleLED(unsigned int dev_i
void NetworkClient::SendRequest_RGBController_SetCustomMode(unsigned int dev_idx) void NetworkClient::SendRequest_RGBController_SetCustomMode(unsigned int dev_idx)
{ {
if(change_in_progress)
{
return;
}
NetPacketHeader reply_hdr; NetPacketHeader reply_hdr;
reply_hdr.pkt_magic[0] = 'O'; reply_hdr.pkt_magic[0] = 'O';
@ -643,6 +701,11 @@ void NetworkClient::SendRequest_RGBController_SetCustomMode(unsigned int dev_idx
void NetworkClient::SendRequest_RGBController_UpdateMode(unsigned int dev_idx, unsigned char * data, unsigned int size) void NetworkClient::SendRequest_RGBController_UpdateMode(unsigned int dev_idx, unsigned char * data, unsigned int size)
{ {
if(change_in_progress)
{
return;
}
NetPacketHeader reply_hdr; NetPacketHeader reply_hdr;
reply_hdr.pkt_magic[0] = 'O'; reply_hdr.pkt_magic[0] = 'O';

View file

@ -65,6 +65,8 @@ public:
std::vector<RGBController *> server_controllers; std::vector<RGBController *> server_controllers;
std::mutex ControllerListMutex;
protected: protected:
std::vector<RGBController *>& controllers; std::vector<RGBController *>& controllers;
@ -81,6 +83,7 @@ private:
bool server_initialized; bool server_initialized;
unsigned int server_controller_count; unsigned int server_controller_count;
bool server_controller_count_received; bool server_controller_count_received;
bool change_in_progress;
std::thread * ConnectionThread; std::thread * ConnectionThread;
std::thread * ListenThread; std::thread * ListenThread;