summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiwoong Im <jiwoong.im@samsung.com>2016-12-16 20:46:04 +0900
committerJiwoong Im <jiwoong.im@samsung.com>2017-01-05 07:47:40 +0900
commit7ca98464fe68f61479616bd3cbe7d864ff975a27 (patch)
treec96f2c6ff407d511b7391b700d15d342f1fb40f7
parent6c8504d9772dc32dc3920ffce6f68b19af025094 (diff)
downloadalarm-manager-7ca98464fe68f61479616bd3cbe7d864ff975a27.tar.gz
alarm-manager-7ca98464fe68f61479616bd3cbe7d864ff975a27.tar.bz2
alarm-manager-7ca98464fe68f61479616bd3cbe7d864ff975a27.zip
Support milliseconds accuracy api
- Add alarmmgr_add_alarm_precision(). This api support non-volatile milliseconds accuracy alarm. Change-Id: Ia20c3eed30ee8190176b8dd4e6f299dc81b4b53d Signed-off-by: Jiwoong Im <jiwoong.im@samsung.com>
-rw-r--r--alarm-manager-registry.c9
-rw-r--r--alarm-manager.c22
-rw-r--r--alarm-session-agent/agent.c11
-rw-r--r--alarm_mgr.xml1
-rw-r--r--include/alarm-internal.h1
-rw-r--r--include/alarm.h31
-rwxr-xr-xscripts/508.alarmmgr_upgrade.sh7
-rw-r--r--src/alarm-lib-stub.c1
-rw-r--r--src/alarm-lib.c151
9 files changed, 111 insertions, 123 deletions
diff --git a/alarm-manager-registry.c b/alarm-manager-registry.c
index a9c7ce0..3136718 100644
--- a/alarm-manager-registry.c
+++ b/alarm-manager-registry.c
@@ -61,9 +61,9 @@ bool _save_alarms(__alarm_info_t *__alarm_info)
char *query = sqlite3_mprintf("insert into alarmmgr( alarm_id, start,\
end, uid, pid, global, is_disabled, caller_pkgid, callee_pkgid, app_unique_name,\
app_service_name, app_service_name_mod, bundle, noti_len, noti, year,\
- month, day, hour, min, sec, day_of_week, repeat,\
+ month, day, hour, min, sec, msec, day_of_week, repeat,\
alarm_type, reserved_info, dst_service_name, dst_service_name_mod)\
- values (%d,%d,%d,%d,%d,%d,0,%Q,%Q,%Q,%Q,%Q,%Q,%d,%Q,%d,%d,%d,%d,%d,%d,%d,%d,\
+ values (%d,%d,%d,%d,%d,%d,0,%Q,%Q,%Q,%Q,%Q,%Q,%d,%Q,%d,%d,%d,%d,%d,%d,%d,%d,%d,\
%d,%d,%Q,%Q)",\
__alarm_info->alarm_id,
(int)__alarm_info->start,
@@ -90,6 +90,7 @@ bool _save_alarms(__alarm_info_t *__alarm_info)
start->hour,
start->min,
start->sec,
+ alarm_info->msec,
mode->u_interval.day_of_week,
mode->repeat,
alarm_info->alarm_type,
@@ -119,7 +120,7 @@ bool _update_alarms(__alarm_info_t *__alarm_info)
char *query = sqlite3_mprintf("update alarmmgr set start=%d, end=%d,\
uid=%d, pid=%d, global=%d, is_disabled=0, caller_pkgid=%Q, callee_pkgid=%Q, app_unique_name=%Q, app_service_name=%Q, app_service_name_mod=%Q,\
- bundle=%Q, noti_len=%d, noti=%Q, year=%d, month=%d, day=%d, hour=%d, min=%d, sec=%d,\
+ bundle=%Q, noti_len=%d, noti=%Q, year=%d, month=%d, day=%d, hour=%d, min=%d, sec=%d, msec=%d,\
day_of_week=%d, repeat=%d, alarm_type=%d,\
reserved_info=%d, dst_service_name=%Q, dst_service_name_mod=%Q\
where alarm_id=%d",\
@@ -147,6 +148,7 @@ bool _update_alarms(__alarm_info_t *__alarm_info)
start->hour,
start->min,
start->sec,
+ alarm_info->msec,
mode->u_interval.day_of_week,
mode->repeat,
alarm_info->alarm_type,
@@ -254,6 +256,7 @@ bool _load_alarms_from_registry()
start->hour = sqlite3_column_int(stmt, col_idx++);
start->min = sqlite3_column_int(stmt, col_idx++);
start->sec = sqlite3_column_int(stmt, col_idx++);
+ alarm_info->msec = sqlite3_column_int(stmt, col_idx++);
mode->u_interval.day_of_week = sqlite3_column_int(stmt, col_idx++);
mode->repeat = sqlite3_column_int(stmt, col_idx++);
alarm_info->alarm_type = sqlite3_column_int(stmt, col_idx++);
diff --git a/alarm-manager.c b/alarm-manager.c
index 48b106a..5c7a00f 100644
--- a/alarm-manager.c
+++ b/alarm-manager.c
@@ -143,7 +143,7 @@ static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id
static bool __alarm_delete(uid_t uid, alarm_id_t alarm_id, int *error_code);
static bool __alarm_update(uid_t uid, int pid, char *app_service_name, alarm_id_t alarm_id,
alarm_info_t *alarm_info, int *error_code);
-static void __alarm_send_noti_to_application(const char *app_service_name, alarm_id_t alarm_id, uid_t uid);
+static void __alarm_send_noti_to_application(const char *app_service_name, alarm_id_t alarm_id, int msec, uid_t uid);
static void __alarm_expired();
static gboolean __alarm_handler_idle(gpointer user_data);
static void __on_system_time_external_changed(keynode_t *node, void *data);
@@ -1311,7 +1311,7 @@ static bool __can_skip_expired_cb(alarm_id_t alarm_id)
}
static gboolean __send_noti_to_session_bus(char *service_name,
- alarm_id_t alarm_id, uid_t uid)
+ alarm_id_t alarm_id, int msec, uid_t uid)
{
int fd;
int ret;
@@ -1336,7 +1336,7 @@ static gboolean __send_noti_to_session_bus(char *service_name,
return FALSE;
}
- gv = g_variant_new("(is)", alarm_id, service_name);
+ gv = g_variant_new("(iis)", alarm_id, msec, service_name);
if (!gv) {
close(fd);
return FALSE;
@@ -1379,7 +1379,8 @@ static gboolean __send_noti_to_session_bus(char *service_name,
return TRUE;
}
-static void __alarm_send_noti_to_application(const char *app_service_name, alarm_id_t alarm_id, uid_t uid)
+static void __alarm_send_noti_to_application(const char *app_service_name,
+ alarm_id_t alarm_id, int msec, uid_t uid)
{
char service_name[MAX_SERVICE_NAME_LEN] = {0,};
gboolean ret;
@@ -1396,7 +1397,7 @@ static void __alarm_send_noti_to_application(const char *app_service_name, alarm
SECURE_LOGI("[alarm server][send expired_alarm(alarm_id=%d) to app_service_name(%s)]", alarm_id, service_name);
if (uid >= REGULAR_UID_MIN) {
- ret = __send_noti_to_session_bus(service_name, alarm_id, uid);
+ ret = __send_noti_to_session_bus(service_name, alarm_id, msec, uid);
if (ret != TRUE)
ALARM_MGR_EXCEPTION_PRINT("failed to send alarm expired noti for %d, %s",
alarm_id, service_name);
@@ -1406,7 +1407,7 @@ static void __alarm_send_noti_to_application(const char *app_service_name, alarm
"/org/tizen/alarm/client",
"org.tizen.alarm.client",
"alarm_expired",
- g_variant_new("(is)", alarm_id, service_name),
+ g_variant_new("(iis)", alarm_id, msec, service_name),
NULL,
G_DBUS_CALL_FLAGS_NONE,
-1,
@@ -1808,7 +1809,7 @@ static void __alarm_expired()
/* TODO: implement aul_update_freezer_status */
/* aul_update_freezer_status(__alarm_info->pid, "wakeup"); */
__alarm_send_noti_to_application(destination_app_service_name,
- alarm_id, __alarm_info->uid); /* dbus auto activation */
+ alarm_id, __alarm_info->alarm_info.msec, __alarm_info->uid); /* dbus auto activation */
ALARM_MGR_LOG_PRINT("after __alarm_send_noti_to_application");
}
}
@@ -2749,7 +2750,7 @@ gboolean alarm_manager_alarm_create(AlarmManager *obj, GDBusMethodInvocation *in
char *app_service_name, char *app_service_name_mod, int start_year,
int start_month, int start_day,
int start_hour, int start_min,
- int start_sec, int end_year, int end_month,
+ int start_sec, int msec, int end_year, int end_month,
int end_day, int mode_day_of_week,
int mode_repeat, int alarm_type,
int reserved_info,
@@ -2783,6 +2784,8 @@ gboolean alarm_manager_alarm_create(AlarmManager *obj, GDBusMethodInvocation *in
alarm_info.start.min = start_min;
alarm_info.start.sec = start_sec;
+ alarm_info.msec = msec;
+
alarm_info.end.year = end_year;
alarm_info.end.month = end_month;
alarm_info.end.day = end_day;
@@ -3735,7 +3738,7 @@ void on_bus_name_owner_changed(GDBusConnection *connection,
if (strcmp(expire_info->service_name, service_name) == 0) {
SECURE_LOGE("expired service name(%s) alarm_id (%d)", expire_info->service_name, expire_info->alarm_id);
- __alarm_send_noti_to_application(expire_info->service_name, expire_info->alarm_id, expire_info->uid);
+ __alarm_send_noti_to_application(expire_info->service_name, expire_info->alarm_id, 0, expire_info->uid);
g_expired_alarm_list = g_slist_remove(g_expired_alarm_list, entry->data);
g_free(expire_info);
}
@@ -3850,6 +3853,7 @@ static bool __initialize_dbus()
hour integer,\
min integer,\
sec integer,\
+ msec integer,\
day_of_week integer,\
repeat integer,\
alarm_type integer,\
diff --git a/alarm-session-agent/agent.c b/alarm-session-agent/agent.c
index 172631e..8d44f02 100644
--- a/alarm-session-agent/agent.c
+++ b/alarm-session-agent/agent.c
@@ -123,7 +123,7 @@ static int _get_socket(const char *path)
return fd;
}
-static void _send_noti(char *service_name, int alarm_id)
+static void _send_noti(char *service_name, int alarm_id, int msec)
{
GDBusConnection *conn;
GError *err = NULL;
@@ -140,7 +140,7 @@ static void _send_noti(char *service_name, int alarm_id)
"/org/tizen/alarm/client",
"org.tizen.alarm.client",
"alarm_expired",
- g_variant_new("(is)", alarm_id, service_name),
+ g_variant_new("(iis)", alarm_id, msec, service_name),
NULL,
G_DBUS_CALL_FLAGS_NONE,
-1,
@@ -173,6 +173,7 @@ static gboolean _alarm_agent_main(gint fd, GIOCondition condition,
int r;
int len;
int alarm_id;
+ int msec;
int clifd;
char *service_name;
uint8_t *data;
@@ -224,7 +225,7 @@ static gboolean _alarm_agent_main(gint fd, GIOCondition condition,
return G_SOURCE_CONTINUE;
}
- gv = g_variant_new_from_data(G_VARIANT_TYPE("(is)"),
+ gv = g_variant_new_from_data(G_VARIANT_TYPE("(iis)"),
data, len, TRUE, NULL, NULL);
if (!gv) {
@@ -233,8 +234,8 @@ static gboolean _alarm_agent_main(gint fd, GIOCondition condition,
return G_SOURCE_CONTINUE;
}
- g_variant_get(gv, "(i&s)", &alarm_id, &service_name);
- _send_noti(service_name, alarm_id);
+ g_variant_get(gv, "(ii&s)", &alarm_id, &msec, &service_name);
+ _send_noti(service_name, alarm_id, msec);
free(data);
g_variant_unref(gv);
diff --git a/alarm_mgr.xml b/alarm_mgr.xml
index 456122e..804cfac 100644
--- a/alarm_mgr.xml
+++ b/alarm_mgr.xml
@@ -19,6 +19,7 @@
<arg type="i" name="alarm_info_start_hour" direction="in" />
<arg type="i" name="alarm_info_start_min" direction="in" />
<arg type="i" name="alarm_info_start_sec" direction="in" />
+ <arg type="i" name="alarm_info_msec" direction="in" />
<arg type="i" name="alarm_info_end_year" direction="in" />
<arg type="i" name="alarm_info_end_month" direction="in" />
<arg type="i" name="alarm_info_end_day" direction="in" />
diff --git a/include/alarm-internal.h b/include/alarm-internal.h
index 1d3b623..96f14b7 100644
--- a/include/alarm-internal.h
+++ b/include/alarm-internal.h
@@ -128,6 +128,7 @@ typedef struct {
alarm_date_t start; /**< start time of the alarm */
alarm_date_t end; /**< end time of the alarm */
alarm_mode_t mode; /**< mode of alarm */
+ int msec;
int alarm_type; /**< alarm type*/
int reserved_info; /** 1st duetime(UTC epochtime) */
} alarm_info_t;
diff --git a/include/alarm.h b/include/alarm.h
index 2124e9f..2c67bfb 100644
--- a/include/alarm.h
+++ b/include/alarm.h
@@ -1212,6 +1212,37 @@ int alarmmgr_add_alarm(int alarm_type, time_t trigger_at_time,
time_t interval, const char *destination,
alarm_id_t *alarm_id);
+
+/**
+ * This function adds an alarm entry to the server with milliseconds precision.
+ * Server will remember this entry, and generate alarm events for it when necessary.
+ * Alarm entries registered with the server cannot be changed.
+ * Remove from server before changing.
+ * After the trigger_at_time seconds from now, the alarm will be expired.
+ * If the interval is zero, the repeat_mode is ALARM_REPEAT_MODE_ONCE.
+ * If the interval is >0, the repeat_mode is ALARM_REPEAT_MODE_REPEAT.
+ * The id of the new alarm will be copied to alarm_id if the fuction successes to create an alarm.
+ *
+ * @param [in] alarm_type one of ALARM_TYPE_DEFAULT, ALARM_TYPE_VOLATILE
+ * @param [in] trigger_at_time time interval to be triggered from now(sec). an alarm also will be expired at triggering time.
+ * @param [in] interval Interval between subsequent repeats of the alarm
+ * @param [in] destination the packname of application that the alarm will be expired.
+ * @param [out] alarm_id the id of the alarm added.
+ *
+ * @return This function returns ALARMMGR_RESULT_SUCCESS on success or a negative number on failure.
+ *
+ * @pre None.
+ * @post None.
+ * @see alarmmgr_add_alarm_with_localtime alarmmgr_remove_alarm
+ * @remark When a process which registered an alarm is killed, the callback @c handler will not be used.
+ * In this case, calling the @c alarmmgr_set_cb() can register a callback again.
+ * The callback function may be delayed, due to the processing of other event.
+ * This function corrects the delay as much as possible.
+ */
+int alarmmgr_add_alarm_precision(int alarm_type, time_t trigger_at_time,
+ time_t interval, const char *destination,
+ alarm_id_t *alarm_id);
+
/**
* This function deletes the alarm associated with the given alarm_id.
*
diff --git a/scripts/508.alarmmgr_upgrade.sh b/scripts/508.alarmmgr_upgrade.sh
index b81adab..cf2491d 100755
--- a/scripts/508.alarmmgr_upgrade.sh
+++ b/scripts/508.alarmmgr_upgrade.sh
@@ -36,6 +36,7 @@ CREATE TABLE alarmmgr_temp (
hour integer,
min integer,
sec integer,
+ msec integer,
day_of_week integer,
repeat integer,
alarm_type integer,
@@ -48,17 +49,17 @@ INSERT INTO alarmmgr_temp \
(alarm_id, start, end, pid, caller_pkgid, \
callee_pkgid, app_unique_name, app_service_name, \
app_service_name_mod, bundle, year, month, \
- day, hour, min, sec, day_of_week, repeat, \
+ day, hour, min, sec, msec, day_of_week, repeat, \
alarm_type, reserved_info, dst_service_name, \
dst_service_name_mod) \
SELECT alarm_id, start, end, pid, caller_pkgid, \
callee_pkgid, app_unique_name, app_service_name, \
app_service_name_mod, bundle, year, month, \
- day, hour, min, sec, day_of_week, repeat, \
+ day, hour, min, sec, msec, day_of_week, repeat, \
alarm_type, reserved_info, dst_service_name, dst_service_name_mod \
FROM alarmmgr;
-UPDATE alarmmgr_temp SET uid=5001,global=0,is_disabled=0,noti_len=4,noti="null";
+UPDATE alarmmgr_temp SET uid=5001,global=0,is_disabled=0,msec=0,noti_len=4,noti="null";
DROP TABLE alarmmgr;
ALTER TABLE alarmmgr_temp RENAME TO alarmmgr;
diff --git a/src/alarm-lib-stub.c b/src/alarm-lib-stub.c
index cd7fd82..e56e220 100644
--- a/src/alarm-lib-stub.c
+++ b/src/alarm-lib-stub.c
@@ -212,6 +212,7 @@ bool _send_alarm_create(alarm_context_t context, alarm_info_t *alarm_info,
alarm_info->start.hour,
alarm_info->start.min,
alarm_info->start.sec,
+ alarm_info->msec,
alarm_info->end.year,
alarm_info->end.month,
alarm_info->end.day,
diff --git a/src/alarm-lib.c b/src/alarm-lib.c
index 93a3233..4c6dccf 100644
--- a/src/alarm-lib.c
+++ b/src/alarm-lib.c
@@ -61,7 +61,6 @@ static int __alarmmgr_init_appsvc(void);
typedef struct _alarm_cb_info_t {
alarm_id_t alarm_id;
- long msec;
alarm_cb_t cb_func;
void *priv_data;
struct _alarm_cb_info_t *next;
@@ -85,6 +84,7 @@ static const gchar introspection_xml[] =
" <interface name='org.tizen.alarm.client'>"
" <method name='alarm_expired'>"
" <arg type='i' name='alarm_id' direction='in'/>"
+ " <arg type='i' name='msec' direction='in'/>"
" <arg type='s' name='service_name' direction='in'/>"
" </method>"
" </interface>"
@@ -112,24 +112,6 @@ static void __add_resultcb(alarm_id_t alarm_id, alarm_cb_t cb_func, void *data)
if (info == NULL)
return;
info->alarm_id = alarm_id;
- info->msec = 0;
- info->cb_func = cb_func;
- info->priv_data = data;
-
- info->next = alarmcb_head;
- alarmcb_head = info;
-}
-
-static void __add_resultcb_include_millisec(alarm_id_t alarm_id,
- long msec, alarm_cb_t cb_func, void *data)
-{
- alarm_cb_info_t *info;
-
- info = (alarm_cb_info_t *)malloc(sizeof(alarm_cb_info_t));
- if (info == NULL)
- return;
- info->alarm_id = alarm_id;
- info->msec = msec;
info->cb_func = cb_func;
info->priv_data = data;
@@ -188,13 +170,14 @@ static void __handle_expiry_method_call(GDBusConnection *conn,
const gchar *method, GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
{
struct timeval current_time;
- long msec;
if (method && strcmp(method, "alarm_expired") == 0) {
gchar *package_name = NULL;
alarm_id_t alarm_id = 0;
alarm_cb_info_t *info = NULL;
- g_variant_get(param, "(i&s)", &alarm_id, &package_name);
+ int msec;
+
+ 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)
@@ -202,9 +185,9 @@ static void __handle_expiry_method_call(GDBusConnection *conn,
info = __find_resultcb(alarm_id);
if (info && info->cb_func) {
- if (info->msec > 0) {
+ if (msec > 0) {
gettimeofday(&current_time, NULL);
- msec = info->msec - current_time.tv_usec / 1000;
+ msec = msec - (int)current_time.tv_usec / 1000;
if (msec > 0) {
g_timeout_add_full(G_PRIORITY_HIGH, (guint)msec,
__handle_millisec_accuracy, info, NULL);
@@ -653,6 +636,8 @@ EXPORT_API alarm_entry_t *alarmmgr_create_alarm(void)
alarm->start.min = 0;
alarm->start.sec = 0;
+ alarm->msec = 0;
+
alarm->end.year = 0;
alarm->end.month = 0;
alarm->end.day = 0;
@@ -1278,9 +1263,10 @@ EXPORT_API int alarmmgr_add_alarm_noti(int alarm_type, time_t trigger_at_time,
return ALARMMGR_RESULT_SUCCESS;
}
-EXPORT_API int alarmmgr_add_alarm(int alarm_type, time_t trigger_at_time,
+static int _alarmmgr_add_alarm(int alarm_type,
+ time_t trigger_at_time,
time_t interval, const char *destination,
- alarm_id_t *alarm_id)
+ alarm_id_t *alarm_id, bool precision)
{
char dst_service_name[MAX_SERVICE_NAME_LEN] = { 0 };
char dst_service_name_mod[MAX_SERVICE_NAME_LEN] = { 0 };
@@ -1293,6 +1279,8 @@ EXPORT_API int alarmmgr_add_alarm(int alarm_type, time_t trigger_at_time,
alarm_info_t alarm_info;
int ret;
+ gettimeofday(&current_time, NULL);
+
_initialize_alarm_info(&alarm_info);
ret = __sub_init();
@@ -1313,7 +1301,6 @@ EXPORT_API int alarmmgr_add_alarm(int alarm_type, time_t trigger_at_time,
alarm_info.alarm_type = alarm_type;
alarm_info.alarm_type |= ALARM_TYPE_RELATIVE;
- gettimeofday(&current_time, NULL);
if (current_time.tv_usec > 500 * 1000) {
/* When the millisecond part of the current_time is bigger than 500ms,
@@ -1331,6 +1318,8 @@ EXPORT_API int alarmmgr_add_alarm(int alarm_type, time_t trigger_at_time,
alarm_info.start.month = duetime_tm.tm_mon + 1;
alarm_info.start.day = duetime_tm.tm_mday;
+ alarm_info.msec = precision ? (int)current_time.tv_usec / 1000 : 0;
+
alarm_info.end.year = 0;
alarm_info.end.month = 0;
alarm_info.end.day = 0;
@@ -1384,8 +1373,26 @@ EXPORT_API int alarmmgr_add_alarm(int alarm_type, time_t trigger_at_time,
return ALARMMGR_RESULT_SUCCESS;
}
-EXPORT_API int alarmmgr_add_alarm_withcb(int alarm_type, time_t trigger_at_time,
- time_t interval, alarm_cb_t handler, void *user_param, alarm_id_t *alarm_id)
+EXPORT_API int alarmmgr_add_alarm(int alarm_type, time_t trigger_at_time,
+ time_t interval, const char *destination,
+ alarm_id_t *alarm_id)
+{
+ return _alarmmgr_add_alarm(alarm_type, trigger_at_time, interval,
+ destination, alarm_id, false);
+}
+
+EXPORT_API int alarmmgr_add_alarm_precision(int alarm_type,
+ time_t trigger_at_time,
+ time_t interval, const char *destination,
+ alarm_id_t *alarm_id)
+{
+ return _alarmmgr_add_alarm(alarm_type, trigger_at_time, interval,
+ destination, alarm_id, true);
+}
+
+static int _alarmmgr_add_alarm_withcb(int alarm_type, time_t trigger_at_time,
+ time_t interval, alarm_cb_t handler, void *user_param,
+ alarm_id_t *alarm_id, bool precision)
{
int error_code = 0;
struct timeval current_time;
@@ -1393,6 +1400,8 @@ EXPORT_API int alarmmgr_add_alarm_withcb(int alarm_type, time_t trigger_at_time,
alarm_info_t alarm_info;
int ret = 0;
+ gettimeofday(&current_time, NULL);
+
_initialize_alarm_info(&alarm_info);
if (flag_appid_checked == 0) {
@@ -1420,8 +1429,6 @@ EXPORT_API int alarmmgr_add_alarm_withcb(int alarm_type, time_t trigger_at_time,
alarm_info.alarm_type |= ALARM_TYPE_RELATIVE;
alarm_info.alarm_type |= ALARM_TYPE_WITHCB;
- gettimeofday(&current_time, NULL);
-
if (current_time.tv_usec > 500 * 1000) {
/* When the millisecond part of the current_time is bigger than 500ms, */
/* the duetime increases by extra 1sec. */
@@ -1438,6 +1445,8 @@ EXPORT_API int alarmmgr_add_alarm_withcb(int alarm_type, time_t trigger_at_time,
alarm_info.start.month = duetime_tm.tm_mon + 1;
alarm_info.start.day = duetime_tm.tm_mday;
+ alarm_info.msec = precision ? (int)current_time.tv_usec / 1000 : 0;
+
alarm_info.end.year = 0;
alarm_info.end.month = 0;
alarm_info.end.day = 0;
@@ -1467,82 +1476,18 @@ EXPORT_API int alarmmgr_add_alarm_withcb(int alarm_type, time_t trigger_at_time,
return ALARMMGR_RESULT_SUCCESS;
}
+EXPORT_API int alarmmgr_add_alarm_withcb(int alarm_type, time_t trigger_at_time,
+ time_t interval, alarm_cb_t handler, void *user_param, alarm_id_t *alarm_id)
+{
+ return _alarmmgr_add_alarm_withcb(alarm_type, trigger_at_time, interval,
+ handler, user_param, alarm_id, false);
+}
+
EXPORT_API int alarmmgr_add_alarm_withcb_precision(int alarm_type, time_t trigger_at_time,
time_t interval, alarm_cb_t handler, void *user_param, alarm_id_t *alarm_id)
{
- int error_code = 0;
- struct timeval current_time = {.tv_sec = 0, .tv_usec = 0};
- long msec;
- struct tm duetime_tm;
- alarm_info_t alarm_info;
- int ret = 0;
-
- gettimeofday(&current_time, NULL);
-
- _initialize_alarm_info(&alarm_info);
-
- if (flag_appid_checked == 0) {
- if (aul_app_get_appid_bypid(getpid(), g_appid, sizeof(g_appid)) != AUL_R_OK)
- ALARM_MGR_EXCEPTION_PRINT("PID[%d] may not be app. Please call alarmmgr_init(caller name) in advance.", getpid());
- else
- ALARM_MGR_LOG_PRINT("Get appid only once. appid[%s]", g_appid);
-
- flag_appid_checked = 1;
- }
-
- ret = alarmmgr_init(g_appid);
- if (ret < 0)
- return ret;
-
- if (alarm_id == NULL)
- return ERR_ALARM_INVALID_PARAM;
-
- if (trigger_at_time < 0)
- return ERR_ALARM_INVALID_PARAM;
-
- alarm_info.alarm_type = alarm_type;
- alarm_info.alarm_type |= ALARM_TYPE_RELATIVE;
- alarm_info.alarm_type |= ALARM_TYPE_WITHCB;
-
- msec = current_time.tv_usec / 1000;
-
- current_time.tv_sec += trigger_at_time;
- alarm_info.reserved_info = current_time.tv_sec;
-
- tzset(); /* Processes the TZ environment variable, and Set timezone, daylight, and tzname. */
- localtime_r(&current_time.tv_sec, &duetime_tm);
-
- alarm_info.start.year = duetime_tm.tm_year + 1900;
- alarm_info.start.month = duetime_tm.tm_mon + 1;
- alarm_info.start.day = duetime_tm.tm_mday;
-
- alarm_info.end.year = 0;
- alarm_info.end.month = 0;
- alarm_info.end.day = 0;
-
- alarm_info.start.hour = duetime_tm.tm_hour;
- alarm_info.start.min = duetime_tm.tm_min;
- alarm_info.start.sec = duetime_tm.tm_sec;
-
- if (interval <= 0) {
- alarm_info.mode.repeat = ALARM_REPEAT_MODE_ONCE;
- alarm_info.mode.u_interval.interval = 0;
- } else {
- alarm_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT;
- alarm_info.mode.u_interval.interval = interval;
- }
-
- ALARM_MGR_EXCEPTION_PRINT("trigger_at_time(%d), start(%d-%d-%d, %02d:%02d:%02d:%02d), repeat(%d), interval(%d), type(%d)",
- trigger_at_time, alarm_info.start.day, alarm_info.start.month, alarm_info.start.year,
- alarm_info.start.hour, alarm_info.start.min, alarm_info.start.sec, msec,
- alarm_info.mode.repeat, alarm_info.mode.u_interval.interval, alarm_info.alarm_type);
-
- if (!_send_alarm_create(alarm_context, &alarm_info, alarm_id, "null","null", &error_code))
- return error_code;
-
- __add_resultcb_include_millisec(*alarm_id, msec, handler, user_param);
-
- return ALARMMGR_RESULT_SUCCESS;
+ return _alarmmgr_add_alarm_withcb(alarm_type, trigger_at_time, interval,
+ handler, user_param, alarm_id, true);
}
EXPORT_API int alarmmgr_remove_alarm(alarm_id_t alarm_id)