summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mongo/db/commands/server_status_metric.cpp16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/mongo/db/commands/server_status_metric.cpp b/src/mongo/db/commands/server_status_metric.cpp
index 347b514b45d..f2d4705d4ce 100644
--- a/src/mongo/db/commands/server_status_metric.cpp
+++ b/src/mongo/db/commands/server_status_metric.cpp
@@ -30,10 +30,13 @@
#include "mongo/db/commands/server_status_metric.h"
#include <fmt/format.h>
+#include <memory>
#include "mongo/bson/bsontypes.h"
#include "mongo/logv2/log.h"
+#include "mongo/util/static_immortal.h"
#include "mongo/util/str.h"
+#include "mongo/util/synchronized_value.h"
#define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kCommand
@@ -53,14 +56,11 @@ std::string ServerStatusMetric::_parseLeafName(const std::string& name) {
}
MetricTree* globalMetricTree(bool create) {
- static struct {
- stdx::mutex* mutex = new stdx::mutex(); // NOLINT
- MetricTree* metricTree = nullptr;
- } instance;
- stdx::lock_guard lock(*instance.mutex);
- if (create && !instance.metricTree)
- instance.metricTree = new MetricTree();
- return instance.metricTree;
+ static StaticImmortal<synchronized_value<std::unique_ptr<MetricTree>>> instance{};
+ auto updateGuard = **instance;
+ if (create && !*updateGuard)
+ *updateGuard = std::make_unique<MetricTree>();
+ return updateGuard->get();
}
void MetricTree::add(std::unique_ptr<ServerStatusMetric> metric) {