halcc: Add cache not to open() file multiple times on a same module 50/313450/1
authorYoungjae Cho <y0.cho@samsung.com>
Tue, 25 Jun 2024 09:53:03 +0000 (18:53 +0900)
committerYoungjae Cho <y0.cho@samsung.com>
Wed, 26 Jun 2024 03:31:23 +0000 (12:31 +0900)
Change-Id: I623b0a7fd0fb223750aa24ea1737a2c7c2fe0a66
Signed-off-by: Youngjae Cho <y0.cho@samsung.com>
src/hal-api-compatibility-checker.c
src/hal-api-compatibility-checker.h
tests/unittest/test-hal-compatibility-checker.cc

index 26f63e3a7c3a0aad39dcc8fedd2d4acfa575fb69..e4c2bfc8954a16c1b6fbe884223f70f8399bbd2c 100644 (file)
@@ -47,6 +47,7 @@ struct compatibility_info {
        int num_version_list;
        enum hal_common_backend_compatibility compatibility;
 };
+static struct compatibility_info g_compatibility_info[HAL_MODULE_END];
 
 static const char *compatibility_result_path = HAL_CC_DEFAULT_COMPATIBILITY_RESULT_PATH;
 
@@ -63,6 +64,11 @@ void unset_compatibility_result_path(void)
        compatibility_result_path = HAL_CC_DEFAULT_COMPATIBILITY_RESULT_PATH;
 }
 
+void reset_compatibility_info(void)
+{
+       memset(g_compatibility_info, 0, sizeof(g_compatibility_info));
+}
+
 static int get_module_by_name(const char *name, enum hal_module *module)
 {
        int ret;
@@ -421,6 +427,11 @@ static int load_module_compatibility_info(enum hal_module module,
        if (!info)
                return -EINVAL;
 
+       if (g_compatibility_info[module].initialized) {
+               *info = g_compatibility_info[module];
+               return 0;
+       }
+
        fd = open(compatibility_result_path, O_RDONLY, 0);
        if (fd == -1)
                return -errno;
@@ -438,6 +449,8 @@ static int load_module_compatibility_info(enum hal_module module,
        if (!info->initialized)
                return -ENODATA;
 
+       memcpy(&g_compatibility_info[module], info, sizeof(struct compatibility_info));
+
        return 0;
 }
 
@@ -496,6 +509,7 @@ static int load_module_compatibility_info_fallback(enum hal_module module,
                if (!infos[index].initialized)
                        continue;
                write_module_comaptibility_info(index, &infos[index]);
+               memcpy(&g_compatibility_info[module], &infos[index], sizeof(struct compatibility_info));
        }
 
        return 0;
index 4c897a75a877a3fedf3f661342b460d953397f3a..fe9ee641a4599d63dd93a57d954a5c4d27d2f9d4 100644 (file)
@@ -36,6 +36,7 @@ void set_compatibility_manifest_directory(const char *path);
 void unset_compatibility_manifest_directory(void);
 void set_compatibility_result_path(const char *path);
 void unset_compatibility_result_path(void);
+void reset_compatibility_info(void);
 
 #ifdef __cplusplus
 }
index be921b9ccdbb35613184dc1aa3562f77687e9f67..c944db3f2b5fd36492b4aa2970462f2584d02cfc 100644 (file)
@@ -274,6 +274,7 @@ TEST_F(HalccObjectTest, hal_create_result_file_success)
 
        unlink(g_compatibility_result_path);
        unset_compatibility_result_path();
+       reset_compatibility_info();
        unsetenv("SYSTEMD_SCOPE");
 }
 
@@ -291,6 +292,7 @@ TEST_F(HalccObjectTest, hal_create_result_file_fail)
        ASSERT_EQ(ret, -1);
 
        unset_compatibility_result_path();
+       reset_compatibility_info();
 }
 
 TEST_F(HalccObjectTest, hal_check_compatibility_on_generator_context)
@@ -323,6 +325,7 @@ TEST_F(HalccObjectTest, hal_check_compatibility_on_generator_context)
 
        unlink(g_compatibility_result_path);
        unset_compatibility_result_path();
+       reset_compatibility_info();
        unsetenv("SYSTEMD_SCOPE");
 }
 
@@ -443,6 +446,7 @@ TEST_F(HalccObjectTest, hal_get_backend_without_generator_without_result_file)
 
        mock_hal_backend_data_unset_version(HAL_MODULE_DEVICE_DISPLAY);
        unset_compatibility_result_path();
+       reset_compatibility_info();
 }
 
 TEST_F(HalccObjectTest, hal_get_backend_with_generator_without_result_file)
@@ -518,6 +522,7 @@ TEST_F(HalccObjectTest, hal_get_manifest_version_success_with_result_file)
 
        unlink(g_compatibility_result_path);
        unset_compatibility_result_path();
+       reset_compatibility_info();
        unsetenv("SYSTEMD_SCOPE");
 }
 
@@ -542,4 +547,6 @@ TEST_F(HalccObjectTest, hal_get_manifest_version_success_without_result_file)
 
        free(vi.minor_versions);
        vi.minor_versions = NULL;
+
+       reset_compatibility_info();
 }