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;
server_connected = false;
server_controller_count = 0;
change_in_progress = false;
ListenThread = NULL;
ConnectionThread = NULL;
@ -47,6 +48,7 @@ NetworkClient::~NetworkClient()
void NetworkClient::ClientInfoChanged()
{
ClientInfoChangeMutex.lock();
ControllerListMutex.lock();
/*-------------------------------------------------*\
| Client info has changed, call the callbacks |
@ -56,6 +58,7 @@ void NetworkClient::ClientInfoChanged()
ClientInfoChangeCallbacks[callback_idx](ClientInfoChangeCallbackArgs[callback_idx]);
}
ControllerListMutex.unlock();
ClientInfoChangeMutex.unlock();
}
@ -229,6 +232,8 @@ void NetworkClient::ConnectionThreadFunction()
requested_controllers++;
}
ControllerListMutex.lock();
//All controllers received, add them to master list
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++)
@ -236,6 +241,8 @@ void NetworkClient::ConnectionThreadFunction()
controllers.push_back(server_controllers[controller_idx]);
}
ControllerListMutex.unlock();
server_initialized = true;
/*-------------------------------------------------*\
@ -409,6 +416,8 @@ listen_done:
server_initialized = 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 controller_idx = 0; controller_idx < controllers.size(); controller_idx++)
@ -419,12 +428,19 @@ listen_done:
break;
}
}
delete server_controllers[server_controller_idx];
}
std::vector<RGBController *> server_controllers_copy = server_controllers;
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 |
\*-------------------------------------------------*/
@ -460,6 +476,8 @@ void NetworkClient::ProcessReply_ControllerData(unsigned int /*data_size*/, char
new_controller->ReadDeviceDescription((unsigned char *)data);
ControllerListMutex.lock();
if(dev_idx >= server_controllers.size())
{
server_controllers.push_back(new_controller);
@ -470,11 +488,17 @@ void NetworkClient::ProcessReply_ControllerData(unsigned int /*data_size*/, char
delete new_controller;
}
ControllerListMutex.unlock();
controller_data_received = true;
}
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 controller_idx = 0; controller_idx < controllers.size(); controller_idx++)
@ -485,12 +509,19 @@ void NetworkClient::ProcessRequest_DeviceListChanged()
break;
}
}
delete server_controllers[server_controller_idx];
}
std::vector<RGBController *> server_controllers_copy = server_controllers;
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 |
\*-------------------------------------------------*/
@ -500,6 +531,8 @@ void NetworkClient::ProcessRequest_DeviceListChanged()
| Mark server as uninitialized and delete the list |
\*-------------------------------------------------*/
server_initialized = false;
change_in_progress = false;
}
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)
{
if(change_in_progress)
{
return;
}
NetPacketHeader reply_hdr;
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)
{
if(change_in_progress)
{
return;
}
NetPacketHeader reply_hdr;
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)
{
if(change_in_progress)
{
return;
}
NetPacketHeader reply_hdr;
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)
{
if(change_in_progress)
{
return;
}
NetPacketHeader reply_hdr;
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)
{
if(change_in_progress)
{
return;
}
NetPacketHeader reply_hdr;
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)
{
if(change_in_progress)
{
return;
}
NetPacketHeader reply_hdr;
reply_hdr.pkt_magic[0] = 'O';

View file

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