Protect controller list updates with mutex
This commit is contained in:
parent
fde002707a
commit
716b2aaac3
2 changed files with 70 additions and 4 deletions
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue