summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiwoong Im <jiwoong.im@samsung.com>2016-12-26 22:00:49 +0900
committerJiwoong Im <jiwoong.im@samsung.com>2017-01-05 07:47:40 +0900
commitae0a3c002eb2a668a124c166568900058cdcc852 (patch)
treee1bf6f7eb1f5029c54fdf5eb9ab74b5246343e20
parent7ca98464fe68f61479616bd3cbe7d864ff975a27 (diff)
downloadalarm-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.h1
-rw-r--r--src/alarm-lib.c30
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(&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) {