diff options
author | Jiwoong Im <jiwoong.im@samsung.com> | 2016-12-26 22:00:49 +0900 |
---|---|---|
committer | Jiwoong Im <jiwoong.im@samsung.com> | 2017-01-05 07:47:40 +0900 |
commit | ae0a3c002eb2a668a124c166568900058cdcc852 (patch) | |
tree | e1bf6f7eb1f5029c54fdf5eb9ab74b5246343e20 | |
parent | 7ca98464fe68f61479616bd3cbe7d864ff975a27 (diff) | |
download | alarm-manager-ae0a3c002eb2a668a124c166568900058cdcc852.tar.gz alarm-manager-ae0a3c002eb2a668a124c166568900058cdcc852.tar.bz2 alarm-manager-ae0a3c002eb2a668a124c166568900058cdcc852.zip |
Add delay for millisecond accuracy alarm handler
Change-Id: I7ef155b7e3c3f75f8b5bf35e9838b6d977ee7c98
Signed-off-by: Jiwoong Im <jiwoong.im@samsung.com>
-rw-r--r-- | include/alarm-internal.h | 1 | ||||
-rw-r--r-- | src/alarm-lib.c | 30 |
2 files changed, 26 insertions, 5 deletions
diff --git a/include/alarm-internal.h b/include/alarm-internal.h index 96f14b7..cdb3a3f 100644 --- a/include/alarm-internal.h +++ b/include/alarm-internal.h @@ -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; diff --git a/src/alarm-lib.c b/src/alarm-lib.c index 4c6dccf..f721c8a 100644 --- a/src/alarm-lib.c +++ b/src/alarm-lib.c @@ -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(¤t_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) { |