85 lines
2.4 KiB
C++
85 lines
2.4 KiB
C++
#ifdef MTK_SF_PERF_API
|
|
#include "SFPerfAPILoader.h"
|
|
|
|
#include <cinttypes>
|
|
#include <cstring>
|
|
#include <dlfcn.h>
|
|
#include <log/log.h>
|
|
#include <errno.h>
|
|
|
|
#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<createPerfHelperFn>(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<DestroyPerfHelperFn>(dlsym(m_so_handle, "destroyPerfHelper"));
|
|
if (!mFnDestroyPerfHelper) {
|
|
ALOGE("Failed to get function: destroyPerfHelper");
|
|
}
|
|
mFnSetUclampMin = reinterpret_cast<SetUclampMinFn>(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
|