Skip to content

Commit

Permalink
Static initialization order issue fix (#33)
Browse files Browse the repository at this point in the history
* Use function-local static variables to eliminate the static initialization order issues.

* bump version to 4.0.4
  • Loading branch information
kp-cat authored Nov 21, 2024
1 parent 0c87e8c commit fae13c4
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 10 deletions.
11 changes: 9 additions & 2 deletions include/configcat/configcatclient.h
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,15 @@ class ConfigCatClient {
std::shared_ptr<OverrideDataSource> overrideDataSource;
std::unique_ptr<ConfigService> configService;

static std::mutex instancesMutex;
static std::unordered_map<std::string, std::shared_ptr<ConfigCatClient>> instances;
static inline std::mutex& getInstancesMutex() {
static std::mutex instancesMutex;
return instancesMutex;
}

static inline std::unordered_map<std::string, std::shared_ptr<ConfigCatClient>>& getInstances() {
static std::unordered_map<std::string, std::shared_ptr<ConfigCatClient>> instances;
return instances;
}
};

} // namespace configcat
15 changes: 8 additions & 7 deletions src/configcatclient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,6 @@ using namespace std::chrono;

namespace configcat {

std::mutex ConfigCatClient::instancesMutex;
std::unordered_map<std::string, std::shared_ptr<ConfigCatClient>> ConfigCatClient::instances;

bool isValidSdkKey(const string& sdkKey, bool customBaseUrl) {
static constexpr char proxyPrefix[] = "configcat-proxy/";

Expand Down Expand Up @@ -53,7 +50,8 @@ std::shared_ptr<ConfigCatClient> ConfigCatClient::get(const std::string& sdkKey,
}
}

lock_guard<mutex> lock(instancesMutex);
lock_guard<mutex> lock(getInstancesMutex());
auto& instances = getInstances();
auto client = instances.find(sdkKey);
if (client == instances.end()) {
client = instances.insert({sdkKey, make_shared<ConfigCatClient::MakeSharedEnabler>(sdkKey, actualOptions)}).first;
Expand All @@ -72,7 +70,8 @@ void ConfigCatClient::close(const std::shared_ptr<ConfigCatClient>& client) {
}

{
lock_guard<mutex> lock(instancesMutex);
lock_guard<mutex> lock(getInstancesMutex());
auto& instances = getInstances();

client->closeResources();

Expand All @@ -89,7 +88,8 @@ void ConfigCatClient::close(const std::shared_ptr<ConfigCatClient>& client) {
}

void ConfigCatClient::closeAll() {
lock_guard<mutex> lock(instancesMutex);
lock_guard<mutex> lock(getInstancesMutex());
auto& instances = getInstances();

for (const auto& [_, instance] : instances) {
instance->closeResources();
Expand All @@ -99,7 +99,8 @@ void ConfigCatClient::closeAll() {
}

size_t ConfigCatClient::instanceCount() {
lock_guard<mutex> lock(instancesMutex);
lock_guard<mutex> lock(getInstancesMutex());
auto& instances = getInstances();

return instances.size();
}
Expand Down
2 changes: 1 addition & 1 deletion src/version.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
#pragma once

#define CONFIGCAT_VERSION "4.0.3"
#define CONFIGCAT_VERSION "4.0.4"

0 comments on commit fae13c4

Please sign in to comment.