From ac4f60421a824f1e42a3acc2930772dba4e49c46 Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Fri, 19 Aug 2022 16:30:29 +0900 Subject: [PATCH] resource: Initialize all resource drivers at start up Instead of initalizing common or permanent data for resource drivers at creation, now all initialization will be done at start up once. Change-Id: Idf673d3997c3567b572bcc9ea6dae5e887a0d3f3 Signed-off-by: Dongwoo Lee --- include/util/resource.h | 3 +++ src/monitor/monitor.c | 3 +++ src/util/resource.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/include/util/resource.h b/include/util/resource.h index d47db5a..19a08ab 100644 --- a/include/util/resource.h +++ b/include/util/resource.h @@ -195,6 +195,9 @@ void init_resource_id(void); int set_resource_privdata(struct resource *resource, void *priv); +void init_resource_drivers(void); +void exit_resource_drivers(void); + inline __attribute__((always_inline)) int64_t get_time_now(void) { struct timeval tv; diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c index 3e1787f..dd0e818 100644 --- a/src/monitor/monitor.c +++ b/src/monitor/monitor.c @@ -34,6 +34,8 @@ static int monitor_setup(void *data, void *user_data) { int ret; + init_resource_drivers(); + ret = request_server_init(); if (ret < 0) { _E("failed to initialize request server\n"); @@ -59,6 +61,7 @@ static void monitor_exit(void *data) { monitor_thread_exit(&g_monitor); request_server_exit(); + exit_resource_drivers(); unregister_notifier(DEVICE_NOTIFIER_INIT_DONE, monitor_setup, NULL); } diff --git a/src/util/resource.c b/src/util/resource.c index 02e5ff9..3e7b828 100644 --- a/src/util/resource.c +++ b/src/util/resource.c @@ -1138,3 +1138,34 @@ int set_resource_privdata(struct resource *resource, void *priv) return 0; } + +void init_resource_drivers(void) +{ + struct resource_driver *driver; + int i, ret = 0; + + for (i = 0; i < g_list_length(g_resource_driver_head); i++) { + driver = g_list_nth(g_list_first(g_resource_driver_head), i)->data; + + if (driver->ops.init) { + ret = driver->ops.init(); + if (ret < 0) { + _D("failed to init resource driver: %s\n", driver->name); + remove_resource_driver(driver); + } + } + } +} + +void exit_resource_drivers(void) +{ + const struct resource_driver *driver; + int i; + + for (i = 0; i < g_list_length(g_resource_driver_head); i++) { + driver = g_list_nth(g_list_first(g_resource_driver_head), i)->data; + + if (driver->ops.exit) + driver->ops.exit(); + } +} -- 2.7.4