fix deadlock in GetCarData, SetCarData

This commit is contained in:
Lion Kortlepel 2021-03-31 14:50:49 +02:00
parent a584e25bf3
commit 018246cea5
2 changed files with 16 additions and 11 deletions

View File

@ -36,6 +36,7 @@ public:
void SetDownSock(SOCKET CSock) { mSocket[1] = CSock; } void SetDownSock(SOCKET CSock) { mSocket[1] = CSock; }
void SetTCPSock(SOCKET CSock) { mSocket[0] = CSock; } void SetTCPSock(SOCKET CSock) { mSocket[0] = CSock; }
void SetStatus(int Status) { mStatus = Status; } void SetStatus(int Status) { mStatus = Status; }
// locks
void DeleteCar(int Ident); void DeleteCar(int Ident);
[[nodiscard]] std::set<std::string> GetIdentifiers() const { return mIdentifiers; } [[nodiscard]] std::set<std::string> GetIdentifiers() const { return mIdentifiers; }
[[nodiscard]] sockaddr_in GetUDPAddr() const { return mUDPAddress; } [[nodiscard]] sockaddr_in GetUDPAddr() const { return mUDPAddress; }

View File

@ -47,17 +47,20 @@ TClient::TVehicleDataLockPair TClient::GetAllCars() {
} }
std::string TClient::GetCarData(int Ident) { std::string TClient::GetCarData(int Ident) {
{ // lock
std::unique_lock lock(mVehicleDataMutex); std::unique_lock lock(mVehicleDataMutex);
for (auto& v : mVehicleData) { for (auto& v : mVehicleData) {
if (v.ID() == Ident) { if (v.ID() == Ident) {
return v.Data(); return v.Data();
} }
} }
} // unlock
DeleteCar(Ident); DeleteCar(Ident);
return ""; return "";
} }
void TClient::SetCarData(int Ident, const std::string& Data) { void TClient::SetCarData(int Ident, const std::string& Data) {
{ // lock
std::unique_lock lock(mVehicleDataMutex); std::unique_lock lock(mVehicleDataMutex);
for (auto& v : mVehicleData) { for (auto& v : mVehicleData) {
if (v.ID() == Ident) { if (v.ID() == Ident) {
@ -65,6 +68,7 @@ void TClient::SetCarData(int Ident, const std::string& Data) {
return; return;
} }
} }
} // unlock
DeleteCar(Ident); DeleteCar(Ident);
} }