Add delay for millisecond accuracy alarm handler
authorJiwoong Im <jiwoong.im@samsung.com>
Mon, 26 Dec 2016 13:00:49 +0000 (22:00 +0900)
committerJiwoong Im <jiwoong.im@samsung.com>
Wed, 4 Jan 2017 22:47:40 +0000 (07:47 +0900)
Change-Id: I7ef155b7e3c3f75f8b5bf35e9838b6d977ee7c98
Signed-off-by: Jiwoong Im <jiwoong.im@samsung.com>
include/alarm-internal.h
src/alarm-lib.c

index 96f14b7..cdb3a3f 100644 (file)
@@ -77,6 +77,7 @@ typedef struct {
        GDBusProxy *proxy;
        guint sid; /* signal subscription id */
        alarm_cb_t alarm_handler;
+       int handler_id;
        void *user_param;
        GQuark quark_app_service_name;  /*dbus_service_name is converted to quark value*/
        GQuark quark_app_service_name_mod;
index 4c6dccf..f721c8a 100644 (file)
@@ -43,7 +43,7 @@
 static char g_appid[MAX_APP_ID];
 static int flag_appid_checked;
 
-static alarm_context_t alarm_context = { NULL, NULL, NULL, 0, NULL, NULL, -1 };
+static alarm_context_t alarm_context;
 
 static bool b_initialized = false;
 static bool sub_initialized = false;
@@ -160,8 +160,13 @@ static void __remove_resultcb(alarm_cb_info_t *info)
 
 static gboolean __handle_millisec_accuracy(gpointer data)
 {
-       alarm_cb_info_t *info = (alarm_cb_info_t *)data;
-       info->cb_func(info->alarm_id, info->priv_data);
+       if (data == NULL) {
+               alarm_context.alarm_handler(alarm_context.handler_id,
+                               alarm_context.user_param);
+       } else {
+               alarm_cb_info_t *info = (alarm_cb_info_t *)data;
+               info->cb_func(info->alarm_id, info->priv_data);
+       }
        return FALSE;
 }
 
@@ -180,8 +185,23 @@ static void __handle_expiry_method_call(GDBusConnection *conn,
                g_variant_get(param, "(ii&s)", &alarm_id, &msec, &package_name);
                ALARM_MGR_LOG_PRINT("[alarm-lib] : Alarm expired for [%s] : Alarm id [%d]", package_name, alarm_id);
 
-               if (alarm_context.alarm_handler != NULL)
-                       alarm_context.alarm_handler(alarm_id, alarm_context.user_param);
+               if (alarm_context.alarm_handler != NULL) {
+                       if (msec > 0) {
+                               gettimeofday(&current_time, NULL);
+                               msec = msec - (int)current_time.tv_usec / 1000;
+                               if (msec > 0) {
+                                       alarm_context.handler_id = alarm_id;
+                                       g_timeout_add_full(G_PRIORITY_HIGH, (guint)msec,
+                                                       __handle_millisec_accuracy, NULL, NULL);
+                               } else {
+                                       alarm_context.alarm_handler(alarm_id,
+                                                       alarm_context.user_param);
+                               }
+                       } else {
+                               alarm_context.alarm_handler(alarm_id,
+                                               alarm_context.user_param);
+                       }
+               }
 
                info = __find_resultcb(alarm_id);
                if (info && info->cb_func) {