Bug 90040 suspend timer
Change-Id: Ifa5ecc828453a93e42eed669d949d5aca095353e
diff --git a/mbtk/libmbtk_lib/sleep/mbtk_sleep.c b/mbtk/libmbtk_lib/sleep/mbtk_sleep.c
old mode 100755
new mode 100644
index 25c3997..6ae159e
--- a/mbtk/libmbtk_lib/sleep/mbtk_sleep.c
+++ b/mbtk/libmbtk_lib/sleep/mbtk_sleep.c
@@ -1,9 +1,20 @@
+#include <pthread.h>
+#include <sys/epoll.h>
+#include <sys/timerfd.h>
+
+
+
#include "mbtk_sleep.h"
#include "mbtk_log.h"
#include "mbtk_utils.h"
static mbtk_lock_name_s mbtk_lock_name[LOCK_MAX_SIZE]={0};
+#define EPOLL_SIZE_HINT 128
+int mEpollFd = -1;
+mbtk_info_callback_func g_sleep_timer_cb;
+int g_sleep_timer_fd = 0;
+
int mbtk_autosuspend_enable(char enable)
{
@@ -168,5 +179,107 @@
return 0;
}
+static void* suspend_timer_thread_run(void* arg)
+{
+ struct epoll_event eventItems[EPOLL_SIZE_HINT];
+ int eventCount = epoll_wait(mEpollFd, eventItems, EPOLL_SIZE_HINT, -1);
+
+ int timerFd = -1;
+ int eventIndex = 0;
+ uint64_t readCounter;
+
+ if (eventCount < 0) {
+ LOGE("Poll failed with an unexpected error: %s\n", strerror(errno));
+ return (void*)-1;
+ }
+
+ for (; eventIndex < eventCount; ++eventIndex) {
+ timerFd = eventItems[eventIndex].data.fd;
+
+ int retRead = read(timerFd, &readCounter, sizeof(uint64_t));
+ if (retRead < 0) {
+ LOGE("read %d failed...\n", timerFd);
+
+ continue;
+ } else {
+
+ g_sleep_timer_cb(NULL, 0);
+ mbtk_autosuspend_enable(0);
+ g_sleep_timer_fd = 0;
+ LOGI("suspend_timer_success\n");
+ }
+ }
+
+ return 0;
+}
+
+
+
+static int suspend_timer_timer_init(void)
+{
+ pthread_attr_t thread_attr;
+ pthread_t net_led_thread_id;
+ pthread_attr_init(&thread_attr);
+ if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
+ {
+ LOGE("[suspend] pthread_attr_setdetachstate() fail.");
+ return -1;
+ }
+
+ if(pthread_create(&net_led_thread_id, &thread_attr, suspend_timer_thread_run, NULL))
+ {
+ LOGE("[suspend] pthread_create() fail.");
+ return -1;
+ }
+
+ pthread_attr_destroy(&thread_attr);
+ return 0;
+}
+
+
+int mbtk_suspend_timer_set(int time, mbtk_info_callback_func cb)
+{
+ if(0 < g_sleep_timer_fd)
+ {
+ LOGE("suspend timer has been init");
+ return -1;
+ }
+ mEpollFd = epoll_create(EPOLL_SIZE_HINT);
+
+ g_sleep_timer_fd = timerfd_create(CLOCK_BOOTTIME_ALARM, 0);
+ if (g_sleep_timer_fd < 0) {
+ LOGE("Could not create timer fd: %s\n", strerror(errno));
+ return 0;
+ }
+
+ struct itimerspec timerSet;
+ timerSet.it_interval.tv_sec = 0;
+ timerSet.it_interval.tv_nsec = 0;
+ timerSet.it_value.tv_sec = time;
+ timerSet.it_value.tv_nsec = 0;
+ if (timerfd_settime(g_sleep_timer_fd, 0, &timerSet, NULL) != 0) {
+ LOGE("timerfd_settime failed: %s\n", strerror(errno));
+ close(g_sleep_timer_fd);
+ return 0;
+ }
+
+ struct epoll_event eventItem;
+ memset(&eventItem, 0, sizeof(eventItem));
+ eventItem.events = EPOLLIN | EPOLLET;
+ eventItem.data.fd = g_sleep_timer_fd;
+ int result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, g_sleep_timer_fd, &eventItem);
+ if (result != 0) {
+ LOGE("Could not add timer fd(%d) to epoll instance: %s\n", g_sleep_timer_fd, strerror(errno));
+ }
+
+ mbtk_autosuspend_enable(1);
+ g_sleep_timer_cb = cb;
+ suspend_timer_timer_init();
+
+
+ return 0;
+}
+
+