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)
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,
}
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)
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;
}