Skip to content

Commit

Permalink
Merge "Fix log spam about CPU frequency on one device" into jb-dev
Browse files Browse the repository at this point in the history
  • Loading branch information
gkasten authored and Android (Google) Code Review committed May 15, 2012
2 parents 9cab4ca + 542af12 commit bd11322
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 20 deletions.
3 changes: 2 additions & 1 deletion include/cpustats/ThreadCpuUsage.h
Expand Up @@ -131,7 +131,8 @@ class ThreadCpuUsage
uint32_t mCurrentkHz[MAX_CPU]; // current CPU frequency in kHz, not static to avoid a race
static pthread_once_t sOnceControl;
static int sKernelMax; // like MAX_CPU, but determined at runtime == cpu/kernel_max + 1
static void init();
static void init(); // called once at first ThreadCpuUsage construction
static pthread_mutex_t sMutex; // protects sScalingFds[] after initialization
};

} // namespace android
Expand Down
41 changes: 22 additions & 19 deletions libs/cpustats/ThreadCpuUsage.cpp
Expand Up @@ -165,6 +165,7 @@ void ThreadCpuUsage::resetElapsed()
int ThreadCpuUsage::sScalingFds[ThreadCpuUsage::MAX_CPU];
pthread_once_t ThreadCpuUsage::sOnceControl = PTHREAD_ONCE_INIT;
int ThreadCpuUsage::sKernelMax;
pthread_mutex_t ThreadCpuUsage::sMutex = PTHREAD_MUTEX_INITIALIZER;

/*static*/
void ThreadCpuUsage::init()
Expand Down Expand Up @@ -195,27 +196,10 @@ void ThreadCpuUsage::init()
} else {
ALOGW("Can't open number of CPUs");
}

// open fd to each frequency per CPU
#define FREQ_SIZE 64
char freq_path[FREQ_SIZE];
#define FREQ_DIGIT 27
COMPILE_TIME_ASSERT_FUNCTION_SCOPE(MAX_CPU <= 10);
strlcpy(freq_path, "/sys/devices/system/cpu/cpu?/cpufreq/scaling_cur_freq", sizeof(freq_path));
int i;
for (i = 0; i < MAX_CPU; ++i) {
sScalingFds[i] = -1;
}
for (i = 0; i < sKernelMax; ++i) {
freq_path[FREQ_DIGIT] = i + '0';
fd = open(freq_path, O_RDONLY);
if (fd >= 0) {
// keep this fd until process exit
sScalingFds[i] = fd;
} else {
ALOGW("Can't open CPU %d", i);
}
}
}

uint32_t ThreadCpuUsage::getCpukHz(int cpuNum)
Expand All @@ -224,10 +208,29 @@ uint32_t ThreadCpuUsage::getCpukHz(int cpuNum)
ALOGW("getCpukHz called with invalid CPU %d", cpuNum);
return 0;
}
// double-checked locking idiom is not broken for atomic values such as fd
int fd = sScalingFds[cpuNum];
if (fd < 0) {
ALOGW("getCpukHz called for unopened CPU %d", cpuNum);
return 0;
// some kernels can't open a scaling file until hot plug complete
pthread_mutex_lock(&sMutex);
fd = sScalingFds[cpuNum];
if (fd < 0) {
#define FREQ_SIZE 64
char freq_path[FREQ_SIZE];
#define FREQ_DIGIT 27
COMPILE_TIME_ASSERT_FUNCTION_SCOPE(MAX_CPU <= 10);
#define FREQ_PATH "/sys/devices/system/cpu/cpu?/cpufreq/scaling_cur_freq"
strlcpy(freq_path, FREQ_PATH, sizeof(freq_path));
freq_path[FREQ_DIGIT] = cpuNum + '0';
fd = open(freq_path, O_RDONLY | O_CLOEXEC);
// keep this fd until process exit or exec
sScalingFds[cpuNum] = fd;
}
pthread_mutex_unlock(&sMutex);
if (fd < 0) {
ALOGW("getCpukHz can't open CPU %d", cpuNum);
return 0;
}
}
#define KHZ_SIZE 12
char kHz[KHZ_SIZE]; // kHz base 10
Expand Down

0 comments on commit bd11322

Please sign in to comment.