Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 53b0c49e authored by Ady Abraham's avatar Ady Abraham
Browse files

SF: make FlagManager singleton

Test: presubmit
Change-Id: Id16425757e818c4867b76548d21fb33cbb3f72d4
parent 0e5421dc
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -30,8 +30,21 @@ namespace android {
static constexpr const char* kExperimentNamespace = "surface_flinger_native_boot";
static constexpr const int64_t kDemoFlag = -1;

std::unique_ptr<FlagManager> FlagManager::mInstance;
std::once_flag FlagManager::mOnce;

FlagManager::FlagManager(ConstructorTag) {}
FlagManager::~FlagManager() = default;

FlagManager& FlagManager::getInstance() {
    std::call_once(mOnce, [&] {
        LOG_ALWAYS_FATAL_IF(mInstance, "Instance already created");
        mInstance = std::make_unique<FlagManager>(ConstructorTag{});
    });

    return *mInstance;
}

void FlagManager::dump(std::string& result) const {
    base::StringAppendF(&result, "FlagManager values: \n");
    base::StringAppendF(&result, "demo_flag: %" PRId64 "\n", demo_flag());
+15 −2
Original line number Diff line number Diff line
@@ -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 @@ public:
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
+3 −3
Original line number Diff line number Diff line
@@ -702,7 +702,7 @@ void SurfaceFlinger::bootFinished() {

    mFrameTracer->initialize();
    mFrameTimeline->onBootFinished();
    getRenderEngine().setEnableTracing(mFlagManager.use_skia_tracing());
    getRenderEngine().setEnableTracing(FlagManager::getInstance().use_skia_tracing());

    // wait patiently for the window manager death
    const String16 name("window");
@@ -731,7 +731,7 @@ void SurfaceFlinger::bootFinished() {

        readPersistentProperties();
        mPowerAdvisor->onBootFinished();
        const bool hintSessionEnabled = mFlagManager.use_adpf_cpu_hint();
        const bool hintSessionEnabled = FlagManager::getInstance().use_adpf_cpu_hint();
        mPowerAdvisor->enablePowerHintSession(hintSessionEnabled);
        const bool hintSessionUsed = mPowerAdvisor->usePowerHintSession();
        ALOGD("Power hint is %s",
@@ -6562,7 +6562,7 @@ void SurfaceFlinger::dumpAllLocked(const DumpArgs& args, const std::string& comp
    /*
     * Dump flag/property manager state
     */
    mFlagManager.dump(result);
    FlagManager::getInstance().dump(result);

    result.append(mTimeStats->miniDump());
    result.append("\n");
+0 −2
Original line number Diff line number Diff line
@@ -1421,8 +1421,6 @@ private:

    const sp<WindowInfosListenerInvoker> mWindowInfosListenerInvoker;

    FlagManager mFlagManager;

    // returns the framerate of the layer with the given sequence ID
    float getLayerFramerate(nsecs_t now, int32_t id) const {
        return mScheduler->getLayerFramerate(now, id);