Separate threads to facilitate control of each operation 30/232230/8 submit/tizen/20200507.052130
authorYoungHun Kim <yh8004.kim@samsung.com>
Wed, 29 Apr 2020 07:10:54 +0000 (16:10 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Wed, 6 May 2020 08:53:51 +0000 (17:53 +0900)
Change-Id: I3f7aa905fb4693dee3af180a8ab77c686ec06e49

packaging/mused.spec
server/include/muse_server_config.h
server/include/muse_server_private.h
server/src/muse_server_config.c
server/src/muse_server_connection.c
server/src/muse_server_private.c

index 3696a87..b9d8959 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mused
 Summary:    A multimedia daemon
-Version:    0.3.111
+Version:    0.3.112
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0
index 6889555..6488cba 100644 (file)
@@ -39,6 +39,7 @@ extern "C" {
 #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                                               ":"
@@ -59,7 +60,7 @@ extern "C" {
 #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;
@@ -87,6 +88,7 @@ typedef struct ms_config {
        gboolean is_on_demand;
        int max_idle_time;
        int max_idle_memory;
+       int idle_state_wait_time;
        char *gst_preload_plugins;
 } ms_config_t;
 
@@ -108,6 +110,7 @@ int ms_config_get_max_timeout(void);
 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);
index 016d87e..eed0a4b 100644 (file)
@@ -73,7 +73,8 @@ typedef struct _muse_server {
        gint running;
        tbm_bufmgr bufmgr;
        GMainLoop *main_loop;
-       GThread *diag_thread;
+       GThread *diag_idle_state_thread;
+       GThread *diag_connection_event_thread;
        ms_config_t *conf;
        ms_connection_t *connection;
        ms_module_t *module[MUSE_MODULE_MAX];
index 9999713..666ce5b 100644 (file)
@@ -106,6 +106,8 @@ static int _ms_config_parser(ms_config_t *conf)
        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);
 
@@ -373,6 +375,14 @@ int ms_config_get_max_idle_time(void)
        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();
index 9980597..b1fe500 100644 (file)
@@ -57,8 +57,9 @@ static void _ms_connection_module_instance_info(muse_module_h m, ms_connection_t
 
        strncpy(ms_get_instance()->instance_pid_info, pids, MUSE_MSG_LEN_MAX);
 
-       LOGW("total number of modules = %d ( %s) - %s %p from pid %d %s client (count %d)", len, ms_get_instance()->instance_pid_info,
-               connection_cmd[cmd], m, m->pid, ms_config_get_host_name(m->idx), connection->instance_count[m->idx]);
+       LOGW("total number of modules = %d ( %s) - %s %p from pid %d %s client (count %d)",
+               len, ms_get_instance()->instance_pid_info,connection_cmd[cmd], m, m->pid,
+               ms_config_get_host_name(m->idx), connection->instance_count[m->idx]);
 }
 
 int ms_connection_register(muse_module_h m)
index 5cdf587..65f0baf 100644 (file)
@@ -65,7 +65,8 @@ static int _ms_get_pid(int fd);
 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);
@@ -334,7 +335,7 @@ static gboolean _ms_connection_handler(GIOChannel *source, GIOCondition conditio
 
                        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;
                                }
@@ -458,18 +459,31 @@ static void _ms_check_connection_event(void)
        }
 }
 
-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);
@@ -552,7 +566,7 @@ int ms_open_lockfile(void)
        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) {
@@ -589,9 +603,19 @@ void ms_diag_thread_create(void)
 
        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);
@@ -601,12 +625,18 @@ void ms_diag_thread_create(void)
 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");
 }
@@ -963,7 +993,8 @@ int ms_deinit(void)
        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);