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);
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);
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);
}
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);
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;
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)
{
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");
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");
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;
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;