Skip to content

Commit fae13c4

Browse files
authored
Static initialization order issue fix (#33)
* Use function-local static variables to eliminate the static initialization order issues. * bump version to 4.0.4
1 parent 0c87e8c commit fae13c4

File tree

3 files changed

+18
-10
lines changed

3 files changed

+18
-10
lines changed

include/configcat/configcatclient.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,15 @@ class ConfigCatClient {
146146
std::shared_ptr<OverrideDataSource> overrideDataSource;
147147
std::unique_ptr<ConfigService> configService;
148148

149-
static std::mutex instancesMutex;
150-
static std::unordered_map<std::string, std::shared_ptr<ConfigCatClient>> instances;
149+
static inline std::mutex& getInstancesMutex() {
150+
static std::mutex instancesMutex;
151+
return instancesMutex;
152+
}
153+
154+
static inline std::unordered_map<std::string, std::shared_ptr<ConfigCatClient>>& getInstances() {
155+
static std::unordered_map<std::string, std::shared_ptr<ConfigCatClient>> instances;
156+
return instances;
157+
}
151158
};
152159

153160
} // namespace configcat

src/configcatclient.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ using namespace std::chrono;
1717

1818
namespace configcat {
1919

20-
std::mutex ConfigCatClient::instancesMutex;
21-
std::unordered_map<std::string, std::shared_ptr<ConfigCatClient>> ConfigCatClient::instances;
22-
2320
bool isValidSdkKey(const string& sdkKey, bool customBaseUrl) {
2421
static constexpr char proxyPrefix[] = "configcat-proxy/";
2522

@@ -53,7 +50,8 @@ std::shared_ptr<ConfigCatClient> ConfigCatClient::get(const std::string& sdkKey,
5350
}
5451
}
5552

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

7472
{
75-
lock_guard<mutex> lock(instancesMutex);
73+
lock_guard<mutex> lock(getInstancesMutex());
74+
auto& instances = getInstances();
7675

7776
client->closeResources();
7877

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

9190
void ConfigCatClient::closeAll() {
92-
lock_guard<mutex> lock(instancesMutex);
91+
lock_guard<mutex> lock(getInstancesMutex());
92+
auto& instances = getInstances();
9393

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

101101
size_t ConfigCatClient::instanceCount() {
102-
lock_guard<mutex> lock(instancesMutex);
102+
lock_guard<mutex> lock(getInstancesMutex());
103+
auto& instances = getInstances();
103104

104105
return instances.size();
105106
}

src/version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
#pragma once
22

3-
#define CONFIGCAT_VERSION "4.0.3"
3+
#define CONFIGCAT_VERSION "4.0.4"

0 commit comments

Comments
 (0)