Notify corresponding command when mm-resource-managerd shutdown 86/195186/19 accepted/tizen/unified/20181219.063337 submit/tizen/20181218.113808
authorYoungHun Kim <yh8004.kim@samsung.com>
Tue, 11 Dec 2018 10:48:17 +0000 (19:48 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Tue, 18 Dec 2018 11:22:59 +0000 (20:22 +0900)
Change-Id: Ia2d023a90db7ae4c6f164fff54712a59bcf10995

core/include/muse_core.h
packaging/mused.spec
server/include/muse_server_system.h
server/src/muse_server_ipc.c
server/src/muse_server_private.c
server/src/muse_server_system.c

index 9a16e04..7c70bb8 100644 (file)
@@ -76,6 +76,7 @@ typedef enum {
        MUSE_MODULE_COMMAND_RESOURCE_NOT_AVAILABLE,
        MUSE_MODULE_COMMAND_EXTERNAL_STORAGE_STATE_CHANGED,
        MUSE_MODULE_COMMAND_CREATE_CAUTION,
+       MUSE_MODULE_COMMAND_RESOURCE_MANAGER_SHUTDOWN,
        MUSE_MODULE_COMMAND_MAX
 } muse_module_command_e;
 
index fe8b80a..0c02488 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mused
 Summary:    A multimedia daemon
-Version:    0.3.56
+Version:    0.3.57
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0
@@ -77,8 +77,8 @@ export CFLAGS+=" -DMUSE_USE_CLIENT_SIGHANDLER"
 export CFLAGS+=" -DMUSE_REGISTER_VIP -DMUSE_USE_LWIPC -DMUSE_TTRACE_LOG"
 %cmake . -DCMAKE_INSTALL_PREFIX=/usr -DFULLVER=%{version} -DMAJORVER=${MAJORVER} -DLIBDIR=%{_libdir} -DTZ_SYS_DATA=%TZ_SYS_DATA -DMUSE_REGISTER_VIP=1 -DMUSE_TTRACE_LOG=1 -DMUSE_USE_LWIPC=1
 %else
-export CFLAGS+=" -DMUSE_USE_POWER_OFF_STATE_CHANGE -DMUSE_USE_EXTERNAL_STORAGE_STATE_CHANGE -DMUSE_USE_WATCHDOG"
-%cmake . -DCMAKE_INSTALL_PREFIX=/usr -DFULLVER=%{version} -DMAJORVER=${MAJORVER} -DLIBDIR=%{_libdir} -DTZ_SYS_DATA=%TZ_SYS_DATA -DMUSE_GTESTS_BUILD=%{?gtests:1}%{!?gtests:0}
+export CFLAGS+=" -DMUSE_USE_POWER_OFF_STATE_CHANGE -DMUSE_USE_EXTERNAL_STORAGE_STATE_CHANGE -DMUSE_USE_WATCHDOG -DMUSE_USE_RM_READY"
+%cmake . -DCMAKE_INSTALL_PREFIX=/usr -DFULLVER=%{version} -DMAJORVER=${MAJORVER} -DLIBDIR=%{_libdir} -DTZ_SYS_DATA=%TZ_SYS_DATA -DMUSE_GTESTS_BUILD=%{?gtests:1}%{!?gtests:0} -DMUSE_USE_RM_READY=1
 %endif
 
 make %{?jobs:-j%jobs}
index 3b32904..88f6694 100644 (file)
@@ -31,22 +31,29 @@ extern "C" {
 
 #define MS_POWER_DBUS_MSG                      "ChangeState"
 #define MS_POWER_DBUS_PATH                     "/Org/Tizen/System/DeviceD/PowerOff"
-#define MS_POWER_DBUS_INTERFACE                "org.tizen.system.deviced.PowerOff"
+#define MS_POWER_DBUS_INTERFACE                        "org.tizen.system.deviced.PowerOff"
+
+#define MS_RM_DBUS_MSG                         "NameOwnerChanged"
+#define MS_RM_DBUS_SENDER                      "org.tizen.MMResourceManager"
+
+#define MS_DBUS_SERVICE                                "org.freedesktop.DBus"
+#define MS_DBUS_INTERFACE                      "org.freedesktop.DBus"
+#define MS_DBUS_PATH                           "/org/freedesktop/DBus"
 
 typedef struct ms_system {
        GDBusConnection *connection;
        GHashTable *platform_info_table;
        GMutex lock;
        int muse_poweroff_id;
+       int muse_rm_id;
 } ms_system_t;
 
 void ms_system_init(ms_system_t *system);
 void ms_system_deinit(ms_system_t *system);
 gboolean ms_system_get_gdbus(GDBusConnection **connection);
-int ms_system_subscribe_poweroff_state_change(ms_system_t *system);
-int ms_system_subscribe_external_storage_state_change(ms_system_t *system);
+void ms_system_subscribe_external_event(ms_system_t *system);
 int ms_system_get_platform_info(const char *key, bool *value);
-int ms_system_get_memory_info(int pid);
+int ms_system_get_memory_usage(int pid);
 
 #ifdef __cplusplus
 }
index 7f2654d..0ca6065 100644 (file)
@@ -136,8 +136,10 @@ static gpointer _ms_ipc_dispatch_worker(gpointer data)
                                                        m->is_create_api_called = true;
 #ifndef MUSE_USE_LWIPC
                                                        if (access(MUSE_SERVER_READY, F_OK) == 0)
-#endif
                                                                ms_cmd_dispatch(m, MUSE_MODULE_COMMAND_CREATE_SERVER_ACK);
+                                                       else
+                                                               LOGW("Do not send server acknowledgement because muse server is actually not ready");
+#endif
                                                        m->ch[MUSE_CHANNEL_DATA].data_queue = g_queue_new();
                                                        g_mutex_init(&m->ch[MUSE_CHANNEL_DATA].data_mutex);
                                                        g_cond_init(&m->ch[MUSE_CHANNEL_DATA].data_cond);
index dcc7ab7..bb3cfb5 100644 (file)
@@ -42,6 +42,17 @@ const char *UDS_files[MUSE_CHANNEL_MAX] = {MUSE_SOCK_FILE0, MUSE_SOCK_FILE1};
 
 static muse_server_h muse_server;
 
+static const char *module_cmd[MUSE_MODULE_COMMAND_MAX] = {
+       "initialize",
+       "shutdown",
+       "debug_info_dump",
+       "create_server_ack",
+       "resource_not_available",
+       "external_storage_state_changed",
+       "create_caution",
+       "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);
@@ -648,7 +659,7 @@ void ms_check_memory(int pid)
 
        ms_connection_lock(connection);
 
-       used_pss = ms_system_get_memory_info(pid);
+       used_pss = ms_system_get_memory_usage(pid);
 
        LOGI("[%d] Proportional set size %d (KByte)", pid, used_pss);
 
@@ -751,15 +762,7 @@ int ms_run(char **cmd, int notify_fd)
        proc_stat_set_vip_process();
 #endif
 
-#ifdef MUSE_USE_POWER_OFF_STATE_CHANGE
-       if (ms_system_subscribe_poweroff_state_change(muse_server->system) != MM_ERROR_NONE)
-               LOGE("Fail to subscribe poweroff state change");
-#endif
-
-#ifdef MUSE_USE_EXTERNAL_STORAGE_STATE_CHANGE
-       if (ms_system_subscribe_external_storage_state_change(muse_server->system) != MM_ERROR_NONE)
-               LOGE("Fail to subscribe external storage state change");
-#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);
@@ -925,6 +928,7 @@ void ms_cmd_dispatch_foreach_func(gpointer data, gpointer user_data)
        }
 
        ms_cmd_dispatch(m, cmd);
+       SECURE_LOGI("[%s] %p (%s)", module_cmd[cmd], m, ms_get_instance()->conf->host[m->idx]);
 
        if (cmd == MUSE_MODULE_COMMAND_EXTERNAL_STORAGE_STATE_CHANGED)
                muse_server_set_user_data(m, NULL);
index 59ce206..8f22c25 100644 (file)
@@ -35,7 +35,15 @@ static void _ms_external_storage_state_changed_cb(int storage_id, storage_dev_e
                        const char *fsuuid, const char *mount_path, bool primary, int flags, void *user_data);
 static void _ms_poweroff_state_changed_cb(GDBusConnection *con, const gchar *sender_name, const gchar *object_path,
                        const gchar *interface_name, const gchar *signal_name, GVariant *parameters, gpointer user_data);
+static void _ms_resource_manager_owner_name_changed_cb(GDBusConnection *con, const gchar *sender_name, const gchar *object_path,
+                       const gchar *interface_name, const gchar *signal_name, GVariant *parameters, gpointer user_data);
 static void _ms_system_unsubscribe_poweroff_state_change(void);
+static void _ms_system_unsubscribe_external_storage_state_change(void);
+static void _ms_system_unsubscribe_resource_manager_state_change(void);
+static int _ms_system_subscribe_poweroff_state_change(ms_system_t *system);
+static int _ms_system_subscribe_external_storage_state_change(ms_system_t *system);
+static int _ms_system_subscribe_resource_manager_state_change(ms_system_t *system);
+
 static void _ms_system_unsubscribe_poweroff_state_change(void)
 {
        ms_system_t *system = ms_get_instance()->system;
@@ -45,6 +53,22 @@ static void _ms_system_unsubscribe_poweroff_state_change(void)
        g_dbus_connection_signal_unsubscribe(system->connection, system->muse_poweroff_id);
 }
 
+static void _ms_system_unsubscribe_external_storage_state_change(void)
+{
+       int ret = storage_unset_changed_cb(STORAGE_TYPE_EXTERNAL, _ms_external_storage_state_changed_cb);
+       if (ret != STORAGE_ERROR_NONE)
+               LOGE("[0x%x] failed to unregister storage changed callback", ret);
+}
+
+static void _ms_system_unsubscribe_resource_manager_state_change(void)
+{
+       ms_system_t *system = ms_get_instance()->system;
+       muse_return_if_fail(system);
+       muse_return_if_fail(system->connection);
+
+       g_dbus_connection_signal_unsubscribe(system->connection, system->muse_rm_id);
+}
+
 static void _ms_poweroff_state_changed_cb(GDBusConnection *con, const gchar *sender_name, const gchar *object_path,
                        const gchar *interface_name, const gchar *signal_name, GVariant *parameters, gpointer user_data)
 {
@@ -140,47 +164,52 @@ static void _ms_external_storage_state_changed_cb(int storage_id, storage_dev_e
        g_mutex_unlock(&system->lock);
 }
 
-void ms_system_init(ms_system_t *system)
+static void _ms_resource_manager_owner_name_changed_cb(GDBusConnection *con, const gchar *sender_name, const gchar *object_path,
+                       const gchar *interface_name, const gchar *signal_name, GVariant *parameters, gpointer user_data)
 {
-       GError *error = NULL;
+       GQueue *queue;
+       ms_cmd_dispatcher_info_t dispatch;
+       ms_system_t *system = ms_get_instance()->system;
+       ms_connection_t *connection = ms_get_instance()->connection;
+       gchar *owner_name = NULL;
+       gchar *old_owner = NULL;
+       gchar *new_owner = NULL;
 
        muse_return_if_fail(system);
+       muse_return_if_fail(connection);
+       muse_return_if_fail(object_path);
+       muse_return_if_fail(signal_name);
+       muse_return_if_fail(parameters);
 
-       LOGD("Enter");
-
-       system->connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
-       if (!system->connection) {
-               if (error) {
-                       LOGE("fail to get gdbus connection (%s)", error->message);
-                       g_error_free(error);
-               }
-       }
+       if (g_strcmp0(object_path, MS_DBUS_PATH) || g_strcmp0(signal_name, MS_RM_DBUS_MSG))
+               return;
 
-       system->platform_info_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
-       muse_return_if_fail(system->platform_info_table);
+       g_variant_get(parameters, "(sss)", &owner_name, &old_owner, &new_owner);
 
-       g_mutex_init(&system->lock);
+       if (g_strcmp0(owner_name, MS_RM_DBUS_SENDER) || *new_owner == '\0')
+               goto out;
 
-       LOGD("Leaver");
-}
+       g_mutex_lock(&system->lock);
 
-void ms_system_deinit(ms_system_t *system)
-{
-       muse_return_if_fail(system);
+       ms_connection_lock(connection);
 
-       _ms_system_unsubscribe_poweroff_state_change();
+       queue = connection->instance_queue;
 
-       if (system->connection)
-               g_object_unref(system->connection);
+       dispatch.cmd = MUSE_MODULE_COMMAND_RESOURCE_MANAGER_SHUTDOWN;
 
-       g_mutex_clear(&system->lock);
+       g_queue_foreach(queue, ms_cmd_dispatch_foreach_func, (gpointer)&dispatch);
+       LOGE("resource manager shutdown");
 
-       g_hash_table_destroy(system->platform_info_table);
+       ms_connection_unlock(connection);
 
-       free(system);
+       g_mutex_unlock(&system->lock);
+out:
+       g_free(owner_name);
+       g_free(old_owner);
+       g_free(new_owner);
 }
 
-int ms_system_subscribe_poweroff_state_change(ms_system_t *system)
+static int _ms_system_subscribe_poweroff_state_change(ms_system_t *system)
 {
        LOGD("Enter");
 
@@ -197,7 +226,7 @@ int ms_system_subscribe_poweroff_state_change(ms_system_t *system)
        return MM_ERROR_NONE;
 }
 
-int ms_system_subscribe_external_storage_state_change(ms_system_t *system)
+static int _ms_system_subscribe_external_storage_state_change(ms_system_t *system)
 {
        LOGD("Enter");
 
@@ -213,6 +242,64 @@ int ms_system_subscribe_external_storage_state_change(ms_system_t *system)
        return MM_ERROR_NONE;
 }
 
+static int _ms_system_subscribe_resource_manager_state_change(ms_system_t *system)
+{
+       LOGD("Enter");
+
+       muse_return_val_if_fail(system, MM_ERROR_INVALID_ARGUMENT);
+
+       muse_return_val_if_fail(system->connection, MM_ERROR_UNKNOWN);
+
+       system->muse_rm_id = g_dbus_connection_signal_subscribe(system->connection, MS_DBUS_SERVICE,
+               MS_DBUS_INTERFACE, MS_RM_DBUS_MSG, NULL, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
+               _ms_resource_manager_owner_name_changed_cb, NULL, NULL);
+       LOGD("Leave");
+
+       return MM_ERROR_NONE;
+}
+
+void ms_system_init(ms_system_t *system)
+{
+       GError *error = NULL;
+
+       muse_return_if_fail(system);
+
+       LOGD("Enter");
+
+       system->connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+       if (!system->connection) {
+               if (error) {
+                       LOGE("fail to get gdbus connection (%s)", error->message);
+                       g_error_free(error);
+               }
+       }
+
+       system->platform_info_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+       muse_return_if_fail(system->platform_info_table);
+
+       g_mutex_init(&system->lock);
+
+       LOGD("Leaver");
+}
+
+void ms_system_deinit(ms_system_t *system)
+{
+       muse_return_if_fail(system);
+
+       _ms_system_unsubscribe_poweroff_state_change();
+       _ms_system_unsubscribe_external_storage_state_change();
+       _ms_system_unsubscribe_resource_manager_state_change();
+
+       if (system->connection)
+               g_object_unref(system->connection);
+
+       g_mutex_clear(&system->lock);
+
+       g_hash_table_destroy(system->platform_info_table);
+
+       free(system);
+}
+
 int ms_system_get_platform_info(const char *key, bool *value)
 {
        int ret = MM_ERROR_NONE;
@@ -255,7 +342,27 @@ int ms_system_get_platform_info(const char *key, bool *value)
        return ret;
 }
 
-int ms_system_get_memory_info(int pid)
+void ms_system_subscribe_external_event(ms_system_t *system)
+{
+       muse_return_if_fail(system);
+
+#ifdef MUSE_USE_POWER_OFF_STATE_CHANGE
+       if (_ms_system_subscribe_poweroff_state_change(system) != MM_ERROR_NONE)
+               LOGE("Fail to subscribe poweroff state change");
+#endif
+
+#ifdef MUSE_USE_EXTERNAL_STORAGE_STATE_CHANGE
+       if (_ms_system_subscribe_external_storage_state_change(system) != MM_ERROR_NONE)
+               LOGE("Fail to subscribe external storage state change");
+#endif
+
+#ifdef MUSE_USE_RM_READY
+       if (_ms_system_subscribe_resource_manager_state_change(system) != MM_ERROR_NONE)
+               LOGE("Fail to subscribe resource manager state change");
+#endif
+}
+
+int ms_system_get_memory_usage(int pid)
 {
        int used_pss = 0;
        process_memory_info_s *info = NULL;