diff options
-rw-r--r-- | libsuspend/autosuspend_wakeup_count.c | 24 |
1 files changed, 5 insertions, 19 deletions
diff --git a/libsuspend/autosuspend_wakeup_count.c b/libsuspend/autosuspend_wakeup_count.c index 3457d5baf..d3fb45fcf 100644 --- a/libsuspend/autosuspend_wakeup_count.c +++ b/libsuspend/autosuspend_wakeup_count.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #include <stddef.h> | 24 | #include <stddef.h> |
25 | #include <stdbool.h> | 25 | #include <stdbool.h> |
26 | #include <string.h> | 26 | #include <string.h> |
27 | #include <sys/param.h> | ||
28 | #include <sys/stat.h> | 27 | #include <sys/stat.h> |
29 | #include <sys/types.h> | 28 | #include <sys/types.h> |
30 | #include <unistd.h> | 29 | #include <unistd.h> |
@@ -36,24 +35,12 @@ | |||
36 | #define SYS_POWER_STATE "/sys/power/state" | 35 | #define SYS_POWER_STATE "/sys/power/state" |
37 | #define SYS_POWER_WAKEUP_COUNT "/sys/power/wakeup_count" | 36 | #define SYS_POWER_WAKEUP_COUNT "/sys/power/wakeup_count" |
38 | 37 | ||
39 | #define BASE_SLEEP_TIME 100000 | ||
40 | |||
41 | static int state_fd; | 38 | static int state_fd; |
42 | static int wakeup_count_fd; | 39 | static int wakeup_count_fd; |
43 | static pthread_t suspend_thread; | 40 | static pthread_t suspend_thread; |
44 | static sem_t suspend_lockout; | 41 | static sem_t suspend_lockout; |
45 | static const char *sleep_state = "mem"; | 42 | static const char *sleep_state = "mem"; |
46 | static void (*wakeup_func)(bool success) = NULL; | 43 | static void (*wakeup_func)(bool success) = NULL; |
47 | static int sleep_time = BASE_SLEEP_TIME; | ||
48 | |||
49 | static void update_sleep_time(bool success) { | ||
50 | if (success) { | ||
51 | sleep_time = BASE_SLEEP_TIME; | ||
52 | return; | ||
53 | } | ||
54 | // double sleep time after each failure up to one minute | ||
55 | sleep_time = MIN(sleep_time * 2, 60000000); | ||
56 | } | ||
57 | 44 | ||
58 | static void *suspend_thread_func(void *arg __attribute__((unused))) | 45 | static void *suspend_thread_func(void *arg __attribute__((unused))) |
59 | { | 46 | { |
@@ -61,12 +48,10 @@ static void *suspend_thread_func(void *arg __attribute__((unused))) | |||
61 | char wakeup_count[20]; | 48 | char wakeup_count[20]; |
62 | int wakeup_count_len; | 49 | int wakeup_count_len; |
63 | int ret; | 50 | int ret; |
64 | bool success = true; | 51 | bool success; |
65 | 52 | ||
66 | while (1) { | 53 | while (1) { |
67 | update_sleep_time(success); | 54 | usleep(100000); |
68 | usleep(sleep_time); | ||
69 | success = false; | ||
70 | ALOGV("%s: read wakeup_count\n", __func__); | 55 | ALOGV("%s: read wakeup_count\n", __func__); |
71 | lseek(wakeup_count_fd, 0, SEEK_SET); | 56 | lseek(wakeup_count_fd, 0, SEEK_SET); |
72 | wakeup_count_len = TEMP_FAILURE_RETRY(read(wakeup_count_fd, wakeup_count, | 57 | wakeup_count_len = TEMP_FAILURE_RETRY(read(wakeup_count_fd, wakeup_count, |
@@ -90,6 +75,7 @@ static void *suspend_thread_func(void *arg __attribute__((unused))) | |||
90 | continue; | 75 | continue; |
91 | } | 76 | } |
92 | 77 | ||
78 | success = true; | ||
93 | ALOGV("%s: write %*s to wakeup_count\n", __func__, wakeup_count_len, wakeup_count); | 79 | ALOGV("%s: write %*s to wakeup_count\n", __func__, wakeup_count_len, wakeup_count); |
94 | ret = TEMP_FAILURE_RETRY(write(wakeup_count_fd, wakeup_count, wakeup_count_len)); | 80 | ret = TEMP_FAILURE_RETRY(write(wakeup_count_fd, wakeup_count, wakeup_count_len)); |
95 | if (ret < 0) { | 81 | if (ret < 0) { |
@@ -98,8 +84,8 @@ static void *suspend_thread_func(void *arg __attribute__((unused))) | |||
98 | } else { | 84 | } else { |
99 | ALOGV("%s: write %s to %s\n", __func__, sleep_state, SYS_POWER_STATE); | 85 | ALOGV("%s: write %s to %s\n", __func__, sleep_state, SYS_POWER_STATE); |
100 | ret = TEMP_FAILURE_RETRY(write(state_fd, sleep_state, strlen(sleep_state))); | 86 | ret = TEMP_FAILURE_RETRY(write(state_fd, sleep_state, strlen(sleep_state))); |
101 | if (ret >= 0) { | 87 | if (ret < 0) { |
102 | success = true; | 88 | success = false; |
103 | } | 89 | } |
104 | void (*func)(bool success) = wakeup_func; | 90 | void (*func)(bool success) = wakeup_func; |
105 | if (func != NULL) { | 91 | if (func != NULL) { |