#ifdef MTK_SF_PERF_API #include "SFPerfAPILoader.h" #include #include #include #include #include #include "SFPerfAPILoader.h" namespace android { #undef LOG_TAG #define LOG_TAG "SFPerfAPILoader" SFPerfAPILoader& SFPerfAPILoader::getInstance() { static SFPerfAPILoader gInstance; return gInstance; } SFPerfAPILoader::SFPerfAPILoader(): m_so_handle(nullptr), mPerfHelper(nullptr), mFnDestroyPerfHelper(nullptr), mFnSetUclampMin(nullptr) { m_so_handle = dlopen("libsf_perf.so", RTLD_LAZY); if (m_so_handle) { createPerfHelperFn createPtr = reinterpret_cast(dlsym(m_so_handle, "createPerfHelper")); if (createPtr) { mPerfHelper = createPtr(); if (!mPerfHelper) { ALOGE("Failed to create PerfHelper"); } else { ALOGV("SFPerfAPILoader created PerfHelper"); } } else { ALOGE("Failed to get function: createPerfHelper"); } mFnDestroyPerfHelper = reinterpret_cast(dlsym(m_so_handle, "destroyPerfHelper")); if (!mFnDestroyPerfHelper) { ALOGE("Failed to get function: destroyPerfHelper"); } mFnSetUclampMin = reinterpret_cast(dlsym(m_so_handle, "setUclampMin")); if (mFnSetUclampMin == nullptr) { ALOGE("Failed to get function: setUclampMin"); } else { ALOGV("set mFnSetUclampMin %p", mFnSetUclampMin); } } else { ALOGE("Failed to load libsf_perf.so"); } } SFPerfAPILoader::~SFPerfAPILoader() { if (mPerfHelper && mFnDestroyPerfHelper) { mFnDestroyPerfHelper(mPerfHelper); mPerfHelper = NULL; mFnDestroyPerfHelper = NULL; } if (m_so_handle) { dlclose(m_so_handle); m_so_handle = NULL; } } int SFPerfAPILoader::perfUclampMinRequest(pid_t pid, int uClampMin) { if (!mPerfHelper) { ALOGE("perfUclampMinRequest mPerfHelper NULL"); errno = EINVAL; return -1; } if (mFnSetUclampMin == nullptr) { ALOGE("perfUclampMinRequest mFnSetUclampMin NULL"); errno = EINVAL; return -1; } ALOGI("perfUclampMinRequest uclamp min %d", uClampMin); return mFnSetUclampMin(mPerfHelper, pid, (uClampMin*100)/1024); } } // namespace android #endif