diff --git a/services/accesstokenmanager/main/cpp/include/database/rdb_dlopen_manager.h b/services/accesstokenmanager/main/cpp/include/database/rdb_dlopen_manager.h index c5b9fd3a28f326e18648ea84b206fb3d1e647c2f..6f8cc0a82bf164b9729a55c90a05c52c323d8ec5 100644 --- a/services/accesstokenmanager/main/cpp/include/database/rdb_dlopen_manager.h +++ b/services/accesstokenmanager/main/cpp/include/database/rdb_dlopen_manager.h @@ -66,6 +66,7 @@ private: std::mutex handleMutex_; void* handle_ = nullptr; AccessTokenDbLoaderInterface* instance_ = nullptr; + std::atomic_int32_t taskNum_ = 0; }; } // namespace AccessToken } // namespace Security diff --git a/services/accesstokenmanager/main/cpp/src/database/rdb_dlopen_manager.cpp b/services/accesstokenmanager/main/cpp/src/database/rdb_dlopen_manager.cpp index 575f7e37a1b8568fcae12ba08e38411c469dfd15..f423906b833c0f69fd0c1420478fccd03354ae7a 100644 --- a/services/accesstokenmanager/main/cpp/src/database/rdb_dlopen_manager.cpp +++ b/services/accesstokenmanager/main/cpp/src/database/rdb_dlopen_manager.cpp @@ -28,7 +28,7 @@ namespace { constexpr const char* RDB_SYMBOL_CREATE = "Create"; constexpr const char* RDB_SYMBOL_DESTROY = "Destroy"; constexpr const char* DELAY_DLCLOSE_TASK_NAME = "DelayDlclose"; -constexpr int64_t DELAY_DLCLOSE_TIME_MILLISECONDS = 3600 * 1000; +constexpr int64_t DELAY_DLCLOSE_TIME_MILLISECONDS = 180 * 1000; using CreateFunc = void* (*)(void); using DestroyFunc = void (*)(void*); @@ -135,6 +135,13 @@ void RdbDlopenManager::DelayDlcloseHandle(int64_t delayTime) return; } + if (taskNum_ > 0) { + LOGI(ATM_DOMAIN, ATM_TAG, "There is still %{public}d database call remain, wait for next task.", + taskNum_.load()); + return; + } + LOGI(ATM_DOMAIN, ATM_TAG, "There is no database call remain, clean up resource."); + if (!CleanUp()) { return; } @@ -179,7 +186,10 @@ int32_t RdbDlopenManager::Modify(const AtmDataType type, const GenericValues& mo return AccessTokenError::ERR_LOAD_SO_FAILED; } - return instance->Modify(type, modifyValue, conditionValue); + taskNum_++; + int32_t res = instance->Modify(type, modifyValue, conditionValue); + taskNum_--; + return res; } int32_t RdbDlopenManager::Find(AtmDataType type, const GenericValues& conditionValue, @@ -190,7 +200,10 @@ int32_t RdbDlopenManager::Find(AtmDataType type, const GenericValues& conditionV return AccessTokenError::ERR_LOAD_SO_FAILED; } - return instance->Find(type, conditionValue, results); + taskNum_++; + int32_t res = instance->Find(type, conditionValue, results); + taskNum_--; + return res; } int32_t RdbDlopenManager::DeleteAndInsertValues(const std::vector& delInfoVec, @@ -201,7 +214,10 @@ int32_t RdbDlopenManager::DeleteAndInsertValues(const std::vector& delI return AccessTokenError::ERR_LOAD_SO_FAILED; } - return instance->DeleteAndInsertValues(delInfoVec, addInfoVec); + taskNum_++; + int32_t res = instance->DeleteAndInsertValues(delInfoVec, addInfoVec); + taskNum_--; + return res; } } // namespace AccessToken } // namespace Security diff --git a/services/accesstokenmanager/test/database_dlopen/database_dlopen_coverage_test.cpp b/services/accesstokenmanager/test/database_dlopen/database_dlopen_coverage_test.cpp index 074a368138c97b9cd276361c73a02c46929abd92..24fafb20078371e036bb7def7f0610a18610fa0a 100644 --- a/services/accesstokenmanager/test/database_dlopen/database_dlopen_coverage_test.cpp +++ b/services/accesstokenmanager/test/database_dlopen/database_dlopen_coverage_test.cpp @@ -47,7 +47,10 @@ void AccessTokenDatabaseDlopenTest::TearDownTestCase() {} void AccessTokenDatabaseDlopenTest::SetUp() {} -void AccessTokenDatabaseDlopenTest::TearDown() {} +void AccessTokenDatabaseDlopenTest::TearDown() +{ + RdbDlopenManager::DestroyInstance(); +} /* * @tc.name: GetEventHandler001 @@ -66,8 +69,6 @@ HWTEST_F(AccessTokenDatabaseDlopenTest, GetEventHandler001, TestSize.Level4) ASSERT_NE(nullptr, instance->eventRunner_); ASSERT_NE(nullptr, instance->eventHandler_); instance->GetEventHandler(); - - RdbDlopenManager::DestroyInstance(); } /* @@ -87,7 +88,7 @@ HWTEST_F(AccessTokenDatabaseDlopenTest, Create001, TestSize.Level4) void* handle = nullptr; instance->Create(handle); - handle = dlopen("libaccesstoken_manager_service.z.so", RTLD_LAZY); + handle = dlopen("libaccesstoken_sdk.z.so", RTLD_LAZY); ASSERT_NE(nullptr, handle); instance->Create(handle); ASSERT_EQ(nullptr, instance->instance_); @@ -100,8 +101,6 @@ HWTEST_F(AccessTokenDatabaseDlopenTest, Create001, TestSize.Level4) ASSERT_NE(nullptr, instance->instance_); dlclose(handle); handle = nullptr; - - RdbDlopenManager::DestroyInstance(); } /* @@ -120,7 +119,7 @@ HWTEST_F(AccessTokenDatabaseDlopenTest, Destroy001, TestSize.Level4) void* handle = nullptr; instance->Destroy(handle); - handle = dlopen("libaccesstoken_manager_service.z.so", RTLD_LAZY); + handle = dlopen("libaccesstoken_sdk.z.so", RTLD_LAZY); ASSERT_NE(nullptr, handle); instance->Destroy(handle); ASSERT_EQ(nullptr, instance->instance_); @@ -137,8 +136,6 @@ HWTEST_F(AccessTokenDatabaseDlopenTest, Destroy001, TestSize.Level4) dlclose(handle); handle = nullptr; - - RdbDlopenManager::DestroyInstance(); } /* @@ -156,7 +153,7 @@ HWTEST_F(AccessTokenDatabaseDlopenTest, DelayDlcloseHandle001, TestSize.Level4) instance->DelayDlcloseHandle(0); // handle_ is nullptr - instance->handle_ = dlopen("libaccesstoken_manager_service.z.so", RTLD_LAZY); + instance->handle_ = dlopen("libaccesstoken_sdk.z.so", RTLD_LAZY); ASSERT_NE(nullptr, instance->handle_); instance->DelayDlcloseHandle(0); // handle_ is not nullptr, instance_ is nullptr sleep(WAIT_EVENTHANDLE_TIME); @@ -170,8 +167,36 @@ HWTEST_F(AccessTokenDatabaseDlopenTest, DelayDlcloseHandle001, TestSize.Level4) sleep(WAIT_EVENTHANDLE_TIME); ASSERT_EQ(nullptr, instance->instance_); ASSERT_EQ(nullptr, instance->handle_); +} - RdbDlopenManager::DestroyInstance(); +/* + * @tc.name: DelayDlcloseHandle002 + * @tc.desc: RdbDlopenManager::DelayDlcloseHandle + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(AccessTokenDatabaseDlopenTest, DelayDlcloseHandle002, TestSize.Level4) +{ + auto instance = RdbDlopenManager::GetInstance(); + ASSERT_NE(nullptr, instance); + ASSERT_EQ(nullptr, instance->handle_); + ASSERT_EQ(nullptr, instance->instance_); + ASSERT_EQ(0, instance->taskNum_); + instance->DelayDlcloseHandle(0); // handle_ is nullptr + instance->handle_ = dlopen(RDB_ADAPTER_LIBPATH, RTLD_LAZY); + ASSERT_NE(nullptr, instance->handle_); + instance->Create(instance->handle_); + ASSERT_NE(nullptr, instance->instance_); + instance->taskNum_++; + instance->DelayDlcloseHandle(0); // handle_ and instance_ both not nullptr + sleep(WAIT_EVENTHANDLE_TIME); + ASSERT_NE(nullptr, instance->instance_); + ASSERT_NE(nullptr, instance->handle_); + instance->taskNum_--; + instance->DelayDlcloseHandle(0); // handle_ and instance_ both not nullptr + sleep(WAIT_EVENTHANDLE_TIME); + ASSERT_EQ(nullptr, instance->instance_); + ASSERT_EQ(nullptr, instance->handle_); } /* @@ -194,8 +219,6 @@ HWTEST_F(AccessTokenDatabaseDlopenTest, GetDbInstance001, TestSize.Level4) sleep(WAIT_DELAY_DLCLOSE_TIME); ASSERT_EQ(nullptr, instance->handle_); ASSERT_EQ(nullptr, instance->instance_); - - RdbDlopenManager::DestroyInstance(); } /* @@ -252,8 +275,6 @@ HWTEST_F(AccessTokenDatabaseDlopenTest, DynamicCallTest001, TestSize.Level4) std::vector results3; ASSERT_EQ(0, instance->Find(type, conditionValue, results3)); ASSERT_EQ(true, results3.empty()); - - RdbDlopenManager::DestroyInstance(); } } // namespace AccessToken } // namespace Security