SF: make FlagManager singleton
Test: presubmit
Change-Id: Id16425757e818c4867b76548d21fb33cbb3f72d4
diff --git a/services/surfaceflinger/FlagManager.h b/services/surfaceflinger/FlagManager.h
index e834142..8af0b4f 100644
--- a/services/surfaceflinger/FlagManager.h
+++ b/services/surfaceflinger/FlagManager.h
@@ -17,15 +17,23 @@
#pragma once
#include <cstdint>
+#include <mutex>
#include <optional>
#include <string>
namespace android {
// Manages flags for SurfaceFlinger, including default values, system properties, and Mendel
-// experiment configuration values.
+// experiment configuration values. Can be called from any thread.
class FlagManager {
+private:
+ // Effectively making the constructor private, while allowing std::make_unique to work
+ struct ConstructorTag {};
+
public:
- FlagManager() = default;
+ static FlagManager& getInstance();
+
+ FlagManager(ConstructorTag);
+
virtual ~FlagManager();
void dump(std::string& result) const;
@@ -38,11 +46,16 @@
private:
friend class FlagManagerTest;
+ FlagManager(const FlagManager&) = delete;
+
// Wrapper for mocking in test.
virtual std::string getServerConfigurableFlag(const std::string& experimentFlagName) const;
template <typename T>
T getValue(const std::string& experimentFlagName, std::optional<T> systemPropertyOpt,
T defaultValue) const;
+
+ static std::unique_ptr<FlagManager> mInstance;
+ static std::once_flag mOnce;
};
} // namespace android