modify mutex not to miss the signal while contacts syncing 14/86714/3
authorJeesun Kim <iamjs.kim@samsung.com>
Fri, 2 Sep 2016 11:45:50 +0000 (20:45 +0900)
committerjeesun kim <iamjs.kim@samsung.com>
Tue, 6 Sep 2016 07:25:00 +0000 (00:25 -0700)
Change-Id: I535576dd315f9e5aa58cd5cbcc52025e5a145cf3

server/cal_server_contacts.c

index adb7249..675ac8d 100644 (file)
@@ -41,6 +41,7 @@ GThread *_cal_server_contacts_thread = NULL;
 GCond _cal_server_contacts_cond;
 GMutex _cal_server_contacts_mutex;
 static bool server_killed = false;
+static bool signal_called = false;
 
 static int _cal_server_contacts_set_new_event(int id, char *label, int calendar_type,
                int date, char *type_str, int account_id, calendar_record_h *out_event)
@@ -674,6 +675,7 @@ static gpointer _cal_server_contacts_main(gpointer user_data)
        bool is_init_contacts = false;
 
        while (1) {
+               g_mutex_lock(&_cal_server_contacts_mutex);
                /*
                 * While syncing with contacts,
                 * because calendar-service could be stopped by on-demand,
@@ -712,37 +714,45 @@ static gpointer _cal_server_contacts_main(gpointer user_data)
                        }
                        cal_access_control_unset_client_info();
                        cal_disconnect();
+
                } while (0);
 
-               g_mutex_lock(&_cal_server_contacts_mutex);
-               DBG("wait");
                cal_server_ondemand_release();
                cal_server_ondemand_start();
-               g_cond_wait(&_cal_server_contacts_cond, &_cal_server_contacts_mutex);
+
+               while (false == signal_called)
+                       g_cond_wait(&_cal_server_contacts_cond, &_cal_server_contacts_mutex);
+               signal_called = false;
                g_mutex_unlock(&_cal_server_contacts_mutex);
+
                if (server_killed)
                        break;
        }
+       DBG("end contacts thread");
        g_thread_exit(NULL);
 
        return NULL;
 }
 
+void cal_server_contacts_send_signal(void)
+{
+       g_mutex_lock(&_cal_server_contacts_mutex);
+       signal_called = true;
+       g_cond_signal(&_cal_server_contacts_cond);
+       g_mutex_unlock(&_cal_server_contacts_mutex);
+}
+
 void cal_server_contacts_start(void)
 {
        CAL_FN_CALL();
 
-       if (server_killed)
-               return;
-
        if (NULL == _cal_server_contacts_thread) {
                g_mutex_init(&_cal_server_contacts_mutex);
                g_cond_init(&_cal_server_contacts_cond);
                _cal_server_contacts_thread = g_thread_new(CAL_SERVER_CONTACTS_THREAD_NAME,
                                _cal_server_contacts_main, NULL);
        }
-       /* don't use mutex. */
-       g_cond_signal(&_cal_server_contacts_cond);
+       cal_server_contacts_send_signal();
 }
 
 static void cal_server_contacts_deinit(void)
@@ -755,13 +765,16 @@ static void cal_server_contacts_deinit(void)
 
 void cal_server_contacts_end(void)
 {
+       CAL_FN_CALL();
+
        server_killed = true;
 
        cal_server_contacts_deinit();
+       cal_server_contacts_send_signal();
 
-       /* don't use mutex. */
-       g_cond_signal(&_cal_server_contacts_cond);
+       g_cond_clear(&_cal_server_contacts_cond);
        g_thread_join(_cal_server_contacts_thread);
        g_thread_unref(_cal_server_contacts_thread);
+       _cal_server_contacts_thread = NULL;
 }