add thread for alarm 35/85435/2
authorJeesun Kim <iamjs.kim@samsung.com>
Thu, 25 Aug 2016 06:13:00 +0000 (15:13 +0900)
committerJeesun Kim <iamjs.kim@samsung.com>
Thu, 25 Aug 2016 08:00:12 +0000 (17:00 +0900)
Change-Id: I75010da7813d9157448651a3985f5176c02e73ac

server/cal_server.c
server/cal_server_alarm.c
server/cal_server_alarm.h
server/cal_server_contacts.c
server/db/cal_db.c

index 54879d7..0aff76c 100644 (file)
@@ -156,12 +156,12 @@ int main(int argc, char *argv[])
        cal_server_update();
 
        _cal_server_init();
-       cal_server_alarm_init();
        cal_server_account_init();
 
        guint id;
        id = cal_server_dbus_init();
 
+       cal_server_alarm_start();
        cal_server_contacts_start();
        cal_server_cleanup_start();
 
@@ -169,10 +169,10 @@ int main(int argc, char *argv[])
 
        cal_server_cleanup_end();
        cal_server_contacts_end();
+       cal_server_alarm_end();
 
        cal_time_u_cleanup();
        cal_server_account_deinit();
-       cal_server_alarm_deinit();
 
        _cal_server_deinit();
        cal_server_dbus_deinit(id);
index 8782700..9073ea0 100644 (file)
@@ -18,7 +18,6 @@
  */
 
 #include <stdlib.h>
-
 #include <sys/time.h>
 #include <unistd.h>
 #include <alarm.h>
 #include "cal_db_util.h"
 #include "cal_db.h"
 #include "cal_db_query.h"
+#include "cal_server_service.h"
+#include "cal_server_ondemand.h"
 #include "cal_server_dbus.h"
+#include "cal_server_alarm.h"
+
+#define CAL_SERVER_ALARM_THREAD_NAME "cal_server_alarm"
 
-#define CAL_SEARCH_LOOP_MAX 4
+GThread *_cal_server_alarm_thread = NULL;
+GCond _cal_server_alarm_cond;
+GMutex _cal_server_alarm_mutex;
+static bool server_killed = false;
+static bool signal_called = false;
 
 struct _alarm_data_s {
        int event_id;
@@ -49,8 +57,12 @@ struct _alarm_data_s {
        int system_type;
 };
 
+struct alarm_ud {
+       GList *alarm_list;
+};
+
 /* this api is necessary for repeat instance. */
-static int _cal_server_alarm_unset_alerted_alarmmgr_id(int alarm_id)
+static int cal_server_alarm_unset_alerted_alarmmgr_id(int alarm_id)
 {
        char query[CAL_DB_SQL_MAX_LEN] = {0};
        int ret = 0;
@@ -85,7 +97,7 @@ static int _cal_server_alarm_clear_all_cb(alarm_id_t alarm_id, void *data)
        int ret;
 
        DBG("remove alarm id(%d)", alarm_id);
-       _cal_server_alarm_unset_alerted_alarmmgr_id(alarm_id);
+       cal_server_alarm_unset_alerted_alarmmgr_id(alarm_id);
        ret = alarmmgr_remove_alarm(alarm_id);
        if (ret != ALARMMGR_RESULT_SUCCESS) {
                /* LCOV_EXCL_START */
@@ -287,10 +299,11 @@ static int _get_todo_alert_localtime(const char *field, int event_id, time_t cur
        return (long long int)mktime(&st);
 }
 /*
- * to get aler time, time(NULL) is not accurate. 1 secs diff could be occured.
+ * time(NULL) is not appropriate as parameter.
+ * 1 seconds could be flowed before calling function.(1 sec time diff)
  * so, searching DB is neccessary to find alert time.
  */
-int cal_server_alarm_get_alert_time(int alarm_id, time_t *tt_alert)
+static int cal_server_alarm_get_alert_time(int alarm_id, time_t *tt_alert)
 {
        int ret = 0;
        RETV_IF(NULL == tt_alert, CALENDAR_ERROR_INVALID_PARAMETER);
@@ -860,10 +873,6 @@ static int _cal_server_alarm_register(GList *alarm_list)
        return CALENDAR_ERROR_NONE;
 }
 
-struct alarm_ud {
-       GList *alarm_list;
-};
-
 static bool __app_matched_cb(app_control_h app_control, const char *package, void *user_data)
 {
        CAL_FN_CALL();
@@ -1062,22 +1071,23 @@ static void _cal_server_alarm_noti_with_callback(GList *alarm_list)
        }
 }
 
-int cal_server_alarm_register_next_alarm(time_t utime)
+static void cal_server_alarm_register_next_alarm(time_t utime)
 {
+       CAL_FN_CALL();
+
        GList *l = NULL;
        _cal_server_alarm_get_latest(utime, false, &l);
        if (NULL == l)
-               return CALENDAR_ERROR_NONE;
+               return;
 
        l = g_list_sort(l, _cal_server_alarm_sort_cb);
        g_list_foreach(l, (GFunc)_cal_server_alarm_print_cb, NULL);
        _cal_server_alarm_register(l);
 
        g_list_free_full(l, free);
-       return CALENDAR_ERROR_NONE;
 }
 
-void cal_server_alarm_alert(time_t tt_alert)
+static void cal_server_alarm_alert(time_t tt_alert)
 {
        GList *l = NULL;
        _cal_server_alarm_get_latest(tt_alert, true, &l);
@@ -1097,46 +1107,40 @@ static int _alert_cb(alarm_id_t alarm_id, void *data)
        time_t tt_alert = 0;
        cal_server_alarm_get_alert_time(alarm_id, &tt_alert);
        cal_server_alarm_alert(tt_alert);
-       _cal_server_alarm_unset_alerted_alarmmgr_id(alarm_id);
-       cal_server_alarm_register_next_alarm(tt_alert);
+       cal_server_alarm_unset_alerted_alarmmgr_id(alarm_id);
+       signal_called = true;
+       cal_server_alarm_start();
        return 0;
 }
 
-static void _cal_server_alarm_timechange_cb(keynode_t *node, void *data)
+static void _timechanged_cb(keynode_t *node, void *data)
 {
-       time_t t = time(NULL);
-       cal_server_alarm_alert(t);
-       cal_server_alarm_register_next_alarm(t);
+       cal_server_alarm_alert(time(NULL));
+       signal_called = true;
+       cal_server_alarm_start();
 }
 
-void _cal_server_alarm_set_timechange(void)
+static void _cal_server_alarm_set_timechange(void)
 {
-       vconf_notify_key_changed(VCONFKEY_SYSTEM_TIME_CHANGED,
-                       _cal_server_alarm_timechange_cb, NULL);
-       vconf_notify_key_changed(VCONFKEY_TELEPHONY_NITZ_GMT,
-                       _cal_server_alarm_timechange_cb, NULL);
-       vconf_notify_key_changed(VCONFKEY_TELEPHONY_NITZ_EVENT_GMT,
-                       _cal_server_alarm_timechange_cb, NULL);
-       vconf_notify_key_changed(VCONFKEY_TELEPHONY_NITZ_ZONE,
-                       _cal_server_alarm_timechange_cb, NULL);
+       vconf_notify_key_changed(VCONFKEY_SYSTEM_TIME_CHANGED, _timechanged_cb, NULL);
+       vconf_notify_key_changed(VCONFKEY_TELEPHONY_NITZ_GMT, _timechanged_cb, NULL);
+       vconf_notify_key_changed(VCONFKEY_TELEPHONY_NITZ_ZONE, _timechanged_cb, NULL);
+       vconf_notify_key_changed(VCONFKEY_TELEPHONY_NITZ_EVENT_GMT, _timechanged_cb, NULL);
 }
 
-void _cal_server_alarm_unset_timechange(void)
+static void _cal_server_alarm_unset_timechange(void)
 {
-       vconf_ignore_key_changed(VCONFKEY_SYSTEM_TIME_CHANGED,
-                       _cal_server_alarm_timechange_cb);
-       vconf_ignore_key_changed(VCONFKEY_TELEPHONY_NITZ_GMT,
-                       _cal_server_alarm_timechange_cb);
-       vconf_ignore_key_changed(VCONFKEY_TELEPHONY_NITZ_EVENT_GMT,
-                       _cal_server_alarm_timechange_cb);
-       vconf_ignore_key_changed(VCONFKEY_TELEPHONY_NITZ_ZONE,
-                       _cal_server_alarm_timechange_cb);
+       vconf_ignore_key_changed(VCONFKEY_SYSTEM_TIME_CHANGED, _timechanged_cb);
+       vconf_ignore_key_changed(VCONFKEY_TELEPHONY_NITZ_GMT, _timechanged_cb);
+       vconf_ignore_key_changed(VCONFKEY_TELEPHONY_NITZ_ZONE, _timechanged_cb);
+       vconf_ignore_key_changed(VCONFKEY_TELEPHONY_NITZ_EVENT_GMT, _timechanged_cb);
 }
 
 static void _changed_cb(const char* view_uri, void* data)
 {
-       CAL_FN_CALL();
-       cal_server_alarm_register_next_alarm(time(NULL));
+       DBG("Receive alarm change signal");
+       signal_called = true;
+       cal_server_alarm_start();
 }
 
 static int _cal_server_alarm_set_inotify(calendar_db_changed_cb callback)
@@ -1152,11 +1156,10 @@ static void _cal_server_alarm_unset_inotify(calendar_db_changed_cb callback)
        cal_inotify_unsubscribe(CAL_NOTI_FILE_TODO, callback, NULL);
 }
 
-int cal_server_alarm_init(void)
+static int cal_server_alarm_init(void)
 {
-       CAL_FN_CALL();
-
        int ret = 0;
+
        _cal_server_alarm_set_timechange();
        _cal_server_alarm_set_inotify(_changed_cb);
 
@@ -1176,15 +1179,103 @@ int cal_server_alarm_init(void)
                /* LCOV_EXCL_STOP */
        }
 
-       cal_server_alarm_register_next_alarm(time(NULL));
        return CALENDAR_ERROR_NONE;
 }
 
-void cal_server_alarm_deinit(void)
+static gpointer _cal_server_alarm_main(gpointer user_data)
+{
+       int ret = 0;
+       bool is_initialized = false;
+
+       while (1) {             /*
+                * While syncing with contacts,
+                * because calendar-service could be stopped by on-demand,
+                * holding on-demand is needed.
+                */
+               cal_server_ondemand_hold();
+
+               do {
+                       if (false == is_initialized) {
+                               ret = cal_server_alarm_init();
+                               if (CALENDAR_ERROR_NONE != ret) {
+                                       /* LCOV_EXCL_START */
+                                       ERR("cal_server_alarm_init() Fail(%d)", ret);
+                                       break;
+                                       /* LCOV_EXCL_STOP */
+                               }
+                               DBG("init alarm");
+                               is_initialized = true;
+                       }
+                       signal_called = false;
+
+                       ret = cal_connect();
+                       if (CALENDAR_ERROR_NONE != ret) {
+                               /* LCOV_EXCL_START */
+                               ERR("cal_connect() Fail(%d)", ret);
+                               break;
+                               /* LCOV_EXCL_STOP */
+                       }
+
+                       cal_server_alarm_register_next_alarm(time(NULL));
+
+                       cal_disconnect();
+
+                       /*
+                        * to check whether _changed_cb is called while working.
+                        */
+                       if (true == signal_called) {
+                               DBG("signal is true");
+                               signal_called = false;
+                               continue;
+                       }
+               } while (0);
+
+               g_mutex_lock(&_cal_server_alarm_mutex);
+               DBG("wait");
+               cal_server_ondemand_release();
+               cal_server_ondemand_start();
+               g_cond_wait(&_cal_server_alarm_cond, &_cal_server_alarm_mutex);
+               g_mutex_unlock(&_cal_server_alarm_mutex);
+               if (server_killed)
+                       break;
+       }
+       g_thread_exit(NULL);
+
+       return NULL;
+}
+
+void cal_server_alarm_start(void)
+{
+       CAL_FN_CALL();
+
+       if (server_killed)
+               return;
+
+       if (NULL == _cal_server_alarm_thread) {
+               g_mutex_init(&_cal_server_alarm_mutex);
+               g_cond_init(&_cal_server_alarm_cond);
+               _cal_server_alarm_thread = g_thread_new(CAL_SERVER_ALARM_THREAD_NAME,
+                               _cal_server_alarm_main, NULL);
+       }
+       /* don't use mutex. */
+       g_cond_signal(&_cal_server_alarm_cond);
+}
+
+static void cal_server_alarm_deinit(void)
 {
        alarmmgr_fini();
        _cal_server_alarm_unset_inotify(_changed_cb);
        _cal_server_alarm_unset_timechange();
-
 }
 
+void cal_server_alarm_end(void)
+{
+       server_killed = true;
+
+       cal_server_alarm_deinit();
+
+       /* don't use mutex. */
+       g_cond_signal(&_cal_server_alarm_cond);
+       g_thread_join(_cal_server_alarm_thread);
+       g_thread_unref(_cal_server_alarm_thread);
+}
index 89c2749..032f30d 100644 (file)
 #ifndef __CAL_SERVER_ALARM_H__
 #define __CAL_SERVER_ALARM_H__
 
-int cal_server_alarm_init(void);
-void cal_server_alarm_deinit(void);
-
-void cal_server_alarm_alert(time_t tt_alert);
-int cal_server_alarm_register_next_alarm(time_t tt);
+void cal_server_alarm_start(void);
+void cal_server_alarm_end(void);
 
 #endif  /* __CAL_SERVER_ALARM_H__ */
index 52b7d39..adb7249 100644 (file)
@@ -684,7 +684,7 @@ static gpointer _cal_server_contacts_main(gpointer user_data)
                do {
                        if (false == is_init_contacts) {
                                ret = cal_server_contacts_init();
-                               if (CONTACTS_ERROR_NONE != ret) {
+                               if (CALENDAR_ERROR_NONE != ret) {
                                        /* LCOV_EXCL_START */
                                        ERR("cal_server_contacts_init() Fail(%d)", ret);
                                        break;
index 80b232b..ab172eb 100644 (file)
@@ -1231,7 +1231,7 @@ int cal_db_get_changes_by_version(const char* view_uri, int calendar_book_id, in
 
                if (type == CALENDAR_RECORD_MODIFIED_STATUS_DELETED && calendar_db_version < created_ver) {
                        calendar_record_destroy(record, true);
-                       DBG("type is deleted, created_ver(%d) > calendar_db_ver(%d), so skip", created_ver, calendar_db_version);
+                       //DBG("type is deleted, created_ver(%d) > calendar_db_ver(%d), so skip", created_ver, calendar_db_version);
                        continue;
                }