跳转至

base/system/cpu/cfcpu_bonus.cpp

Namespaces

Name
cf

Source code

#include "system/cpu/cfcpu_bonus.h"
#include "base/helpers/once_init.hpp"
#include "base/macro/system_judge.h"
#include "base/span/span.h"
#include "private/cpu_host.h"
#include <string>
#include <string_view>
#include <vector>

#ifdef CFDESKTOP_OS_WINDOWS
#    include "private/win_impl/cpu_bonus.h"
#elif defined(CFDESKTOP_OS_LINUX)
#    include "private/linux_impl/cpu_bonus.h"
#endif

namespace {
class CPUBonusInfoInit : public cf::CallOnceInit<cf::CPUBonusInfoHost> {
  public:
    cf::CPUBonusInfoViewError error() const { return error_code; }

  protected:
    bool init_resources() override {
        auto src = query_cpu_bonus_info(resource);
        bool isOk = src.has_value();
        if (!isOk) {
            error_code = src.error();
        }
        return isOk;
    }
    bool force_do_reinit() override { return init_resources(); }

  private:
    cf::CPUBonusInfoViewError error_code{cf::CPUBonusInfoViewError::NoError};
};

static CPUBonusInfoInit bonusInfoInit;

cf::span<const std::string_view> toView(const std::vector<std::string>& src_array) {
    static std::vector<std::string_view> views;
    views.clear();
    views.reserve(src_array.size());
    for (const auto& item : src_array) {
        views.push_back(item);
    }
    return cf::span<const std::string_view>(views.data(), views.size());
}

} // namespace

namespace cf {

expected<CPUBonusInfoView, CPUBonusInfoViewError> getCPUBonusInfo(bool force_refresh) {
    if (force_refresh) {
        bonusInfoInit.force_reinit();
    }

    auto& result = bonusInfoInit.get_resources();
    if (bonusInfoInit.error() != cf::CPUBonusInfoViewError::NoError) {
        return cf::unexpected(bonusInfoInit.error());
    }

    // Convert CPUBonusInfoHost to CPUBonusInfoView
    CPUBonusInfoView view;

    view.features = toView(result.features);
    view.cache_size = cf::span<const uint32_t>(result.cache_size.data(), result.cache_size.size());

    view.has_big_little = result.has_big_little;
    view.big_core_count = result.big_core_count;
    view.little_core_count = result.little_core_count;

    view.temperature = result.temperature;

    return view;
}

} // namespace cf

Updated on 2026-03-09 at 10:14:01 +0000