From 19694165bd677fbc677c8d5f4fbdb1cf59f4e37e Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Tue, 8 Feb 2022 12:08:46 +0900 Subject: [PATCH 01/16] util: gdbus-util: Fix memory leak issue Change-Id: I3df1d2edbeec17f14cf87ee55065922e0362ba5f Reported-by: Seung-Woo Kim Suggested-by: Seung-Woo Kim Signed-off-by: Chanwoo Choi --- src/util/gdbus-util.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/util/gdbus-util.c b/src/util/gdbus-util.c index 53d6da9..b4fcafe 100644 --- a/src/util/gdbus-util.c +++ b/src/util/gdbus-util.c @@ -157,6 +157,7 @@ int pass_gdbus_send_broadcast_signal(passdbus idx, char *path, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, &err); if (!ret) { _E("failed to broadcast [%s]", method); + g_error_free(err); g_object_unref(message); return -ECOMM; } -- 2.7.4 From 04e9e50c6ed95e3128ea2f195a34ddcc3fb3d7a0 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Tue, 8 Feb 2022 16:19:19 +0900 Subject: [PATCH 02/16] util: gdbus: Rename gdbus-util functions by removing the specific module name Rename gdbus-util functions by removing the specific module name without any behavior changes. Change-Id: I5d0265a985443a628d1265c371c444686ba7d88e Signed-off-by: Chanwoo Choi --- include/util/gdbus-util.h | 38 +++++++++++++++++++------------------- src/main.c | 6 +++--- src/pass/pass.c | 16 ++++++++-------- src/pmqos/pmqos.c | 16 ++++++++-------- src/thermal/thermal.c | 26 +++++++++++++------------- src/util/gdbus-util.c | 34 +++++++++++++++++----------------- 6 files changed, 68 insertions(+), 68 deletions(-) diff --git a/include/util/gdbus-util.h b/include/util/gdbus-util.h index 2f8e078..a5dbc44 100644 --- a/include/util/gdbus-util.h +++ b/include/util/gdbus-util.h @@ -29,34 +29,34 @@ #include "gdbus-definition.h" -struct pass_gdbus_signal_info { +struct gdbus_signal_info { const gchar *handler; GCallback cb; gpointer cb_data; gulong ret_id; }; -int pass_gdbus_register_systemd_startup_callback(GDBusSignalCallback cb, +int gdbus_register_systemd_startup_callback(GDBusSignalCallback cb, gpointer user_data, guint *id); -int pass_gdbus_unregister_systemd_startup_callback(guint id); -int pass_gdbus_get_systemd_dbus_property_string(const char *iface, +int gdbus_unregister_systemd_startup_callback(guint id); +int gdbus_get_systemd_dbus_property_string(const char *iface, const char *prop, const char **value); -int pass_gdbus_export_interface(passdbus idx, gpointer instance, const char *obj_path); -int pass_gdbus_get_name(passdbus idx, const char *name); -int pass_gdbus_connect_signal(gpointer instance, int num_signals, - struct pass_gdbus_signal_info *signal_infos); -void pass_gdbus_disconnect_signal(gpointer instance, int num_signals, - struct pass_gdbus_signal_info *signal_infos); -int pass_gdbus_send_broadcast_signal(passdbus idx, char *path, char *interface, +int gdbus_export_interface(passdbus idx, gpointer instance, const char *obj_path); +int gdbus_get_name(passdbus idx, const char *name); +int gdbus_connect_signal(gpointer instance, int num_signals, + struct gdbus_signal_info *signal_infos); +void gdbus_disconnect_signal(gpointer instance, int num_signals, + struct gdbus_signal_info *signal_infos); +int gdbus_send_broadcast_signal(passdbus idx, char *path, char *interface, char *method, GVariant *arg); -SystemPassCore *pass_gdbus_get_instance_core(void); -void pass_gdbus_put_instance_core(SystemPassCore **instance); -SystemPassPmqos *pass_gdbus_get_instance_pmqos(void); -void pass_gdbus_put_instance_pmqos(SystemPassPmqos **instance); -SystemThermal *pass_gdbus_get_instance_thermal(void); -void pass_gdbus_put_instance_thermal(SystemThermal **instance); +SystemPassCore *gdbus_get_instance_core(void); +void gdbus_put_instance_core(SystemPassCore **instance); +SystemPassPmqos *gdbus_get_instance_pmqos(void); +void gdbus_put_instance_pmqos(SystemPassPmqos **instance); +SystemThermal *gdbus_get_instance_thermal(void); +void gdbus_put_instance_thermal(SystemThermal **instance); -int pass_gdbus_get_system_connection(passdbus idx); -void pass_gdbus_put_system_connection(passdbus idx); +int gdbus_get_system_connection(passdbus idx); +void gdbus_put_system_connection(passdbus idx); #endif /* __GDBUS_UTIL_H__ */ diff --git a/src/main.c b/src/main.c index bbcd618..91f925f 100644 --- a/src/main.c +++ b/src/main.c @@ -51,7 +51,7 @@ static int late_init(void) signal(SIGTERM, sig_quit); signal(SIGUSR1, sig_usr1); - ret = pass_gdbus_get_name(PASS_DBUS_CORE, DBUS_PASS_BUS_NAME); + ret = gdbus_get_name(PASS_DBUS_CORE, DBUS_PASS_BUS_NAME); if (ret < 0) return ret; @@ -63,7 +63,7 @@ static int late_init(void) int main(int argc, char **argv) { g_mainloop = g_main_loop_new(NULL, FALSE); - pass_gdbus_get_system_connection(PASS_DBUS_CORE); + gdbus_get_system_connection(PASS_DBUS_CORE); init_timer(); init_devices(NULL); @@ -74,7 +74,7 @@ int main(int argc, char **argv) exit_devices(NULL); exit_timer(); - pass_gdbus_put_system_connection(PASS_DBUS_CORE); + gdbus_put_system_connection(PASS_DBUS_CORE); g_main_loop_unref(g_mainloop); return 0; diff --git a/src/pass/pass.c b/src/pass/pass.c index ac70225..a0c1a6e 100644 --- a/src/pass/pass.c +++ b/src/pass/pass.c @@ -177,7 +177,7 @@ static gboolean dbus_cb_core_stop(SystemPassCore *obj, * and callback function pointer which is executed when receives * the defined signal. */ -static struct pass_gdbus_signal_info g_gdbus_signal_infos[] = { +static struct gdbus_signal_info g_gdbus_signal_infos[] = { { .handler = DBUS_CORE_I_START_HANDLER, .cb = G_CALLBACK(dbus_cb_core_start), @@ -514,9 +514,9 @@ static void pass_exit(void *data) unregister_notifier(DEVICE_NOTIFIER_INIT_DONE, pass_init_done, NULL); - pass_gdbus_disconnect_signal(g_gdbus_instance, + gdbus_disconnect_signal(g_gdbus_instance, ARRAY_SIZE(g_gdbus_signal_infos), g_gdbus_signal_infos); - pass_gdbus_put_instance_core(&g_gdbus_instance); + gdbus_put_instance_core(&g_gdbus_instance); pass_exit_done(); @@ -537,14 +537,14 @@ static int pass_probe(void *data) g_pass.state = PASS_OFF; - g_gdbus_instance = pass_gdbus_get_instance_core(); + g_gdbus_instance = gdbus_get_instance_core(); if (g_gdbus_instance == NULL) { _E("cannot get a dbus instance for the %s interface\n", DBUS_CORE_INTERFACE); return -ENOSYS; } - ret = pass_gdbus_connect_signal(g_gdbus_instance, + ret = gdbus_connect_signal(g_gdbus_instance, ARRAY_SIZE(g_gdbus_signal_infos), g_gdbus_signal_infos); if (ret < 0) { _E("cannot register callbacks as the dbus method invocation " @@ -553,7 +553,7 @@ static int pass_probe(void *data) goto out; } - ret = pass_gdbus_export_interface(PASS_DBUS_CORE, + ret = gdbus_export_interface(PASS_DBUS_CORE, g_gdbus_instance, DBUS_CORE_PATH); if (ret < 0) { _E("cannot export the dbus interface '%s' " @@ -580,10 +580,10 @@ static int pass_probe(void *data) return 0; out_disconnect: - pass_gdbus_disconnect_signal(g_gdbus_instance, + gdbus_disconnect_signal(g_gdbus_instance, ARRAY_SIZE(g_gdbus_signal_infos), g_gdbus_signal_infos); out: - pass_gdbus_put_instance_core(&g_gdbus_instance); + gdbus_put_instance_core(&g_gdbus_instance); return ret; } diff --git a/src/pmqos/pmqos.c b/src/pmqos/pmqos.c index 404b9ca..91476c6 100644 --- a/src/pmqos/pmqos.c +++ b/src/pmqos/pmqos.c @@ -241,7 +241,7 @@ static gboolean dbus_cb_pmqos_legacy_scenario(SystemPassPmqos *obj, * feature. It contains the signal name and callback function * pointer which is executed when receives the defined signal. */ -static struct pass_gdbus_signal_info g_gdbus_signal_infos[] = { +static struct gdbus_signal_info g_gdbus_signal_infos[] = { { .handler = DBUS_PMQOS_I_APPLAUNCH_HANDLER, .cb = G_CALLBACK(dbus_cb_pmqos_legacy_scenario), @@ -596,9 +596,9 @@ static void pmqos_exit(void *data) unregister_notifier(DEVICE_NOTIFIER_INIT_DONE, pmqos_init_done, NULL); - pass_gdbus_disconnect_signal(g_gdbus_instance, + gdbus_disconnect_signal(g_gdbus_instance, ARRAY_SIZE(g_gdbus_signal_infos), g_gdbus_signal_infos); - pass_gdbus_put_instance_pmqos(&g_gdbus_instance); + gdbus_put_instance_pmqos(&g_gdbus_instance); pmqos_free(); } @@ -615,14 +615,14 @@ static int pmqos_probe(void *data) { int ret = 0; - g_gdbus_instance = pass_gdbus_get_instance_pmqos(); + g_gdbus_instance = gdbus_get_instance_pmqos(); if (!g_gdbus_instance) { _E("cannot get a dbus instance for the %s interface\n", DBUS_PMQOS_INTERFACE); return -ENOSYS; } - ret = pass_gdbus_connect_signal(g_gdbus_instance, + ret = gdbus_connect_signal(g_gdbus_instance, ARRAY_SIZE(g_gdbus_signal_infos), g_gdbus_signal_infos); if (ret < 0) { _E("cannot register callbacks as the dbus method invocation " @@ -631,7 +631,7 @@ static int pmqos_probe(void *data) goto out; } - ret = pass_gdbus_export_interface(PASS_DBUS_CORE, + ret = gdbus_export_interface(PASS_DBUS_CORE, g_gdbus_instance, DBUS_PMQOS_PATH); if (ret < 0) { _E("cannot export the dbus interface '%s' " @@ -658,10 +658,10 @@ static int pmqos_probe(void *data) return 0; out_disconnect: - pass_gdbus_disconnect_signal(g_gdbus_instance, + gdbus_disconnect_signal(g_gdbus_instance, ARRAY_SIZE(g_gdbus_signal_infos), g_gdbus_signal_infos); out: - pass_gdbus_put_instance_pmqos(&g_gdbus_instance); + gdbus_put_instance_pmqos(&g_gdbus_instance); return ret; diff --git a/src/thermal/thermal.c b/src/thermal/thermal.c index 037e84a..60440ab 100644 --- a/src/thermal/thermal.c +++ b/src/thermal/thermal.c @@ -246,7 +246,7 @@ static gboolean dbus_cb_thermal_stop(SystemThermal *obj, * function pointer which is executed when receives the defined * signal. */ -static struct pass_gdbus_signal_info g_gdbus_signal_infos[] = { +static struct gdbus_signal_info g_gdbus_signal_infos[] = { { .handler = DBUS_THERMAL_I_START_HANDLER, .cb = G_CALLBACK(dbus_cb_thermal_start), @@ -381,7 +381,7 @@ static int thermal_notifier_cb(void *data, void *user_data) /* If there is available thermal scenario, send the broadcast signal */ gvar = g_variant_new("(s)", scenario); - ret = pass_gdbus_send_broadcast_signal(PASS_DBUS_THERMAL, + ret = gdbus_send_broadcast_signal(PASS_DBUS_THERMAL, DBUS_THERMAL_PATH, DBUS_THERMAL_INTERFACE, DBUS_THERMAL_SIGNAL, @@ -419,11 +419,11 @@ static void thermal_exit(void *data) unregister_notifier(DEVICE_NOTIFIER_INIT_DONE, thermal_init_done, NULL); - pass_gdbus_disconnect_signal(g_gdbus_instance, + gdbus_disconnect_signal(g_gdbus_instance, ARRAY_SIZE(g_gdbus_signal_infos), g_gdbus_signal_infos); - pass_gdbus_put_instance_thermal(&g_gdbus_instance); + gdbus_put_instance_thermal(&g_gdbus_instance); - pass_gdbus_put_system_connection(PASS_DBUS_THERMAL); + gdbus_put_system_connection(PASS_DBUS_THERMAL); thermal_free(); } @@ -440,14 +440,14 @@ static int thermal_probe(void *data) { int ret = 0; - ret = pass_gdbus_get_system_connection(PASS_DBUS_THERMAL); + ret = gdbus_get_system_connection(PASS_DBUS_THERMAL); if (ret < 0) { _E("Failed to get system connection for thermal"); return -ENOENT; } /* Initialize the d-bus interface for Thermal Monitor */ - g_gdbus_instance = pass_gdbus_get_instance_thermal(); + g_gdbus_instance = gdbus_get_instance_thermal(); if (!g_gdbus_instance) { _E("failed to get a dbus instance for the %s interface\n", DBUS_THERMAL_INTERFACE); @@ -455,14 +455,14 @@ static int thermal_probe(void *data) goto out; } - ret = pass_gdbus_get_name(PASS_DBUS_THERMAL, DBUS_THERMAL_BUS_NAME); + ret = gdbus_get_name(PASS_DBUS_THERMAL, DBUS_THERMAL_BUS_NAME); if (ret < 0) { _E("Failed to own dbus name '%s'\n", DBUS_THERMAL_BUS_NAME); ret = -EINVAL; goto out; } - ret = pass_gdbus_connect_signal(g_gdbus_instance, + ret = gdbus_connect_signal(g_gdbus_instance, ARRAY_SIZE(g_gdbus_signal_infos), g_gdbus_signal_infos); if (ret < 0) { _E("failed to register callbacks as the dbus method invocation " @@ -471,7 +471,7 @@ static int thermal_probe(void *data) goto out_put_instance; } - ret = pass_gdbus_export_interface(PASS_DBUS_THERMAL, + ret = gdbus_export_interface(PASS_DBUS_THERMAL, g_gdbus_instance, DBUS_THERMAL_PATH); if (ret < 0) { _E("failed to export the dbus interface '%s' " @@ -510,12 +510,12 @@ out_booting_done: unregister_notifier(DEVICE_NOTIFIER_INIT_DONE, thermal_init_done, NULL); out_disconnect: - pass_gdbus_disconnect_signal(g_gdbus_instance, + gdbus_disconnect_signal(g_gdbus_instance, ARRAY_SIZE(g_gdbus_signal_infos), g_gdbus_signal_infos); out_put_instance: - pass_gdbus_put_instance_thermal(&g_gdbus_instance); + gdbus_put_instance_thermal(&g_gdbus_instance); out: - pass_gdbus_put_system_connection(PASS_DBUS_THERMAL); + gdbus_put_system_connection(PASS_DBUS_THERMAL); return ret; } diff --git a/src/util/gdbus-util.c b/src/util/gdbus-util.c index b4fcafe..17c25c2 100644 --- a/src/util/gdbus-util.c +++ b/src/util/gdbus-util.c @@ -26,7 +26,7 @@ static GDBusConnection *g_dbus_sys_conn[PASS_DBUS_MAX] = {NULL, }; static int dbus_name_owned; -int pass_gdbus_export_interface(passdbus idx, gpointer instance, +int gdbus_export_interface(passdbus idx, gpointer instance, const char *obj_path) { gboolean ret; @@ -53,14 +53,14 @@ int pass_gdbus_export_interface(passdbus idx, gpointer instance, return -1; } -static void pass_name_acquired_cb(GDBusConnection *connection, +static void name_acquired_cb(GDBusConnection *connection, const gchar *name, gpointer user_data) { if (++dbus_name_owned == PASS_DBUS_MAX) sd_notify(0, "READY=1"); } -int pass_gdbus_get_name(passdbus idx, const char *name) +int gdbus_get_name(passdbus idx, const char *name) { guint id; @@ -71,15 +71,15 @@ int pass_gdbus_get_name(passdbus idx, const char *name) id = g_bus_own_name_on_connection(g_dbus_sys_conn[idx], name, G_BUS_NAME_OWNER_FLAGS_NONE, - pass_name_acquired_cb, NULL, NULL, NULL); + name_acquired_cb, NULL, NULL, NULL); if (id == 0) return -ENOSYS; return 0; } -int pass_gdbus_connect_signal(gpointer instance, int num_signals, - struct pass_gdbus_signal_info *signal_infos) +int gdbus_connect_signal(gpointer instance, int num_signals, + struct gdbus_signal_info *signal_infos) { int i; unsigned long handler_id; @@ -108,8 +108,8 @@ out_err: return -EINVAL; } -void pass_gdbus_disconnect_signal(gpointer instance, int num_signals, - struct pass_gdbus_signal_info *signal_infos) +void gdbus_disconnect_signal(gpointer instance, int num_signals, + struct gdbus_signal_info *signal_infos) { int i; @@ -122,7 +122,7 @@ void pass_gdbus_disconnect_signal(gpointer instance, int num_signals, } } -int pass_gdbus_send_broadcast_signal(passdbus idx, char *path, +int gdbus_send_broadcast_signal(passdbus idx, char *path, char *interface, char *method, GVariant *arg) { GDBusMessage *message = NULL; @@ -173,37 +173,37 @@ static void put_instance(gpointer *instance) *instance = NULL; } -SystemPassCore *pass_gdbus_get_instance_core(void) +SystemPassCore *gdbus_get_instance_core(void) { return system_pass_core_skeleton_new(); } -void pass_gdbus_put_instance_core(SystemPassCore **instance) +void gdbus_put_instance_core(SystemPassCore **instance) { put_instance((gpointer *)instance); } -SystemPassPmqos *pass_gdbus_get_instance_pmqos(void) +SystemPassPmqos *gdbus_get_instance_pmqos(void) { return system_pass_pmqos_skeleton_new(); } -void pass_gdbus_put_instance_pmqos(SystemPassPmqos **instance) +void gdbus_put_instance_pmqos(SystemPassPmqos **instance) { put_instance((gpointer *)instance); } -SystemThermal *pass_gdbus_get_instance_thermal(void) +SystemThermal *gdbus_get_instance_thermal(void) { return system_thermal_skeleton_new(); } -void pass_gdbus_put_instance_thermal(SystemThermal **instance) +void gdbus_put_instance_thermal(SystemThermal **instance) { put_instance((gpointer *)instance); } -int pass_gdbus_get_system_connection(passdbus idx) +int gdbus_get_system_connection(passdbus idx) { GError *error = NULL; @@ -223,7 +223,7 @@ int pass_gdbus_get_system_connection(passdbus idx) return 0; } -void pass_gdbus_put_system_connection(passdbus idx) +void gdbus_put_system_connection(passdbus idx) { if (idx >= PASS_DBUS_MAX) { _E("Invalid DBUS connection: %d\n", idx); -- 2.7.4 From 4cc60f2bd05b4e8a32b1d6494d277adc0d0a3f5d Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Mon, 7 Feb 2022 21:41:36 +0900 Subject: [PATCH 03/16] util: resource: Remove unnecessary passing user_data parameter Change-Id: Ie867d19c667c3a7a273d31719161d74137d3cf84 Signed-off-by: Dongwoo Lee --- include/util/resource.h | 4 ++-- src/resource/resource-bus.c | 12 ++++++------ src/resource/resource-cpu.c | 16 ++++++++-------- src/resource/resource-gpu.c | 14 +++++++------- src/resource/resource-memory.c | 6 +++--- src/util/resource.c | 2 +- 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/include/util/resource.h b/include/util/resource.h index c4bd599..5c7fd8f 100644 --- a/include/util/resource.h +++ b/include/util/resource.h @@ -52,10 +52,10 @@ struct resource_attribute_value { struct resource_attribute_ops { int (*set)(const struct resource *res, const struct resource_attribute *attr, - const void *data, int count, void *user_data); + const void *data, int count); int (*get)(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data); + void **data); }; struct resource_attribute { diff --git a/src/resource/resource-bus.c b/src/resource/resource-bus.c index 826f209..f76f047 100644 --- a/src/resource/resource-bus.c +++ b/src/resource/resource-bus.c @@ -34,7 +34,7 @@ static int bus_get_cur_freq(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -52,7 +52,7 @@ static int bus_get_cur_freq(const struct resource *res, static int bus_get_min_freq(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -70,7 +70,7 @@ static int bus_get_min_freq(const struct resource *res, static int bus_get_max_freq(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -88,7 +88,7 @@ static int bus_get_max_freq(const struct resource *res, static int bus_get_available_min_freq(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -106,7 +106,7 @@ static int bus_get_available_min_freq(const struct resource *res, static int bus_get_available_max_freq(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -124,7 +124,7 @@ static int bus_get_available_max_freq(const struct resource *res, static int bus_get_curr_governor(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { char buf[BUFF_MAX]; int val; diff --git a/src/resource/resource-cpu.c b/src/resource/resource-cpu.c index de30d38..8d288f4 100644 --- a/src/resource/resource-cpu.c +++ b/src/resource/resource-cpu.c @@ -34,7 +34,7 @@ static int cpu_get_cur_freq(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -52,7 +52,7 @@ static int cpu_get_cur_freq(const struct resource *res, static int cpu_get_min_freq(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -70,7 +70,7 @@ static int cpu_get_min_freq(const struct resource *res, static int cpu_get_max_freq(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -88,7 +88,7 @@ static int cpu_get_max_freq(const struct resource *res, static int cpu_get_available_min_freq(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -106,7 +106,7 @@ static int cpu_get_available_min_freq(const struct resource *res, static int cpu_get_available_max_freq(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -124,7 +124,7 @@ static int cpu_get_available_max_freq(const struct resource *res, static int cpu_get_curr_governor(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { char buf[BUFF_MAX]; int val; @@ -145,14 +145,14 @@ static int cpu_get_curr_governor(const struct resource *res, static int cpu_get_online_cpu(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { return 0; } static int cpu_get_temperature(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { return 0; } diff --git a/src/resource/resource-gpu.c b/src/resource/resource-gpu.c index 87acc82..e7afa19 100644 --- a/src/resource/resource-gpu.c +++ b/src/resource/resource-gpu.c @@ -34,7 +34,7 @@ static int gpu_get_cur_freq(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -52,7 +52,7 @@ static int gpu_get_cur_freq(const struct resource *res, static int gpu_get_min_freq(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -70,7 +70,7 @@ static int gpu_get_min_freq(const struct resource *res, static int gpu_get_max_freq(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -88,7 +88,7 @@ static int gpu_get_max_freq(const struct resource *res, static int gpu_get_available_min_freq(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -106,7 +106,7 @@ static int gpu_get_available_min_freq(const struct resource *res, static int gpu_get_available_max_freq(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -124,7 +124,7 @@ static int gpu_get_available_max_freq(const struct resource *res, static int gpu_get_curr_governor(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { char buf[BUFF_MAX]; int val; @@ -145,7 +145,7 @@ static int gpu_get_curr_governor(const struct resource *res, static int gpu_get_temperature(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { return 0; } diff --git a/src/resource/resource-memory.c b/src/resource/resource-memory.c index 5d5742f..b4ef902 100644 --- a/src/resource/resource-memory.c +++ b/src/resource/resource-memory.c @@ -74,7 +74,7 @@ static inline int memory_read_val_from_proc_node(uint32_t val_id) static int memory_get_total_memory(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -92,7 +92,7 @@ static int memory_get_total_memory(const struct resource *res, static int memory_get_available_memory(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; @@ -110,7 +110,7 @@ static int memory_get_available_memory(const struct resource *res, static int memory_get_free_memory(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { int val; diff --git a/src/util/resource.c b/src/util/resource.c index f3f927e..7bc52a6 100644 --- a/src/util/resource.c +++ b/src/util/resource.c @@ -200,7 +200,7 @@ int update_resource_attr(struct resource *resource, u_int64_t attr_id) if (!attr->ops.get) return -EINVAL; - ret = attr->ops.get(resource, attr, &(attr_value->data), resource->user_data); + ret = attr->ops.get(resource, attr, &(attr_value->data)); if (ret < 0) return ret; -- 2.7.4 From 04c556f10ee88c1b1be7074dd74a22f335a7360e Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Mon, 7 Feb 2022 21:53:50 +0900 Subject: [PATCH 04/16] util: resource: Add init/exit ops for resource driver Change-Id: Ie71a2f7de493f198dc57d9daa0b939b3c9eb8e4b Signed-off-by: Dongwoo Lee --- include/util/resource.h | 7 +++++++ src/util/resource.c | 36 ++++++++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/include/util/resource.h b/include/util/resource.h index 5c7fd8f..107c194 100644 --- a/include/util/resource.h +++ b/include/util/resource.h @@ -65,11 +65,17 @@ struct resource_attribute { const struct resource_attribute_ops ops; }; +struct resource_driver_ops { + int (*init)(struct resource *res); + void (*exit)(struct resource *res); +}; + struct resource_driver { const char *name; const int type; const int num_attrs; const struct resource_attribute *attrs; + const struct resource_driver_ops ops; }; struct resource_device { @@ -88,6 +94,7 @@ struct resource { int type; int index; void *user_data; + void *priv; int num_attrs; const struct resource_attribute *attrs; diff --git a/src/util/resource.c b/src/util/resource.c index 7bc52a6..7895213 100644 --- a/src/util/resource.c +++ b/src/util/resource.c @@ -130,11 +130,8 @@ static const struct resource_driver *find_resource_driver(int resource_type) return (struct resource_driver *)node->data; } -void delete_resource(struct resource *resource) +static void do_delete_resource(struct resource *resource) { - if (!resource) - return; - if (!resource->name) free(resource->name); if (!resource->attrs_value) @@ -145,13 +142,32 @@ void delete_resource(struct resource *resource) free(resource); } +void delete_resource(struct resource *resource) +{ + const struct resource_driver *driver = NULL; + + if (!resource) + return; + + driver = find_resource_driver(resource->type); + if (!driver) { + _E("failed to find driver for resource type: %d\n", resource->type); + return; + } + + if (driver->ops.exit) + driver->ops.exit(resource); + + do_delete_resource(resource); +} + struct resource *create_resource(int resource_type, int resource_index, void *user_data) { const struct resource_device *device = NULL; const struct resource_driver *driver = NULL; struct resource *resource = NULL; - int i; + int i, ret; device = find_resource_device(resource_type, resource_index); if (!device) @@ -174,13 +190,21 @@ struct resource *create_resource(int resource_type, int resource_index, resource->attrs_value = calloc(resource->num_attrs, sizeof(*resource->attrs_value)); if (!resource->attrs_value) { - delete_resource(resource); + do_delete_resource(resource); return NULL; } for (i = 0; i < resource->num_attrs; i++) resource->attrs_value[i].type = driver->attrs[i].type; + if (driver->ops.init) { + ret = driver->ops.init(resource); + if (ret < 0) { + do_delete_resource(resource); + return NULL; + } + } + return resource; } -- 2.7.4 From 9a102555ff3fb4fe0b30c1eaaf3af082b246b525 Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Thu, 10 Feb 2022 13:06:19 +0900 Subject: [PATCH 05/16] util: common: Add BIT operation Change-Id: I6db6713364c702e16018bba092fbc39a344fd9d5 Signed-off-by: Dongwoo Lee --- include/util/common.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/util/common.h b/include/util/common.h index 40b75a3..263ceea 100644 --- a/include/util/common.h +++ b/include/util/common.h @@ -93,6 +93,12 @@ typedef unsigned long long uint64; #ifndef USEC_TO_MSEC #define USEC_TO_MSEC(x) ((double)x/1000) #endif +#ifndef BIT +#define BIT(x) (1ULL << x) +#endif +#ifndef BIT32 +#define BIT32(x) (1UL << x) +#endif #ifndef container_of #define container_of(ptr, type, member) ({ \ -- 2.7.4 From 7b559095361b683adf58cbca5299627049d42db9 Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Tue, 8 Feb 2022 19:38:52 +0900 Subject: [PATCH 06/16] util: resource: Bypass checking device for virtual device Change-Id: I07076a0549130d452d82e611011389bd58843d88 Signed-off-by: Dongwoo Lee --- include/util/resource.h | 4 ++++ src/util/resource.c | 25 ++++++++++++++++++------- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/include/util/resource.h b/include/util/resource.h index 107c194..c996f7d 100644 --- a/include/util/resource.h +++ b/include/util/resource.h @@ -70,9 +70,13 @@ struct resource_driver_ops { void (*exit)(struct resource *res); }; +/* resource driver flags */ +#define RESOURCE_DRIVER_NO_DEVICE BIT32(1) + struct resource_driver { const char *name; const int type; + const int flags; const int num_attrs; const struct resource_attribute *attrs; const struct resource_driver_ops ops; diff --git a/src/util/resource.c b/src/util/resource.c index 7895213..c71c10b 100644 --- a/src/util/resource.c +++ b/src/util/resource.c @@ -169,21 +169,32 @@ struct resource *create_resource(int resource_type, int resource_index, struct resource *resource = NULL; int i, ret; - device = find_resource_device(resource_type, resource_index); - if (!device) - return NULL; - driver = find_resource_driver(resource_type); if (!driver) return NULL; + if (!(driver->flags & RESOURCE_DRIVER_NO_DEVICE)) { + device = find_resource_device(resource_type, resource_index); + if (!device) { + _E("Not available resource: type: %d, index: %d\n", + resource_type, resource_index); + return NULL; + } + } + resource = calloc(1, sizeof(*resource)); if (!resource) return NULL; - resource->type = device->type; - resource->name = g_strdup(device->name); - resource->index = device->index; + if (device) { + resource->type = device->type; + resource->name = g_strdup(device->name); + resource->index = device->index; + } else { + resource->type = resource_type; + resource->name = g_strdup(driver->name); + resource->index = resource_index; + } resource->user_data = user_data; resource->num_attrs = driver->num_attrs; resource->attrs = driver->attrs; -- 2.7.4 From cc6617bc6f29e5c3463c4b4cd0fe95e10f9130e6 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Tue, 8 Feb 2022 19:22:29 +0900 Subject: [PATCH 07/16] resource: Add display resource driver The resource-display.c provides the display information like FPS (Frame Per Second) as the display resource driver. This version supportsthe only DISPLAY_FPS attribute. Change-Id: I105fb0d463e4ce55cff48ddf291f642ea5ca723d Signed-off-by: Chanwoo Choi --- CMakeLists.txt | 1 + lib/tmonitor/tmonitor.h | 3 + src/resource/resource-display.c | 135 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 src/resource/resource-display.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b0d426..f30a5eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,7 @@ SET(SRCS src/resource/resource-bus.c src/resource/resource-gpu.c src/resource/resource-memory.c + src/resource/resource-display.c src/monitor/monitor.c src/monitor/monitor-thread.c src/monitor/monitor-command.c diff --git a/lib/tmonitor/tmonitor.h b/lib/tmonitor/tmonitor.h index 344ae45..59853b4 100644 --- a/lib/tmonitor/tmonitor.h +++ b/lib/tmonitor/tmonitor.h @@ -35,6 +35,7 @@ extern "C" { #define RESOURCE_TYPE_MEMORY 4 #define RESOURCE_TYPE_BATTERY 5 #define RESOURCE_TYPE_PROCESS 6 +#define RESOURCE_TYPE_DISPLAY 7 #define RESOURCE_TYPE_NONSTANDARD 99 /** @@ -73,6 +74,8 @@ extern "C" { #define BATTERY_CHARGING_STATUS BIT(1) #define BATTERY_TEMPERATURE BIT(2) +#define DISPLAY_FPS BIT(0) + /** * @brief Initialize the tizen monitor * @param[in] Timer period (unit: millisecond, minimum value is 100ms) diff --git a/src/resource/resource-display.c b/src/resource/resource-display.c new file mode 100644 index 0000000..d1a8e08 --- /dev/null +++ b/src/resource/resource-display.c @@ -0,0 +1,135 @@ +/* + * PASS (Power Aware System Service) - Display Resource Driver + * + * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file resource-display.c + * @brief TBD + * @ingroup TBD + */ + +#include + +#include + +#include +#include +#include +#include + +#include + +#define DBUS_ENLIGHTENMENT_NAME "org.enlightenment.wm" +#define DBUS_ENLIGHTENMENT_PATH "/org/enlightenment/wm" +#define DBUS_ENLIGHTENMENT_INTERFACE "org.enlightenment.wm.info" +#define DBUS_ENLIGHTENMENT_FPS_FUNC "get_fps_info" + +struct display_fps_data { + unsigned int type; + char output[128]; + int zpos; + unsigned int window; + double fps; +}; + +static int display_get_fps(const struct resource *res, + const struct resource_attribute *attr, + void **data, void *user_data) +{ + GDBusConnection *conn; + GDBusMessage *msg, *reply; + GVariant *result, *value; + GError *err = NULL; + struct display_fps_data fps_data; + int ret = 0; + + if (!res || !attr || !data) + return -EINVAL; + + /* Connect dbus interface and receive message */ + conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err); + if (err) { + g_clear_error(&err); + return -EINVAL; + } + + msg = g_dbus_message_new_method_call(DBUS_ENLIGHTENMENT_NAME, + DBUS_ENLIGHTENMENT_PATH, + DBUS_ENLIGHTENMENT_INTERFACE, + DBUS_ENLIGHTENMENT_FPS_FUNC); + if (!msg) { + ret = -EINVAL; + goto err_conn; + } + + reply = g_dbus_connection_send_message_with_reply_sync(conn, msg, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, + G_MAXINT, NULL, NULL, &err); + if (err) { + g_clear_error(&err); + ret = -EINVAL; + goto err_msg; + } + + if (g_dbus_message_get_message_type(reply) == G_DBUS_MESSAGE_TYPE_ERROR) { + ret = -EINVAL; + goto err_reply; + } + + /* Parse the received data */ + result = g_variant_get_child_value(g_dbus_message_get_body(reply), 0); + if (g_variant_n_children(result) <= res->index) { + ret = -EINVAL; + goto err_reply; + } + + /* Get the fps information according to the index of resource_device */ + value = g_variant_get_child_value(result, res->index); + g_variant_get(value, "(usiud)", + &fps_data.type, fps_data.output, &fps_data.zpos, + &fps_data.window, &fps_data.fps); + + *data = (void *)(intptr_t)fps_data.fps; + +err_reply: + g_object_unref(reply); +err_msg: + g_object_unref(msg); +err_conn: + g_dbus_connection_flush(conn, NULL, NULL, NULL); + + return ret; +} + +static const struct resource_attribute display_attrs[] = { + { + .name = "DISPLAY_FPS", + .id = DISPLAY_FPS, + .type = DATA_TYPE_DOUBLE, + .ops = { + .get = display_get_fps, + }, + }, +}; + +static const struct resource_driver display_resource_driver = { + .name = "DISPLAY", + .type = RESOURCE_TYPE_DISPLAY, + .attrs = display_attrs, + .num_attrs = ARRAY_SIZE(display_attrs), +}; +RESOURCE_DRIVER_REGISTER(&display_resource_driver) -- 2.7.4 From 528016a4f59bfbb211abc4143b9eefa741918f2f Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Thu, 10 Feb 2022 17:14:48 +0900 Subject: [PATCH 08/16] resource: display: Fix build error Change-Id: I643f110698f1f623cf4a6478c03cb64306781abf Fixes: cc6617bc6f29 ("resource: Add display resource driver") Signed-off-by: Chanwoo Choi --- src/resource/resource-display.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resource/resource-display.c b/src/resource/resource-display.c index d1a8e08..7434721 100644 --- a/src/resource/resource-display.c +++ b/src/resource/resource-display.c @@ -48,7 +48,7 @@ struct display_fps_data { static int display_get_fps(const struct resource *res, const struct resource_attribute *attr, - void **data, void *user_data) + void **data) { GDBusConnection *conn; GDBusMessage *msg, *reply; -- 2.7.4 From bb6dab4b977e3e22fd32b82205118b2209e2af4b Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Thu, 10 Feb 2022 20:42:14 +0900 Subject: [PATCH 09/16] util: resource: Make resource has its own driver Change-Id: I5355dd10289ecd51546b7db26ee769439c17a734 Signed-off-by: Dongwoo Lee --- include/util/resource.h | 1 + src/util/resource.c | 13 +++---------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/include/util/resource.h b/include/util/resource.h index c996f7d..f6a18f9 100644 --- a/include/util/resource.h +++ b/include/util/resource.h @@ -95,6 +95,7 @@ struct resource_device { struct resource { char *name; + const struct resource_driver *driver; int type; int index; void *user_data; diff --git a/src/util/resource.c b/src/util/resource.c index c71c10b..25def15 100644 --- a/src/util/resource.c +++ b/src/util/resource.c @@ -144,19 +144,11 @@ static void do_delete_resource(struct resource *resource) void delete_resource(struct resource *resource) { - const struct resource_driver *driver = NULL; - if (!resource) return; - driver = find_resource_driver(resource->type); - if (!driver) { - _E("failed to find driver for resource type: %d\n", resource->type); - return; - } - - if (driver->ops.exit) - driver->ops.exit(resource); + if (resource->driver && resource->driver->ops.exit) + resource->driver->ops.exit(resource); do_delete_resource(resource); } @@ -195,6 +187,7 @@ struct resource *create_resource(int resource_type, int resource_index, resource->name = g_strdup(driver->name); resource->index = resource_index; } + resource->driver = driver; resource->user_data = user_data; resource->num_attrs = driver->num_attrs; resource->attrs = driver->attrs; -- 2.7.4 From a98c15a73ad1df30d4c89f8198cb384c588728a3 Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Thu, 10 Feb 2022 21:00:11 +0900 Subject: [PATCH 10/16] util: resource: Add preprocessing before updating attributes There are resource information to be shared between attributes, so as to support these resources this introduces prepare_update(), the new driver operation called before update_resource_attrs() automatically. In order to prevent updating each resource individually, removes get_resource_attr_*_sync() functions and prohibits calling update_resource_attr() soley. Change-Id: Id3c0b19c6b4a78a6c7a018d8ead7d95f2cd8f4f1 Signed-off-by: Dongwoo Lee --- include/util/resource.h | 14 +++++------ src/util/resource.c | 64 ++++++------------------------------------------- 2 files changed, 13 insertions(+), 65 deletions(-) diff --git a/include/util/resource.h b/include/util/resource.h index f6a18f9..ac0fe6b 100644 --- a/include/util/resource.h +++ b/include/util/resource.h @@ -68,6 +68,11 @@ struct resource_attribute { struct resource_driver_ops { int (*init)(struct resource *res); void (*exit)(struct resource *res); + /* + * If prepare_update is specified, it will be called + * at every update_resource_attrs(). + */ + int (*prepare_update)(struct resource *res); }; /* resource driver flags */ @@ -132,24 +137,17 @@ struct resource *create_resource(int resource_type, int resource_index, void *us void delete_resource(struct resource *resource); /* Handle resource attribute */ -int update_resource_attr(struct resource *resource, u_int64_t attr_id); int update_resource_attrs(struct resource *resource); const struct resource_attribute *get_resource_attr(struct resource *resource, u_int64_t attr_id); struct resource_attribute_value * get_resource_attr_value(struct resource *resource, u_int64_t attr_id); int get_resource_attr_integer(struct resource *resource, u_int64_t attr_id, int *data); -int get_resource_attr_integer_sync(struct resource *resource, u_int64_t attr_id, int *data); int get_resource_attr_double(struct resource *resource, u_int64_t attr_id, double *data); -int get_resource_attr_double_sync(struct resource *resource, u_int64_t attr_id, double *data); int get_resource_attr_string(struct resource *resource, u_int64_t attr_id, char **data); -int get_resource_attr_string_sync(struct resource *resource, u_int64_t attr_id, char **data); -int get_resource_attr_ptr(struct resource *resource, u_int64_t attr_id, void **data); -int get_resource_attr_ptr_sync(struct resource *resource, u_int64_t attr_id, void **data); int get_resource_attr_array(struct resource *resource, u_int64_t attr_id, struct array_value **data); -int get_resource_attr_array_sync(struct resource *resource, u_int64_t attr_id, - struct array_value **data); +int get_resource_attr_ptr(struct resource *resource, u_int64_t attr_id, void **data); void set_resource_attr_interest(struct resource *resource, u_int64_t interest_mask); void unset_resource_attr_interest(struct resource *resource, u_int64_t interest_mask); diff --git a/src/util/resource.c b/src/util/resource.c index 25def15..4910742 100644 --- a/src/util/resource.c +++ b/src/util/resource.c @@ -212,7 +212,7 @@ struct resource *create_resource(int resource_type, int resource_index, return resource; } -int update_resource_attr(struct resource *resource, u_int64_t attr_id) +static int update_resource_attr(struct resource *resource, u_int64_t attr_id) { int attr_index = RESOURCE_ATTR_INDEX(attr_id); const struct resource_attribute *attr = NULL; @@ -242,6 +242,12 @@ int update_resource_attrs(struct resource *resource) if (!resource || !resource->type) return -EINVAL; + if (resource->driver && resource->driver->ops.prepare_update) { + ret = resource->driver->ops.prepare_update(resource); + if (ret < 0) + return ret; + } + for (i = 0; i < resource->num_attrs; i++) { if (!(resource->attrs[i].id & resource->attr_interest)) continue; @@ -305,17 +311,6 @@ int get_resource_attr_integer(struct resource *resource, u_int64_t attr_id, int return 0; } -int get_resource_attr_integer_sync(struct resource *resource, u_int64_t attr_id, int *data) -{ - int ret; - - ret = update_resource_attr(resource, attr_id); - if (ret < 0) - return ret; - - return get_resource_attr_integer(resource, attr_id, data); -} - int get_resource_attr_double(struct resource *resource, u_int64_t attr_id, double *data) { struct resource_attribute_value *attr_value = NULL; @@ -332,17 +327,6 @@ int get_resource_attr_double(struct resource *resource, u_int64_t attr_id, doubl return 0; } -int get_resource_attr_double_sync(struct resource *resource, u_int64_t attr_id, double *data) -{ - int ret; - - ret = update_resource_attr(resource, attr_id); - if (ret < 0) - return ret; - - return get_resource_attr_double(resource, attr_id, data); -} - int get_resource_attr_string(struct resource *resource, u_int64_t attr_id, char **data) { struct resource_attribute_value *attr_value = NULL; @@ -376,17 +360,6 @@ int put_resource_attr_string(struct resource *resource, u_int64_t attr_id) return 0; } -int get_resource_attr_string_sync(struct resource *resource, u_int64_t attr_id, char **data) -{ - int ret; - - ret = update_resource_attr(resource, attr_id); - if (ret < 0) - return ret; - - return get_resource_attr_string(resource, attr_id, data); -} - int get_resource_attr_array(struct resource *resource, u_int64_t attr_id, struct array_value **data) { struct resource_attribute_value *attr_value = NULL; @@ -420,18 +393,6 @@ int put_resource_attr_array(struct resource *resource, u_int64_t attr_id) return 0; } -int get_resource_attr_array_sync(struct resource *resource, u_int64_t attr_id, - struct array_value **data) -{ - int ret; - - ret = update_resource_attr(resource, attr_id); - if (ret < 0) - return ret; - - return get_resource_attr_array(resource, attr_id, data); -} - int get_resource_attr_ptr(struct resource *resource, u_int64_t attr_id, void **data) { struct resource_attribute_value *attr_value = NULL; @@ -465,17 +426,6 @@ int put_resource_attr_ptr(struct resource *resource, u_int64_t attr_id) return 0; } -int get_resource_attr_ptr_sync(struct resource *resource, u_int64_t attr_id, void **data) -{ - int ret; - - ret = update_resource_attr(resource, attr_id); - if (ret < 0) - return ret; - - return get_resource_attr_ptr(resource, attr_id, data); -} - void set_resource_attr_interest(struct resource *resource, u_int64_t interest_mask) { resource->attr_interest |= interest_mask; -- 2.7.4 From 9ae5ef8bf6b561c9dd6b5a05367b8f9a64ee0973 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Thu, 10 Feb 2022 19:13:48 +0900 Subject: [PATCH 11/16] resource: display: Fix error when get_fps_info return null When enlightenment doesn't draw the anything, get_fps_info of enlightenment doesn't return the fps information with null. DISPLAY_FPS returns the 0.0 for handling this case. And add RESOURCE_DRIVER_NO_DEVICE flag to display resource driver. Change-Id: I4087e97f49231ab45bd1ce88a17a0cca5baf3441 Signed-off-by: Chanwoo Choi --- src/resource/resource-display.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/resource/resource-display.c b/src/resource/resource-display.c index 7434721..7210af2 100644 --- a/src/resource/resource-display.c +++ b/src/resource/resource-display.c @@ -93,8 +93,8 @@ static int display_get_fps(const struct resource *res, /* Parse the received data */ result = g_variant_get_child_value(g_dbus_message_get_body(reply), 0); if (g_variant_n_children(result) <= res->index) { - ret = -EINVAL; - goto err_reply; + fps_data.fps = 0.0; + goto out; } /* Get the fps information according to the index of resource_device */ @@ -103,6 +103,7 @@ static int display_get_fps(const struct resource *res, &fps_data.type, fps_data.output, &fps_data.zpos, &fps_data.window, &fps_data.fps); +out: *data = (void *)(intptr_t)fps_data.fps; err_reply: @@ -131,5 +132,6 @@ static const struct resource_driver display_resource_driver = { .type = RESOURCE_TYPE_DISPLAY, .attrs = display_attrs, .num_attrs = ARRAY_SIZE(display_attrs), + .flags = RESOURCE_DRIVER_NO_DEVICE, }; RESOURCE_DRIVER_REGISTER(&display_resource_driver) -- 2.7.4 From 2823015ade4be4a7acbdd148d13052ae13047566 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Fri, 11 Feb 2022 11:16:24 +0900 Subject: [PATCH 12/16] util: resouce: Print attribute name when upate fail Change-Id: I63524d282d7083663b580dea7edbd81b57b7e8b3 Signed-off-by: Chanwoo Choi --- src/util/resource.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/util/resource.c b/src/util/resource.c index 4910742..cc11120 100644 --- a/src/util/resource.c +++ b/src/util/resource.c @@ -253,7 +253,8 @@ int update_resource_attrs(struct resource *resource) continue; ret = update_resource_attr(resource, resource->attrs[i].id); if (ret < 0) { - _E("failed to update resource attr\n"); + _E("failed to update resource attr (%s)\n", + resource->attrs[i].name); } } -- 2.7.4 From d9f2fd24a3ddd7e994df1418ccb2a0895c9aaf5e Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Wed, 16 Feb 2022 12:40:42 +0900 Subject: [PATCH 13/16] util: kernel: Add kernel helper funtion to get number of cpu include/util/kernel.h provides helper function to get the information from standardy linux kernel interface. This version provdies the function to get the number of online/possible cpu. Change-Id: I4c5ae5d73e3250b141e5aea69231b6e850790a25 Signed-off-by: Dongwoo Lee Signed-off-by: Chanwoo Choi --- CMakeLists.txt | 1 + include/util/kernel.h | 28 ++++++++++++++++++++++ src/util/kernel.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 include/util/kernel.h create mode 100644 src/util/kernel.c diff --git a/CMakeLists.txt b/CMakeLists.txt index f30a5eb..747f2f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,7 @@ SET(SRCS src/util/timer.c src/util/thread.c src/util/queue.c + src/util/kernel.c src/main.c #Generated by a custom command 'gdbus-codegen' below src/pass/pass-dbus-stub.c diff --git a/include/util/kernel.h b/include/util/kernel.h new file mode 100644 index 0000000..08d776d --- /dev/null +++ b/include/util/kernel.h @@ -0,0 +1,28 @@ +/* + * PASS + * + * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __KERNEL_H__ +#define __KERNEL_H__ + +#include +#include "common.h" + +int kernel_get_online_cpu_num(void); +int kernel_get_possible_cpu_num(void); + +#endif diff --git a/src/util/kernel.c b/src/util/kernel.c new file mode 100644 index 0000000..37fce1b --- /dev/null +++ b/src/util/kernel.c @@ -0,0 +1,65 @@ +/* + * PASS (Power Aware System Service) + * + * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include +#include +#include + +static int __get_cpu_num(char *path) +{ + FILE *fp; + char buf[BUFF_MAX]; + char *range, *pbuf = buf; + int ncpu = 0; + + fp = fopen(path, "r"); + if (!fp) + return -EIO; + + if (!fgets(buf, BUFF_MAX, fp)) { + fclose(fp); + return -EINVAL; + } + + while((range = strsep(&pbuf, ",")) != NULL) { + if(strchr(range, '-')) { + int rmin, rmax; + + sscanf(range, "%d-%d", &rmin, &rmax); + ncpu += (rmax - rmin + 1); + } else { + ncpu++; + } + } + fclose(fp); + + return ncpu; +} + +int kernel_get_online_cpu_num(void) +{ + return __get_cpu_num("/sys/devices/system/cpu/online"); +} + +int kernel_get_possible_cpu_num(void) +{ + return __get_cpu_num("/sys/devices/system/cpu/possible"); +} -- 2.7.4 From 0ab5562bf286bf1862c747e5a1c660d270db7886 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Wed, 16 Feb 2022 16:51:54 +0900 Subject: [PATCH 14/16] util: kernel: Add cpu utilization helper function Add cpu utilization helper function as following: [Detailed description of cpu utilization helper function] int kernel_get_avg_cpu_util(struct cpu_util_data *avg_cpu) : Store the average cpu utilization of all cpus to 'avg_cpu' int kernel_get_per_cpu_util(struct cpu_util_data *cpus, int num_possible_cpus, int *num_online_cpus); : Store the per-cpu utilization datas to 'cpus' and store the number of online to 'num_online_cpus' Change-Id: I1594dc656759194ffa9468ed6eebbc159a47e5fd Signed-off-by: Chanwoo Choi --- include/util/kernel.h | 15 ++++++++ src/util/kernel.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+) diff --git a/include/util/kernel.h b/include/util/kernel.h index 08d776d..ad76c83 100644 --- a/include/util/kernel.h +++ b/include/util/kernel.h @@ -22,7 +22,22 @@ #include #include "common.h" +struct cpu_stat { + char name[10]; + unsigned int cpu; + int64_t user; + int64_t system; + int64_t nice; + int64_t idle; + int64_t wait; + int64_t hard_irq; + int64_t soft_irq; +}; + int kernel_get_online_cpu_num(void); int kernel_get_possible_cpu_num(void); +int kernel_get_total_cpu_stat(struct cpu_stat *total); +int kernel_get_per_cpu_stat(struct cpu_stat *cpus, int num_possible_cpus, + int *num_online_cpus); #endif diff --git a/src/util/kernel.c b/src/util/kernel.c index 37fce1b..490432f 100644 --- a/src/util/kernel.c +++ b/src/util/kernel.c @@ -54,6 +54,50 @@ static int __get_cpu_num(char *path) return ncpu; } +static int __get_cpu_stat(FILE *fp, struct cpu_stat *data) +{ + int ret; + + if (!fp || !data) + return -EINVAL; + + ret = fscanf(fp, "%s %"PRId64" %"PRId64" %"PRId64" %"PRId64" \ + %"PRId64" %"PRId64" %"PRId64" %*s %*s %*s", + data->name, + &data->user, + &data->system, + &data->nice, + &data->idle, + &data->wait, + &data->hard_irq, + &data->soft_irq); + if (ret < 8) { + ret = -EINVAL; + goto err; + } + + if (strncmp(data->name, "cpu", 3)) { + /* In case of not 'cpu*' string */ + ret = -EINVAL; + goto err; + } else if (strlen(data->name) > 3) { + /* In case of 'cpu%u' string */ + ret = sscanf(data->name, "cpu%4u", &data->cpu); + if (ret < 1) { + ret = -EINVAL; + goto err; + } + } else { + /* In case of 'cpu' string */ + data->cpu = -1; + } + + return 0; +err: + memset(data, 0, sizeof(struct cpu_stat)); + return ret; +} + int kernel_get_online_cpu_num(void) { return __get_cpu_num("/sys/devices/system/cpu/online"); @@ -63,3 +107,60 @@ int kernel_get_possible_cpu_num(void) { return __get_cpu_num("/sys/devices/system/cpu/possible"); } + +int kernel_get_total_cpu_stat(struct cpu_stat *total) +{ + FILE *fp; + int ret; + + if (!total) + return -EINVAL; + + fp = fopen("/proc/stat", "r"); + if (!fp) + return -EINVAL; + + ret = __get_cpu_stat(fp, total); + if (ret < 0) + ret = -EINVAL; + fclose(fp); + + return ret; +} + +int kernel_get_per_cpu_stat(struct cpu_stat *cpus, int num_possible_cpus, + int *num_online_cpus) +{ + FILE *fp; + char buf[BUFF_MAX]; + int i, ret = 0, count = 0; + + if (!cpus) + return -EINVAL; + + *num_online_cpus = 0; + + fp = fopen("/proc/stat", "r"); + if (!fp) + return -EINVAL; + + /* Skip the first line of total cpu utilizaiton. */ + if (!fgets(buf, BUFF_MAX, fp)) { + ret = -EINVAL; + goto err; + } + + /* Get per-cpu utilization data */ + for (i = 0; i < num_possible_cpus; i++) { + ret = __get_cpu_stat(fp, &cpus[i]); + if (ret < 0) + break; + count++; + } + *num_online_cpus = count; + +err: + fclose(fp); + + return ret; +} -- 2.7.4 From befc5ad31347047ec06f28df475026c03143df80 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Thu, 17 Feb 2022 11:07:24 +0900 Subject: [PATCH 15/16] util: resouce: Add missing function declaration of put functions Change-Id: I5f31f0727b1b61f54161e2d0814f97a85e7043a3 Signed-off-by: Chanwoo Choi --- include/util/resource.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/util/resource.h b/include/util/resource.h index ac0fe6b..00da7f5 100644 --- a/include/util/resource.h +++ b/include/util/resource.h @@ -145,9 +145,12 @@ get_resource_attr_value(struct resource *resource, u_int64_t attr_id); int get_resource_attr_integer(struct resource *resource, u_int64_t attr_id, int *data); int get_resource_attr_double(struct resource *resource, u_int64_t attr_id, double *data); int get_resource_attr_string(struct resource *resource, u_int64_t attr_id, char **data); +int put_resource_attr_string(struct resource *resource, u_int64_t attr_id); int get_resource_attr_array(struct resource *resource, u_int64_t attr_id, struct array_value **data); +int put_resource_attr_array(struct resource *resource, u_int64_t attr_id); int get_resource_attr_ptr(struct resource *resource, u_int64_t attr_id, void **data); +int put_resource_attr_ptr(struct resource *resource, u_int64_t attr_id); void set_resource_attr_interest(struct resource *resource, u_int64_t interest_mask); void unset_resource_attr_interest(struct resource *resource, u_int64_t interest_mask); -- 2.7.4 From f0e75e332db982d3e1755074588c2142b18d8644 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Thu, 17 Feb 2022 12:11:01 +0900 Subject: [PATCH 16/16] util: resource: Add missing free operation for put_resource_attr_array Change-Id: I65f3eef225cc8601b52f99c987c70ce3209f14ea Signed-off-by: Chanwoo Choi --- src/util/resource.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/util/resource.c b/src/util/resource.c index cc11120..087f3c3 100644 --- a/src/util/resource.c +++ b/src/util/resource.c @@ -380,6 +380,7 @@ int get_resource_attr_array(struct resource *resource, u_int64_t attr_id, struct int put_resource_attr_array(struct resource *resource, u_int64_t attr_id) { struct resource_attribute_value *attr_value = NULL; + struct array_value *array; if (!check_attr_validate(resource, attr_id, DATA_TYPE_ARRAY)) return -EINVAL; @@ -388,6 +389,13 @@ int put_resource_attr_array(struct resource *resource, u_int64_t attr_id) if (!attr_value || !attr_value->data) return -EINVAL; + array = (struct array_value *)attr_value->data; + if (array) { + array->type = 0; + array->length = 0; + free(array->data); + array->data = NULL; + } free(attr_value->data); attr_value->data = NULL; -- 2.7.4