From 6b0331a03025f2ea8c966bf9406dd5788ffa176e Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Fri, 5 Jun 2015 17:08:22 -0700 Subject: [PATCH] Wait for wakeup_reasons on first init Previously if we were initializing the wakeup callback for the first time, we would read the wakeup_reason file and ignore the contents, sending a wakeup_reason of "unknown" up to BatteryStats. Now we initialize the callback and wait on it immediately. Wakeup reasons are reset when we go into sleep, so when we wakeup, we will always have fresh wakeup reasons. Bug:21665793 Change-Id: I20832d8a143fc2715915fcecf4bb71980f279440 --- ..._android_server_am_BatteryStatsService.cpp | 31 +++++++------------ 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/services/core/jni/com_android_server_am_BatteryStatsService.cpp b/services/core/jni/com_android_server_am_BatteryStatsService.cpp index da4cc48793ab5..3b9cc9dc512aa 100644 --- a/services/core/jni/com_android_server_am_BatteryStatsService.cpp +++ b/services/core/jni/com_android_server_am_BatteryStatsService.cpp @@ -62,8 +62,6 @@ static void wakeup_callback(void) static jint nativeWaitWakeup(JNIEnv *env, jobject clazz, jintArray outIrqs, jobjectArray outReasons) { - bool first_time = false; - if (outIrqs == NULL || outReasons == NULL) { jniThrowException(env, "java/lang/NullPointerException", "null argument"); return -1; @@ -83,19 +81,17 @@ static jint nativeWaitWakeup(JNIEnv *env, jobject clazz, jintArray outIrqs, } ALOGV("Registering callback..."); set_wakeup_callback(&wakeup_callback); - // First time through, we will just drain the current wakeup reasons. - first_time = true; - } else { - // On following calls, we need to wait for wakeup. - ALOGV("Waiting for wakeup..."); - int ret = sem_wait(&wakeup_sem); - if (ret < 0) { - char buf[80]; - strerror_r(errno, buf, sizeof(buf)); - ALOGE("Error waiting on semaphore: %s\n", buf); - // Return 0 here to let it continue looping but not return results. - return 0; - } + } + + // Wait for wakeup. + ALOGV("Waiting for wakeup..."); + int ret = sem_wait(&wakeup_sem); + if (ret < 0) { + char buf[80]; + strerror_r(errno, buf, sizeof(buf)); + ALOGE("Error waiting on semaphore: %s\n", buf); + // Return 0 here to let it continue looping but not return results. + return 0; } FILE *fp = fopen(LAST_RESUME_REASON, "r"); @@ -169,9 +165,6 @@ static jint nativeWaitWakeup(JNIEnv *env, jobject clazz, jintArray outIrqs, } ALOGV("Got %d reasons", i); - if (first_time) { - i = 0; - } if (i > 0) { irqs[0] = firstirq; *mergedreasonpos = 0; @@ -185,7 +178,7 @@ static jint nativeWaitWakeup(JNIEnv *env, jobject clazz, jintArray outIrqs, return -1; } - return first_time ? 0 : i; + return i; } static JNINativeMethod method_table[] = {