*/
#include "muse_server_private.h"
-#include <gst/gst.h>
-#include <syslog.h>
-
-static void _ms_setup_syslog(void);
-static void _ms_fork(int *notify_fd);
-static pid_t _ms_daemonize(int *notify_fd);
-static int _ms_pidfile_create(const char *path, pid_t pid);
-
-static void _ms_setup_syslog(void)
-{
- int flags = LOG_CONS|LOG_NDELAY|LOG_PID;
- if (isatty(STDOUT_FILENO))
- flags |= LOG_PERROR;
-
- openlog("mused", flags, LOG_DAEMON);
- LOGD("openlog - mused");
-}
-
-static void _ms_fork(int *notify_fd)
-{
- pid_t pid;
- int fds[2];
- char err_msg[MUSE_MSG_LEN_MAX] = {'\0',};
- char msg[MUSE_MSG_LEN_MAX] = {'\0',};
-
- if (pipe(fds) == MUSE_ERR) {
- strerror_r(errno, err_msg, MUSE_MSG_LEN_MAX);
- LOGE("Failed to create pipe to get child status: %s", err_msg);
- exit(EXIT_FAILURE);
- }
-
- if ((pid = fork()) < 0) {
- strerror_r(errno, err_msg, MUSE_MSG_LEN_MAX);
- LOGE("Error: fork() failed: %s", err_msg);
- exit(EXIT_FAILURE);
- } else if (pid != 0) {
- close(fds[1]);
- /* Read in a string from the pipe */
- if (read(fds[0], msg, sizeof(msg)) <= 0) {
- LOGE("Failed to read from a file descriptor [%d]", fds[0]);
- close(fds[0]);
- return;
- }
- close(fds[0]);
-
- /* Parent process closes up output side of pipe */
- if (!strcmp(msg, MSG_DONE)) {
- LOGI("Successfully daemonized");
- exit(EXIT_SUCCESS);
- } else {
- LOGE("Daemonizing failed after fork");
- exit(EXIT_FAILURE);
- }
- } else if (pid == 0) {
- /* Child process closes up input side of pipe */
- close(fds[0]);
- *notify_fd = fds[1];
- }
-}
-
-static pid_t _ms_daemonize(int *notify_fd)
-{
- pid_t pid;
- int fd, result;
-
- muse_return_val_if_fail(notify_fd, MUSE_ERR);
-
- _ms_fork(notify_fd);
-
- if ((pid = setsid()) < 0) {
- LOGE("create new session");
- exit(EXIT_FAILURE);
- }
-
- /* change the file mode mask */
- umask(0);
-
- result = chdir("/");
- LOGD("result = %d sid: %d pgid: %d pid: %d ppid: %d", result, (int)getsid(0), (int)getpgid(0), (int)pid, (int)getppid());
-
- /* redirect fds to /dev/null */
- fd = open("/dev/null", O_RDWR);
- if (!muse_core_fd_is_valid(fd)) {
- LOGE("Critical Error : %d is invalid", fd);
- exit(EXIT_SUCCESS);
- }
-
- close(STDIN_FILENO);
- close(STDOUT_FILENO);
- close(STDERR_FILENO);
-
- dup2(fd, STDIN_FILENO);
- dup2(fd, STDOUT_FILENO);
- dup2(fd, STDERR_FILENO);
-
- close(fd);
-
- return pid;
-}
-
-void ms_gst_init(char **cmd)
-{
- gint *argc = NULL;
- gchar **argv = NULL;
- GError *err = NULL;
- gboolean ret = FALSE;
- int gst_param_cnt;
-
-#ifdef MUSE_TTRACE_LOG
- trace_begin("MUSE:gst_init");
-#endif
-
- gst_param_cnt = ms_config_get_gst_param_cnt();
-
- argc = malloc(sizeof(gint));
- muse_return_if_fail(argc);
-
- /* add gst_param */
- argv = malloc(sizeof(gchar *) * (gst_param_cnt + 1));
- if (!argv) {
- LOGE("argv memory leak allocatoin failed");
- free(argc);
- return;
- }
-
- memset(argv, 0, sizeof(gchar *) * (gst_param_cnt + 1));
-
- *argc = 0;
- argv[*argc] = (gchar *)cmd[0];
- (*argc)++;
- for (; (*argc) <= gst_param_cnt; (*argc)++)
- argv[*argc] = ms_config_get_gst_param_str((*argc) - 1);
-
- /* initializing gstreamer */
- ret = gst_init_check(argc, &argv, &err);
- if (!ret) {
- LOGE("Could not initialize GStreamer: %s ", err ? err->message : "unknown error occurred");
- if (err)
- g_error_free(err);
- }
-
- /* release */
- free(argv);
- free(argc);
-
- LOGI("complete to initialize gstreamer");
-
-#ifdef MUSE_TTRACE_LOG
- trace_end();
-#endif
-}
-
-static int _ms_pidfile_create(const char *path, pid_t pid)
-{
- int fd;
- struct flock lock;
- char pid_buf[MUSE_MSG_LEN] = {'\0',};
- char err_msg[MUSE_MSG_LEN_MAX] = {'\0',};
-
- muse_return_val_if_fail(path, MM_ERROR_INVALID_ARGUMENT);
- muse_core_remove_symlink(path);
- fd = open(path, O_WRONLY | O_CREAT, (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH));
-
- if (!muse_core_fd_is_valid(fd)) {
- strerror_r(errno, err_msg, MUSE_MSG_LEN_MAX);
- LOGE("Fail to open pidfile [%s] : %s", path, err_msg);
- return MM_ERROR_FILE_NOT_FOUND;
- }
-
- lock.l_type = F_WRLCK;
- lock.l_start = 0;
- lock.l_whence = SEEK_SET;
- lock.l_len = 0;
-
- if (fcntl(fd, F_SETLK, &lock) < 0) {
- if (errno != EACCES && errno != EAGAIN) {
- strerror_r(errno, err_msg, MUSE_MSG_LEN_MAX);
- LOGE("Fail to lock pidfile [%s] : %s", path, err_msg);
- } else {
- LOGE("process is already running");
- }
- close(fd);
- return MM_ERROR_FILE_INTERNAL;
- }
-
- if (ftruncate(fd, 0) < 0) {
- strerror_r(errno, err_msg, MUSE_MSG_LEN_MAX);
- LOGE("Fail to truncate pidfile [%s] : %s", path, err_msg);
- close(fd);
- return MM_ERROR_FILE_INTERNAL;
- }
-
- memset(pid_buf, 0, sizeof(pid_buf));
- snprintf(pid_buf, sizeof(pid_buf), "%u", pid);
-
- if (write(fd, pid_buf, strlen(pid_buf)) != (int)strlen(pid_buf)) {
- strerror_r(errno, err_msg, MUSE_MSG_LEN_MAX);
- LOGE("Fail to write pid to pidfile [%s] : %s", path, err_msg);
- close(fd);
- return MM_ERROR_FILE_WRITE;
- }
-
- close(fd);
- return MM_ERROR_NONE;
-}
void muse_server_set_dispatch_timeout(muse_module_h m, int api, int timeout)
{
int main(int argc, char **argv)
{
- pid_t pid;
- int idx;
- int notify_fd = -1;
- muse_module_cmd_dispatchfunc *cmd_dispatcher = NULL;
#ifdef MUSE_TTRACE_LOG
trace_begin("MUSE:START");
#endif
- _ms_setup_syslog();
-
- pid = _ms_daemonize(¬ify_fd);
-
- if (_ms_pidfile_create(MUSE_DEFAULT_PIDFILE, pid) != MM_ERROR_NONE)
- exit(EXIT_FAILURE);
- else
- LOGD("MUSE_DEFAULT_PIDFILE(%s) file was created", MUSE_DEFAULT_PIDFILE);
-
- ms_init();
-
if (argc > 1)
ms_parse_params(argc, argv);
-#ifdef MUSE_TTRACE_LOG
- trace_begin("MUSE:preloading module");
-#endif
- for (idx = 0; idx < ms_config_get_host_cnt(); idx++) {
- if (0 == strncmp(ms_config_get_preloaded_value(idx), "yes", strlen("yes") + 1)) {
- g_module_symbol(ms_module_open(idx), CMD_DISPATCHER, (gpointer *)&cmd_dispatcher);
- if (cmd_dispatcher && cmd_dispatcher[MUSE_MODULE_COMMAND_INITIALIZE])
- cmd_dispatcher[MUSE_MODULE_COMMAND_INITIALIZE](NULL);
- }
- }
-#ifdef MUSE_TTRACE_LOG
- trace_end();
-#endif
+ ms_init(argv);
- muse_return_val_if_fail(ms_get_instance(), 0);
- ms_get_instance()->pid = pid;
+ ms_run();
-#ifdef MUSE_TTRACE_LOG
- trace_end();
-#endif
- return ms_run(argv, notify_fd);
+ return ms_deinit();
}
#include "muse_server_private.h"
#include <sys/file.h>
#include <sys/syscall.h>
+#include <gst/gst.h>
+#include <syslog.h>
#ifdef MUSE_REGISTER_VIP
#include <proc_stat.h>
"resource_manager_shutdown"
};
-static int _ms_run(void);
static bool _ms_attach(int fd, muse_module_callback connection_handler, gpointer module_idx);
static void _ms_create_new_server_from_fd(int fd[], int type);
static int _ms_new(muse_channel_e channel);
static void _ms_lock_state(void);
static void _ms_unlock_state(void);
static gboolean _ms_connection_handler(GIOChannel *source, GIOCondition condition, gpointer data);
+#ifdef MUSE_USE_LWIPC
+static void _ms_wait_event(void);
-static int _ms_run(void)
+static void _ms_wait_event(void)
{
- int fd, already_running;
- char err_msg[MUSE_MSG_LEN_MAX] = {'\0',};
- char *lockfile = NULL;
-
- muse_return_val_if_fail(muse_server, MUSE_ERR);
-
- lockfile = ms_config_get_lockfile();
- muse_return_val_if_fail(lockfile, MUSE_ERR);
-
- muse_core_remove_symlink((const char *)lockfile);
- 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);
- LOGE("open failed : %s", err_msg);
- return MUSE_ERR;
- } else if (fd != -1) {
- already_running = flock(fd, LOCK_EX | LOCK_NB) == -1;
- close(fd);
- if (already_running) {
- LOGE("File already locked. There's already a server running");
- return MUSE_ERR;
- }
- }
-
- /* Lock file does not exist, or is not locked. Create a new lockfile and lock it. */
- fd = open(lockfile, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
- if (fd == -1) {
- LOGE("dataserver: Cannot create lock file");
- return MUSE_ERR;
- }
-
- if (flock(fd, LOCK_EX | LOCK_NB) != 0) {
- LOGE("Can't lock the lock file \"%s\". " "Is another instance running?", lockfile);
- close(fd);
- return MUSE_ERR;
- }
-
- close(fd);
+ const char *lw_event_list[] = { "/run/.wm_ready", "/tmp/avoc_ready" };
+ unsigned int count = sizeof(lw_event_list) / sizeof(char *);
- return MM_ERROR_NONE;
+ if (LwipcWaitMultiEvents(lw_event_list, count, true, MUSE_LWIPC_WAIT_TIME, NULL, 0) != 0)
+ LOGE("Fail to receive Multiple Events");
}
+#endif
static bool _ms_attach(int fd, muse_module_callback connection_handler, gpointer module_idx)
{
LOGI("Enter");
muse_return_val_if_fail(muse_server, false);
- muse_return_val_if_fail(muse_server->main_loop, false);
muse_return_val_if_fail(muse_core_fd_is_valid(fd), false);
channel = g_io_channel_unix_new(fd);
return FALSE;
}
-#ifdef MUSE_USE_LWIPC
-static void _ms_wait_event(void)
-{
- const char *lw_event_list[] = { "/run/.wm_ready", "/tmp/avoc_ready" };
- unsigned int count = sizeof(lw_event_list) / sizeof(char *);
-
- if (LwipcWaitMultiEvents(lw_event_list, count, true, MUSE_LWIPC_WAIT_TIME, NULL, 0) != 0)
- LOGE("Fail to receive Multiple Events");
-}
-#endif
-
static void _ms_check_idle_state(void)
{
struct timeval tv_c, tv_r;
int instance_number, timeout;
muse_return_if_fail(muse_server);
+ muse_return_if_fail(muse_server->state == MUSE_SERVER_STATE_READY);
gettimeofday(&tv_c, NULL);
timersub(&tv_c, &muse_server->tv_s, &tv_r);
instance_number = g_queue_get_length(muse_server->connection->instance_queue);
timeout = (int)tv_r.tv_sec;
+ LOGD("timeout %d", timeout);
+
if (instance_number == 0 && timeout >= ms_config_get_max_idle_time()) {
LOGE("Timeout exit !!! [Idle time] %d sec", timeout);
+ ms_remove_ready_file();
exit(EXIT_SUCCESS);
}
}
muse_return_val_if_fail(muse_server, NULL);
while (1) {
- if (muse_server->conf->is_on_demand == TRUE)
+ if (muse_server->conf->is_on_demand)
_ms_check_idle_state();
_ms_check_connection_event();
g_mutex_unlock(&muse_server->state_lock);
}
-void ms_init(void)
+static void _ms_init(void)
{
int idx;
muse_core_create_fd_table();
+ muse_server->main_loop = g_main_loop_new(NULL, FALSE);
+ muse_return_if_fail(muse_server->main_loop);
+
+ LOGD("Leave");
+}
+
+int ms_open_lockfile(void)
+{
+ int fd, already_running;
+ char err_msg[MUSE_MSG_LEN_MAX] = {'\0',};
+ char *lockfile = NULL;
+
+ muse_return_val_if_fail(muse_server, MUSE_ERR);
+
+ lockfile = ms_config_get_lockfile();
+ muse_return_val_if_fail(lockfile, MUSE_ERR);
+
+ muse_core_remove_symlink((const char *)lockfile);
+ 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);
+ LOGE("open failed : %s", err_msg);
+ return MUSE_ERR;
+ } else if (fd != -1) {
+ already_running = flock(fd, LOCK_EX | LOCK_NB) == -1;
+ close(fd);
+ if (already_running) {
+ LOGE("File already locked. There's already a server running");
+ return MUSE_ERR;
+ }
+ }
+
+ /* Lock file does not exist, or is not locked. Create a new lockfile and lock it. */
+ fd = open(lockfile, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ if (fd == -1) {
+ LOGE("dataserver: Cannot create lock file");
+ return MUSE_ERR;
+ }
+
+ if (flock(fd, LOCK_EX | LOCK_NB) != 0) {
+ LOGE("Can't lock the lock file \"%s\". " "Is another instance running?", lockfile);
+ close(fd);
+ return MUSE_ERR;
+ }
+
+ close(fd);
+
+ return MM_ERROR_NONE;
+}
+
+void ms_diag_thread_create(void)
+{
+ char err_msg[MUSE_MSG_LEN_MAX] = {'\0',};
+ GError *error = NULL;
+
+ 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);
+ 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;
+
+ LOGD("Leave");
+}
+
+void ms_setup_syslog(void)
+{
+ int flags = LOG_CONS|LOG_NDELAY|LOG_PID;
+ if (isatty(STDOUT_FILENO))
+ flags |= LOG_PERROR;
+
+ openlog("mused", flags, LOG_DAEMON);
+ LOGD("openlog - mused");
+}
+
+void ms_fork(int *notify_fd)
+{
+ pid_t pid;
+ int fds[2];
+ char err_msg[MUSE_MSG_LEN_MAX] = {'\0',};
+ char msg[MUSE_MSG_LEN_MAX] = {'\0',};
+
+ if (pipe(fds) == MUSE_ERR) {
+ strerror_r(errno, err_msg, MUSE_MSG_LEN_MAX);
+ LOGE("Failed to create pipe to get child status: %s", err_msg);
+ exit(EXIT_FAILURE);
+ }
+
+ if ((pid = fork()) < 0) {
+ strerror_r(errno, err_msg, MUSE_MSG_LEN_MAX);
+ LOGE("Error: fork() failed: %s", err_msg);
+ exit(EXIT_FAILURE);
+ } else if (pid != 0) {
+ close(fds[1]);
+ /* Read in a string from the pipe */
+ if (read(fds[0], msg, sizeof(msg)) <= 0) {
+ LOGE("Failed to read from a file descriptor [%d]", fds[0]);
+ close(fds[0]);
+ return;
+ }
+ close(fds[0]);
+
+ /* Parent process closes up output side of pipe */
+ if (!strcmp(msg, MSG_DONE)) {
+ LOGI("Successfully daemonized");
+ exit(EXIT_SUCCESS);
+ } else {
+ LOGE("Daemonizing failed after fork");
+ exit(EXIT_FAILURE);
+ }
+ } else if (pid == 0) {
+ /* Child process closes up input side of pipe */
+ close(fds[0]);
+ *notify_fd = fds[1];
+ }
+}
+
+pid_t ms_daemonize(int *notify_fd)
+{
+ pid_t pid;
+ int fd, result;
+
+ muse_return_val_if_fail(notify_fd, MUSE_ERR);
+
+ ms_fork(notify_fd);
+
+ if ((pid = setsid()) < 0) {
+ LOGE("create new session");
+ exit(EXIT_FAILURE);
+ }
+
+ /* change the file mode mask */
+ umask(0);
+
+ result = chdir("/");
+ LOGD("result = %d sid: %d pgid: %d pid: %d ppid: %d", result, (int)getsid(0), (int)getpgid(0), (int)pid, (int)getppid());
+
+ /* redirect fds to /dev/null */
+ fd = open("/dev/null", O_RDWR);
+ if (!muse_core_fd_is_valid(fd)) {
+ LOGE("Critical Error : %d is invalid", fd);
+ exit(EXIT_SUCCESS);
+ }
+
+ close(STDIN_FILENO);
+ close(STDOUT_FILENO);
+ close(STDERR_FILENO);
+
+ dup2(fd, STDIN_FILENO);
+ dup2(fd, STDOUT_FILENO);
+ dup2(fd, STDERR_FILENO);
+
+ close(fd);
+
+ return pid;
+}
+
+void ms_daemonize_complete(int notify_fd)
+{
+ LOGW("Enter");
+
+ muse_return_if_fail(muse_core_fd_is_valid(notify_fd));
+
+#ifdef MUSE_REGISTER_VIP
+ proc_stat_set_vip_process();
+#endif
+
+ write(notify_fd, MSG_DONE, strlen(MSG_DONE) + 1);
+ LOGI("[%d] Notify parent process that child initialization is done", notify_fd);
+ close(notify_fd);
+
+ LOGW("Leave");
+}
+
+void ms_gst_init(char **cmd)
+{
+ gint *argc = NULL;
+ gchar **argv = NULL;
+ GError *err = NULL;
+ gboolean ret = FALSE;
+ int gst_param_cnt;
+
+#ifdef MUSE_TTRACE_LOG
+ trace_begin("MUSE:gst_init");
+#endif
+
+ gst_param_cnt = ms_config_get_gst_param_cnt();
+
+ argc = malloc(sizeof(gint));
+ muse_return_if_fail(argc);
+
+ /* add gst_param */
+ argv = malloc(sizeof(gchar *) * (gst_param_cnt + 1));
+ if (!argv) {
+ LOGE("argv memory leak allocatoin failed");
+ free(argc);
+ return;
+ }
+
+ memset(argv, 0, sizeof(gchar *) * (gst_param_cnt + 1));
+
+ *argc = 0;
+ argv[*argc] = (gchar *)cmd[0];
+ (*argc)++;
+ for (; (*argc) <= gst_param_cnt; (*argc)++)
+ argv[*argc] = ms_config_get_gst_param_str((*argc) - 1);
+
+ /* initializing gstreamer */
+ ret = gst_init_check(argc, &argv, &err);
+ if (!ret) {
+ LOGE("Could not initialize GStreamer: %s ", err ? err->message : "unknown error occurred");
+ if (err)
+ g_error_free(err);
+ }
+
+ /* release */
+ free(argv);
+ free(argc);
+
+ LOGI("complete to initialize gstreamer");
+
+#ifdef MUSE_TTRACE_LOG
+ trace_end();
+#endif
+}
+
+int ms_pidfile_create(const char *path, pid_t pid)
+{
+ int fd;
+ struct flock lock;
+ char pid_buf[MUSE_MSG_LEN] = {'\0',};
+ char err_msg[MUSE_MSG_LEN_MAX] = {'\0',};
+
+ muse_return_val_if_fail(path, MM_ERROR_INVALID_ARGUMENT);
+ muse_core_remove_symlink(path);
+ fd = open(path, O_WRONLY | O_CREAT, (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH));
+
+ if (!muse_core_fd_is_valid(fd)) {
+ strerror_r(errno, err_msg, MUSE_MSG_LEN_MAX);
+ LOGE("Fail to open pidfile [%s] : %s", path, err_msg);
+ return MM_ERROR_FILE_NOT_FOUND;
+ }
+
+ lock.l_type = F_WRLCK;
+ lock.l_start = 0;
+ lock.l_whence = SEEK_SET;
+ lock.l_len = 0;
+
+ if (fcntl(fd, F_SETLK, &lock) < 0) {
+ if (errno != EACCES && errno != EAGAIN) {
+ strerror_r(errno, err_msg, MUSE_MSG_LEN_MAX);
+ LOGE("Fail to lock pidfile [%s] : %s", path, err_msg);
+ } else {
+ LOGE("process is already running");
+ }
+ close(fd);
+ return MM_ERROR_FILE_INTERNAL;
+ }
+
+ if (ftruncate(fd, 0) < 0) {
+ strerror_r(errno, err_msg, MUSE_MSG_LEN_MAX);
+ LOGE("Fail to truncate pidfile [%s] : %s", path, err_msg);
+ close(fd);
+ return MM_ERROR_FILE_INTERNAL;
+ }
+
+ memset(pid_buf, 0, sizeof(pid_buf));
+ snprintf(pid_buf, sizeof(pid_buf), "%u", pid);
+
+ if (write(fd, pid_buf, strlen(pid_buf)) != (int)strlen(pid_buf)) {
+ strerror_r(errno, err_msg, MUSE_MSG_LEN_MAX);
+ LOGE("Fail to write pid to pidfile [%s] : %s", path, err_msg);
+ close(fd);
+ return MM_ERROR_FILE_WRITE;
+ }
+
+ close(fd);
+ return MM_ERROR_NONE;
+}
+
+void ms_init(char **argv)
+{
+ int idx;
+ pid_t pid;
+ int notify_fd;
+ muse_module_cmd_dispatchfunc *cmd_dispatcher = NULL;
+
+ LOGD("Enter");
+
+ ms_setup_syslog();
+
+ pid = ms_daemonize(¬ify_fd);
+
+ if (ms_pidfile_create(MUSE_DEFAULT_PIDFILE, pid) != MM_ERROR_NONE)
+ exit(EXIT_FAILURE);
+ else
+ LOGD("MUSE_DEFAULT_PIDFILE(%s) file was created", MUSE_DEFAULT_PIDFILE);
+
+ _ms_init();
+
+ muse_return_if_fail(ms_get_instance());
+ ms_get_instance()->pid = pid;
+
+ muse_return_if_fail(ms_open_lockfile() == MM_ERROR_NONE);
+
+ ms_new();
+
+ ms_daemonize_complete(notify_fd);
+
+#ifdef MUSE_TTRACE_LOG
+ trace_end();
+#endif
+
+#ifdef MUSE_TTRACE_LOG
+ trace_begin("MUSE:preloading module");
+#endif
+ for (idx = 0; idx < ms_config_get_host_cnt(); idx++) {
+ if (0 == strncmp(ms_config_get_preloaded_value(idx), "yes", strlen("yes") + 1)) {
+ g_module_symbol(ms_module_open(idx), CMD_DISPATCHER, (gpointer *)&cmd_dispatcher);
+ if (cmd_dispatcher && cmd_dispatcher[MUSE_MODULE_COMMAND_INITIALIZE])
+ cmd_dispatcher[MUSE_MODULE_COMMAND_INITIALIZE](NULL);
+ }
+ }
+#ifdef MUSE_TTRACE_LOG
+ trace_end();
+#endif
+
+ ms_system_subscribe_external_event(ms_get_instance()->system);
+
+ ms_diag_thread_create();
+
+#ifdef MUSE_USE_WATCHDOG
+ if (!ms_watchdog_attach(ms_get_instance()->watchdog)) {
+ LOGE("watchdog thread failed");
+ ms_log_process_info(pid);
+ return;
+ }
+#endif
+
+ ms_gst_init(argv);
+
LOGD("Leaver");
}
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->workqueue, retval);
+ muse_return_val_if_fail(muse_server->diag_thread, retval);
ms_recursive_rmdir(MUSE_DATA_ROOT_PATH);
ms_set_state(MUSE_SERVER_STATE_IDLE);
+ ms_diag_thread_destroy();
+
#ifdef MUSE_USE_WATCHDOG
+ ms_watchdog_detach(muse_server->watchdog);
+
if (ms_watchdog_deinit(muse_server->watchdog) == MM_ERROR_NONE)
free(muse_server->watchdog);
else
LOGE("Fail to deinitialize server watchdog");
#endif
+#ifdef MUSE_USE_LWIPC
+ if (LwipcResetEvent(MUSE_SERVER_READY) < 0)
+ LOGE("Fail to reset light weight IPC");
+#else
+ ms_remove_ready_file();
+#endif
+
retval = muse_server->retval;
muse_core_fd_close(muse_server->msg_fd);
muse_core_fd_close(muse_server->data_fd);
int i, j;
for (i = 0; i < MUSE_CHANNEL_MAX; i++) {
- if (ms_config_is_on_demand() == TRUE && i == MUSE_CHANNEL_MSG)
+ if (ms_config_is_on_demand() && i == MUSE_CHANNEL_MSG)
fd[i] = SD_LISTEN_FDS_START;
else
fd[i] = _ms_new(i);
_ms_create_new_server_from_fd(fd, READ | PERSIST);
}
-int ms_run(char **cmd, int notify_fd)
+void ms_run(void)
{
- char err_msg[MUSE_MSG_LEN_MAX] = {'\0',};
- GError *error = NULL;
-
-#ifndef MUSE_USE_LWIPC
- int ready_fd;
-#endif
-
LOGW("Enter");
- muse_return_val_if_fail(muse_core_fd_is_valid(notify_fd), MUSE_ERR);
- muse_return_val_if_fail(_ms_run() == MM_ERROR_NONE, MUSE_ERR);
- muse_return_val_if_fail(muse_server, MUSE_ERR);
-
- muse_server->main_loop = g_main_loop_new(NULL, FALSE);
- muse_return_val_if_fail(muse_server->main_loop, MUSE_ERR);
-
- ms_new();
-
- 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);
- LOGE("%s", err_msg);
- g_error_free(error);
- ms_log_process_info(muse_server->pid);
- }
-
-#ifdef MUSE_USE_LWIPC
- _ms_wait_event();
-
- ms_set_state(MUSE_SERVER_STATE_READY);
-
- if (LwipcEventDone(MUSE_SERVER_READY) < 0)
- LOGE("Fail to send server ready done event");
-#else
- ready_fd = creat(MUSE_SERVER_READY, 0644);
- if (muse_core_fd_is_valid(ready_fd)) {
- LOGD("MUSE_SERVER_READY(%s) file was created", MUSE_SERVER_READY);
-
- close(ready_fd);
- ms_set_state(MUSE_SERVER_STATE_READY);
- } else {
- LOGE("[%d] Fail to create MUSE_SERVER_READY(%s)", ready_fd, MUSE_SERVER_READY);
- }
-#endif
-
-#ifdef MUSE_REGISTER_VIP
- proc_stat_set_vip_process();
-#endif
-
- ms_system_subscribe_external_event(muse_server->system);
-
- write(notify_fd, MSG_DONE, strlen(MSG_DONE) + 1);
- LOGI("[%d] Notify parent process that child initialization is done", notify_fd);
- close(notify_fd);
-
-#ifdef MUSE_USE_WATCHDOG
- if (!ms_watchdog_attach(muse_server->watchdog)) {
- LOGE("watchdog thread failed");
- ms_log_process_info(muse_server->pid);
- return ms_deinit();
- }
-#endif
-
- ms_gst_init(cmd);
+ muse_return_if_fail(muse_server->main_loop);
+ muse_return_if_fail(ms_create_ready_file());
LOGI("g_main_loop_run");
g_main_loop_run(muse_server->main_loop);
-#ifdef MUSE_USE_WATCHDOG
- ms_watchdog_detach(muse_server->watchdog);
-#endif
-
LOGW("Leave");
-
- return ms_deinit();
}
void ms_cmd_dispatch(muse_module_h m, muse_module_command_e cmd)
return muse_server->state == MUSE_SERVER_STATE_READY;
}
+gboolean ms_create_ready_file(void)
+{
+ LOGD("Enter");
+#ifndef MUSE_USE_LWIPC
+ int ready_fd;
+#endif
+
+#ifdef MUSE_USE_LWIPC
+ _ms_wait_event();
+
+ ms_set_state(MUSE_SERVER_STATE_READY);
+
+ if (LwipcEventDone(MUSE_SERVER_READY) < 0) {
+ LOGE("Fail to send server ready done event");
+ return FALSE;
+ }
+#else
+ ready_fd = creat(MUSE_SERVER_READY, 0644);
+ if (muse_core_fd_is_valid(ready_fd)) {
+ LOGD("MUSE_SERVER_READY(%s) file was created", MUSE_SERVER_READY);
+
+ close(ready_fd);
+ ms_set_state(MUSE_SERVER_STATE_READY);
+ } else {
+ LOGE("[%d] Fail to create MUSE_SERVER_READY(%s)", ready_fd, MUSE_SERVER_READY);
+ return FALSE;
+ }
+#endif
+ LOGD("Leave");
+
+ return TRUE;
+
+}
+
+void ms_remove_ready_file(void)
+{
+#ifdef MUSE_USE_LWIPC
+ if (LwipcResetEvent(MUSE_SERVER_READY) < 0)
+ LOGE("Fail to reset light weight IPC");
+#else
+ if (remove(MUSE_SERVER_READY) == MUSE_ERR)
+ LOGE("remove %s failed", MUSE_SERVER_READY);
+#endif
+}