summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJusung Son <jusung07.son@samsung.com>2019-08-29 16:25:14 +0900
committerJusung Son <jusung07.son@samsung.com>2019-09-04 08:49:59 +0900
commit066a4171a875521d95d9d468b671d25c8f253f60 (patch)
tree4c4723db3bbe517ef0e8706d59f8af5d9477f381
parent65ba630ec9dc562f38349c1c748f8afe7882fd2c (diff)
downloadalarm-manager-066a4171a875521d95d9d468b671d25c8f253f60.tar.gz
alarm-manager-066a4171a875521d95d9d468b671d25c8f253f60.tar.bz2
alarm-manager-066a4171a875521d95d9d468b671d25c8f253f60.zip
To handle RTC reset
Change-Id: I1df2d762b1e6ec50f1aa4be3cb415153b5f3881e Signed-off-by: Jusung Son <jusung07.son@samsung.com>
-rw-r--r--server/alarm-manager.c65
1 files changed, 56 insertions, 9 deletions
diff --git a/server/alarm-manager.c b/server/alarm-manager.c
index 1e1d7e3..caf66ae 100644
--- a/server/alarm-manager.c
+++ b/server/alarm-manager.c
@@ -108,7 +108,7 @@ static bool __alarm_remove_from_list(uid_t uid, alarm_id_t alarm_id,
int *error_code);
static void __alarm_set_start_and_end_time(alarm_info_t *alarm_info,
__alarm_info_t *__alarm_info);
-static void __alarm_update_due_time_of_all_items_in_list(double diff_time);
+static void __alarm_update_due_time_of_all_items_in_list(time_t new_time,double diff_time);
static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t uid,
int pid, periodic_method_e method, long requested_interval, int is_ref,
char *app_service_name, char *app_service_name_mod,
@@ -527,6 +527,7 @@ static __alarm_info_t *__alarm_update_in_list(uid_t uid, alarm_id_t alarm_id,
GSList *iter = NULL;
__alarm_info_t *entry = NULL;
alarm_info_t *_alarm_info = NULL;
+ time_t current_time;
for (iter = alarm_context.alarms; iter != NULL;
iter = g_slist_next(iter)) {
@@ -548,6 +549,11 @@ static __alarm_info_t *__alarm_update_in_list(uid_t uid, alarm_id_t alarm_id,
if (update_flag == ALARM_UPDATE_FLAG_TIME) {
__alarm_set_start_and_end_time(alarm_info, entry);
memcpy(_alarm_info, alarm_info, sizeof(alarm_info_t));
+
+ if (_alarm_info->mode.repeat == ALARM_REPEAT_MODE_ONCE) {
+ time(&current_time);
+ _alarm_info->reserved_info = current_time;
+ }
} else if (update_flag == ALARM_UPDATE_FLAG_PERIOD) {
_alarm_info->alarm_type |= ALARM_TYPE_INEXACT;
_alarm_info->alarm_type |= ALARM_TYPE_PERIOD;
@@ -672,15 +678,16 @@ static void __alarm_set_start_and_end_time(alarm_info_t *alarm_info,
}
}
-static void __alarm_update_due_time_of_all_items_in_list(double diff_time)
+static void __alarm_update_due_time_of_all_items_in_list(time_t new_time, double diff_time)
{
time_t current_time;
time_t min_time = -1;
time_t due_time = 0;
GSList *iter = NULL;
__alarm_info_t *entry = NULL;
- struct tm *p_time = NULL ;
- struct tm due_time_result ;
+ struct tm *p_time = NULL;
+ struct tm due_time_result;
+ bool is_rtc_reset;
is_time_changed = true;
if (periodic_alarm_standard_time != 0)
@@ -691,7 +698,33 @@ static void __alarm_update_due_time_of_all_items_in_list(double diff_time)
entry = (__alarm_info_t *)iter->data;
alarm_info_t *alarm_info = &(entry->alarm_info);
if (alarm_info->alarm_type & ALARM_TYPE_RELATIVE) {
- entry->due_time += diff_time;
+ /* case of RTC reset */
+ if (entry->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) {
+ if ((entry->due_time + diff_time - new_time) >
+ (entry->due_time - entry->alarm_info.reserved_info)) {
+ LOGE("[ RTC reset]: new time %s %ld, diff %f, id %d duetime %s %ld %ld",
+ ctime(&new_time), new_time, diff_time, entry->alarm_id,
+ ctime(&entry->due_time), entry->due_time,
+ entry->alarm_info.reserved_info);
+ continue;
+ }
+
+ entry->due_time += diff_time;
+ entry->alarm_info.reserved_info = new_time;
+
+ } else {
+ entry->due_time += diff_time;
+ is_rtc_reset = false;
+ if ((entry->due_time - new_time) > alarm_info->mode.u_interval.interval) {
+ is_rtc_reset = true;
+ entry->due_time = new_time +
+ ((entry->due_time - new_time) % alarm_info->mode.u_interval.interval);
+ LOGE("[ RTC reset]: new time %s %ld, diff %f, id %d duetime %s %ld %ld",
+ ctime(&new_time), new_time, diff_time, entry->alarm_id,
+ ctime(&entry->due_time), entry->due_time,
+ alarm_info->mode.u_interval.interval);
+ }
+ }
alarm_date_t *start = &alarm_info->start; /**< start time of the alarm */
alarm_date_t *end = &alarm_info->end; /**< end time of the alarm */
@@ -708,7 +741,7 @@ static void __alarm_update_due_time_of_all_items_in_list(double diff_time)
if (entry->start != 0)
entry->start = entry->due_time;
- if (entry->end != 0) {
+ if (entry->end != 0 && is_rtc_reset == false) {
entry->end += diff_time;
p_time = localtime_r(&entry->end, &due_time_result);
if (p_time != NULL) {
@@ -842,6 +875,9 @@ static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id
time(&current_time);
+ if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE)
+ __alarm_info->alarm_info.reserved_info = current_time;
+
if (alarm_context.c_due_time < current_time) {
LOGE("Caution!! alarm_context.c_due_time "
"(%ld) is less than current time(%ld)", alarm_context.c_due_time, current_time);
@@ -946,6 +982,9 @@ static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t
time(&current_time);
+ if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE)
+ __alarm_info->alarm_info.reserved_info = current_time;
+
SECURE_LOGD("[alarm-server]:pid=%d, app_unique_name=%s, "
"app_service_name=%s,dst_service_name=%s, c_due_time=%ld", \
pid, __alarm_info->app_unique_name, \
@@ -1098,6 +1137,9 @@ static bool __alarm_create_noti(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
time(&current_time);
+ if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE)
+ __alarm_info->alarm_info.reserved_info = current_time;
+
SECURE_LOGD("[alarm-server]:pid=%d, app_unique_name=%s, "
"app_service_name=%s,dst_service_name=%s, c_due_time=%ld", \
pid, __alarm_info->app_unique_name, \
@@ -1172,6 +1214,9 @@ static bool __alarm_update(uid_t uid, alarm_id_t alarm_id,
return false;
}
+ if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE)
+ __alarm_info->alarm_info.reserved_info = current_time;
+
_alarm_set_next_duetime(__alarm_info);
result = _remove_from_scheduled_alarm_list(uid, alarm_id);
@@ -1690,7 +1735,7 @@ static void __on_system_time_external_changed(keynode_t *node, void *data)
eventsystem_send_system_event(SYS_EVENT_TIME_CHANGED, b);
bundle_free(b);
- __alarm_update_due_time_of_all_items_in_list(diff_time);
+ __alarm_update_due_time_of_all_items_in_list(cur_time, diff_time);
LOGD("2.alarm_context.c_due_time is %ld\n",
alarm_context.c_due_time);
@@ -1947,7 +1992,7 @@ void __reschedule_alarms_with_newtime(time_t cur_time, time_t new_time, double d
eventsystem_send_system_event(SYS_EVENT_TIME_CHANGED, b);
bundle_free(b);
- __alarm_update_due_time_of_all_items_in_list(diff_time); /* Rescheduling alarms with ALARM_TYPE_RELATIVE */
+ __alarm_update_due_time_of_all_items_in_list(new_time, diff_time); /* Rescheduling alarms with ALARM_TYPE_RELATIVE */
LOGD("Next duetime is %ld", alarm_context.c_due_time);
_clear_scheduled_alarm_list();
@@ -2207,6 +2252,7 @@ int alarm_manager_alarm_set_timezone(GVariant* parameters)
char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
#endif
char *tzpath_str;
+ time_t cur_time;
g_variant_get(parameters, "(&s)", &tzpath_str);
@@ -2239,7 +2285,8 @@ int alarm_manager_alarm_set_timezone(GVariant* parameters)
/* Rescheduling alarms */
_alarm_disable_timer();
- __alarm_update_due_time_of_all_items_in_list(0);
+ time(&cur_time);
+ __alarm_update_due_time_of_all_items_in_list(cur_time, 0);
LOGD("next expiring due_time is %ld", alarm_context.c_due_time);
_clear_scheduled_alarm_list();