#define MUSE_ON_DEMAND_LAUNCH "muse:on_demand"
#define MUSE_ON_DEMAND_MAX_IDLE_TIME "muse:on_demand_max_idle_time"
#define MUSE_ON_DEMAND_MAX_IDLE_MEMORY "muse:on_demand_max_idle_memory"
+#define IDLE_STATE_WAIT_TIME "muse:idle_state_wait_time"
#define MUSE_GST_PARAM "muse:gstparam"
#define MUSE_GST_PRELOAD "muse:gstpreload"
#define INI_PARSER_COLON ":"
#define DEFAULT_CAUTION_INSTANCE -1
#define DEFAULT_ON_DEMAND_MAX_IDLE_TIME 600 /* 10 minute */
#define DEFAULT_ON_DEMAND_MAX_IDLE_MEMORY 30000 /* 30MB */
-
+#define DEFAULT_IDLE_STATE_WAIT_TIME 10 /* seconds */
typedef struct host_info {
char *path;
gboolean is_on_demand;
int max_idle_time;
int max_idle_memory;
+ int idle_state_wait_time;
char *gst_preload_plugins;
} ms_config_t;
int ms_config_get_memory_threshold(void);
gboolean ms_config_is_on_demand(void);
int ms_config_get_max_idle_time(void);
+int ms_config_get_idle_state_wait_time(void);
int ms_config_get_timeout(int module_idx);
int ms_config_get_disable_watchdog_api(int module_idx);
int ms_config_get_max_instance(int module_idx);
conf->max_idle_memory = _ms_config_get_int(conf->muse_dict,
MUSE_ON_DEMAND_MAX_IDLE_MEMORY, DEFAULT_ON_DEMAND_MAX_IDLE_MEMORY);
+ conf->idle_state_wait_time = _ms_config_get_int(conf->muse_dict, IDLE_STATE_WAIT_TIME, DEFAULT_IDLE_STATE_WAIT_TIME);
+
for (conf->gst_param_cnt = 0; conf->gst_param_cnt < MUSE_PARAM_MAX; conf->gst_param_cnt++) {
snprintf(gst_param_key, MUSE_MSG_LEN_MAX, "%s%d", MUSE_GST_PARAM, conf->gst_param_cnt + 1);
return conf->max_idle_time;
}
+int ms_config_get_idle_state_wait_time(void)
+{
+ ms_config_t *conf = _ms_config_get_instance();
+ muse_return_val_if_fail(conf, MUSE_ERR);
+
+ return conf->idle_state_wait_time;
+}
+
int ms_config_get_timeout(int module_idx)
{
ms_config_t *conf = _ms_config_get_instance();
static void _ms_get_module_addr(int fd, intptr_t *module_addr);
static void _ms_check_idle_state(void);
static void _ms_check_connection_event(void);
-gpointer _ms_diag_thread(gpointer data);
+static gpointer _ms_diag_check_idle_state_thread(gpointer data);
+static gpointer _ms_diag_check_connection_event_thread(gpointer data);
static void _ms_lock_state(void);
static void _ms_unlock_state(void);
static gboolean _ms_connection_handler(GIOChannel *source, GIOCondition condition, gpointer data);
if (!m) {
if (candidate_m) {
- LOGE("muse-server can't support the error case which threre are several modules now");
+ LOGE("muse-server can't support the error case which there are several modules now");
ms_connection_unlock(connection);
goto out;
}
}
}
-gpointer _ms_diag_thread(gpointer data)
+static gpointer _ms_diag_check_idle_state_thread(gpointer data)
{
+ int idle_state_wait_time = ms_config_get_idle_state_wait_time();
+
muse_return_val_if_fail(muse_server, NULL);
+ muse_return_val_if_fail(idle_state_wait_time > 0, NULL);
- while (1) {
+ while (ms_is_server_ready()) {
_ms_check_idle_state();
- _ms_check_connection_event();
+ sleep(idle_state_wait_time);
}
return NULL;
}
+static gpointer _ms_diag_check_connection_event_thread(gpointer data)
+{
+ muse_return_val_if_fail(muse_server, NULL);
+
+ while (ms_is_server_ready())
+ _ms_check_connection_event();
+
+ return NULL;
+}
+
static void _ms_lock_state(void)
{
muse_return_if_fail(muse_server);
fd = open(lockfile, O_RDONLY);
if (fd == -1 && errno != ENOENT) {
/* Cannot open file even though file exists. */
- snprintf(err_msg, sizeof(err_msg), "datserver: Cannot open lock file %s", lockfile);
+ snprintf(err_msg, sizeof(err_msg), "Cannot open lock file %s", lockfile);
LOGE("open failed : %s", err_msg);
return MUSE_ERR;
} else if (fd != -1) {
muse_return_if_fail(muse_server);
- muse_server->diag_thread = g_thread_try_new("muse_server_diag_thread", _ms_diag_thread, muse_server->main_loop, &error);
- if (!muse_server->diag_thread && error) {
- snprintf(err_msg, sizeof(err_msg), "diag_thread creation failed : %s", error->message);
+ muse_server->diag_idle_state_thread = g_thread_try_new("diag_idle_state",
+ _ms_diag_check_idle_state_thread, muse_server->main_loop, &error);
+ if (!muse_server->diag_idle_state_thread && error) {
+ snprintf(err_msg, sizeof(err_msg), "diag_idle_state_thread creation failed : %s", error->message);
+ LOGE("%s", err_msg);
+ g_error_free(error);
+ ms_log_process_info(muse_server->pid);
+ }
+
+ muse_server->diag_connection_event_thread = g_thread_try_new("diag_connection_event",
+ _ms_diag_check_connection_event_thread, muse_server->main_loop, &error);
+ if (!muse_server->diag_connection_event_thread && error) {
+ snprintf(err_msg, sizeof(err_msg), "diag_connection_event_thread creation failed : %s", error->message);
LOGE("%s", err_msg);
g_error_free(error);
ms_log_process_info(muse_server->pid);
void ms_diag_thread_destroy(void)
{
muse_return_if_fail(muse_server);
- muse_return_if_fail(muse_server->diag_thread);
LOGD("Enter");
- g_thread_join(muse_server->diag_thread);
- muse_server->diag_thread = NULL;
+ if (muse_server->diag_idle_state_thread) {
+ g_thread_join(muse_server->diag_idle_state_thread);
+ muse_server->diag_idle_state_thread = NULL;
+ }
+
+ if (muse_server->diag_connection_event_thread) {
+ g_thread_join(muse_server->diag_connection_event_thread);
+ muse_server->diag_connection_event_thread = NULL;
+ }
LOGD("Leave");
}
muse_return_val_if_fail(muse_server->log, retval);
muse_return_val_if_fail(muse_server->security, retval);
muse_return_val_if_fail(muse_server->watchdog, retval);
- muse_return_val_if_fail(muse_server->diag_thread, retval);
+ muse_return_val_if_fail(muse_server->diag_idle_state_thread, retval);
+ muse_return_val_if_fail(muse_server->diag_connection_event_thread, retval);
ms_recursive_rmdir(MUSE_DATA_ROOT_PATH);