From d9c98cf0ef582fd24ce75ccda7308571892ec5d2 Mon Sep 17 00:00:00 2001 From: Dennis Lanov Date: Wed, 22 Jul 2026 10:27:38 -0500 Subject: [PATCH] Fix isLibraryLoaded per-loader scope Signed-off-by: Dennis Lanov --- src/class_loader_core.cpp | 2 +- test/utest.cpp | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/class_loader_core.cpp b/src/class_loader_core.cpp index e808953..e455271 100644 --- a/src/class_loader_core.cpp +++ b/src/class_loader_core.cpp @@ -298,7 +298,7 @@ bool isLibraryLoaded(const std::string & library_path, const ClassLoader * loade allMetaObjectsForLibraryOwnedBy(library_path, loader).size(); bool are_meta_objs_bound_to_loader = (0 == num_meta_objs_for_lib) ? true : ( - num_meta_objs_for_lib_bound_to_loader <= num_meta_objs_for_lib); + num_meta_objs_for_lib_bound_to_loader == num_meta_objs_for_lib); return is_lib_loaded_by_anyone && are_meta_objs_bound_to_loader; } diff --git a/test/utest.cpp b/test/utest.cpp index f4e13ee..2fb5b25 100644 --- a/test/utest.cpp +++ b/test/utest.cpp @@ -381,6 +381,26 @@ TEST(ClassLoaderTest, loadRefCountingLazy) { FAIL() << "Did not throw exception as expected.\n"; } +TEST(ClassLoaderTest, isLibraryLoadedScopedToLoader) { + class_loader::ClassLoader loader1(LIBRARY_1, false); + ASSERT_TRUE(loader1.isLibraryLoaded()); + + class_loader::ClassLoader loader2(LIBRARY_1, true); + ASSERT_TRUE(class_loader::impl::isLibraryLoadedByAnybody(LIBRARY_1)); + ASSERT_FALSE(loader2.isLibraryLoaded()); + + loader2.loadLibrary(); + ASSERT_TRUE(loader2.isLibraryLoaded()); + + loader2.unloadLibrary(); + ASSERT_FALSE(loader2.isLibraryLoaded()); + ASSERT_TRUE(loader1.isLibraryLoaded()); + ASSERT_TRUE(class_loader::impl::isLibraryLoadedByAnybody(LIBRARY_1)); + + loader1.unloadLibrary(); + ASSERT_FALSE(class_loader::impl::isLibraryLoadedByAnybody(LIBRARY_1)); +} + void testMultiClassLoader(bool lazy) { try {