#define MUSE_LWIPC_WAIT_TIME 1000
#endif
+#define MUSE_CORE_WATCHDOG_CHECK_PERIOD 10
+#define MUSE_CORE_WATCHDOG_CHECK_COUNT 3
+#define MUSE_CORE_WATCHDOG_TIMER_PERIOD 5
+
static GMainLoop *g_loop;
-static GThread *g_thread;
static GMutex g_mutex;
static GHashTable *g_table;
static int g_table_id;
}
}
+ g_mutex_init(&server->watchdog_lock);
+ g_cond_init(&server->watchdog_cond);
+ server->watchdog_run = TRUE;
+
LOGD("Leave");
return server;
}
g_return_val_if_fail(server, retval);
+ /* watchdog thread exit */
+ g_mutex_lock(&server->watchdog_lock);
+ server->watchdog_run = FALSE;
+ g_cond_signal(&server->watchdog_cond);
+ g_mutex_unlock(&server->watchdog_lock);
+
+ LOGW("join watchdog thread - start");
+
+ g_thread_join(server->watchdog_thread);
+ server->watchdog_thread = NULL;
+
+ LOGW("join watchdog thread - done");
+
+ g_mutex_clear(&server->watchdog_lock);
+ g_cond_clear(&server->watchdog_cond);
+
retval = server->retval;
close(server->fd);
if (server->data_fd > 0)
remove(UDS_files[i]);
remove(muse_core_config_get_instance()->lockfile);
remove(MUSE_DEFAULT_PIDFILE);
- MUSE_FREE(server);
+
+ free(server);
+ server = NULL;
+
muse_core_workqueue_get_instance()->shutdown();
muse_core_config_get_instance()->free();
muse_core_module_get_instance()->free();
return g_hash_table_lookup(g_table, GINT_TO_POINTER(sock_fd));
}
-gpointer muse_core_main_loop(gpointer data)
+static gboolean _muse_core_main_loop_watchdog_timer(gpointer data)
{
+ static int count = 0;
+ muse_core_t *server = (muse_core_t *)data;
+
+ if (!server) {
+ LOGE("NULL server");
+ return FALSE;
+ }
+
+ /*LOGI("watch dog timer : %p", server);*/
+
+ count++;
+
+ g_mutex_lock(&server->watchdog_lock);
+ g_cond_signal(&server->watchdog_cond);
+ g_mutex_unlock(&server->watchdog_lock);
+
+ return TRUE;
+}
+
+static gpointer _muse_core_main_loop_watchdog(gpointer data)
+{
+ muse_core_t *server = (muse_core_t *)data;
+ gint64 end_time = 0;
+ guint try_count = 0;
+
+ if (!server) {
+ LOGE("NULL server");
+ return NULL;
+ }
+
+ LOGW("watch dog start : %p", server);
+
+ g_mutex_lock(&server->watchdog_lock);
+
+ while (server->watchdog_run) {
+ end_time = g_get_monotonic_time() + G_TIME_SPAN_SECOND * MUSE_CORE_WATCHDOG_CHECK_PERIOD;
+ if (g_cond_wait_until(&server->watchdog_cond, &server->watchdog_lock, end_time)) {
+ /*LOGI("signal received");*/
+ try_count = 0;
+ } else {
+ LOGW("timeout");
+ try_count++;
+ }
+
+ if (try_count >= MUSE_CORE_WATCHDOG_CHECK_COUNT) {
+ LOGE("NO RESPONSE FOR MAINLOOP");
+ muse_core_respawn(SIGABRT);
+ }
+ }
+
+ g_mutex_unlock(&server->watchdog_lock);
+
+ LOGW("leave");
+
return NULL;
}
int muse_core_run()
{
+ guint watchdog_timer_id = 0;
muse_core_t *server;
#ifndef MUSE_USE_LWIPC
int ready_fd;
#endif
- LOGI("Enter");
+ LOGW("Enter");
g_return_val_if_fail(_muse_core_run() == MM_ERROR_NONE, MUSE_ERR);
g_loop = g_main_loop_new(NULL, FALSE);
#endif
- g_thread = g_thread_new("muse_core_thread", muse_core_main_loop, g_loop);
-
server = muse_core_new();
if (!server) {
g_main_loop_unref(g_loop);
LOGE("Fail to subscribe external storage state change");
#endif
- LOGD("g_main_loop_run");
- g_main_loop_run(g_loop);
+ server->watchdog_thread = g_thread_try_new("muse_core_watchdog",
+ _muse_core_main_loop_watchdog, (gpointer)server, NULL);
+ if (server->watchdog_thread) {
+ watchdog_timer_id = g_timeout_add_seconds(MUSE_CORE_WATCHDOG_TIMER_PERIOD,
+ _muse_core_main_loop_watchdog_timer, (gpointer)server);
+
+ LOGW("g_main_loop_run");
+
+ g_main_loop_run(g_loop);
+
+ g_source_remove(watchdog_timer_id);
+ } else {
+ LOGE("watchdog thread failed");
+ muse_core_log_process_info((int)muse_core_ipc_get_instance()->pid);
+ }
+
+ LOGW("Leave");
- LOGD("Leave");
return _muse_core_free(server);
}