21namespace class_loader {
25 static std::recursive_mutex m;
30 static std::recursive_mutex m;
45 const std::string& typeid_base_class_name) {
47 std::string base_class_name = typeid_base_class_name;
48 if (factoryMapMap.find(base_class_name) == factoryMapMap.end()) {
52 return factoryMapMap[base_class_name];
56 static std::string library_name;
66 library_name_ref = library_name;
86 for (
auto& class_factory : factories) {
87 all_class_factory_objs.emplace_back(class_factory.second);
90 return all_class_factory_objs;
98 for (
auto& baseclass_map : factory_map_map) {
100 all_class_factory_objs.insert(all_class_factory_objs.end(), objs.begin(),
104 return all_class_factory_objs;
108 const std::string& library_path) {
111 for (
auto& class_factory_obj : all_class_factory_objs) {
112 if (class_factory_obj->GetRelativeLibraryPath() == library_path) {
113 library_class_factory_objs.emplace_back(class_factory_obj);
116 return library_class_factory_objs;
120 const std::string& library_path,
const ClassLoader* class_loader,
122 for (ClassClassFactoryMap::iterator itr = class_factory_map->begin();
123 itr != class_factory_map->end();) {
126 class_factory_object->
IsOwnedBy(class_loader)) {
130 itr = class_factory_map->erase(itr);
131 delete class_factory_object;
146 for (
auto& baseclass_map : factory_map_map) {
148 &baseclass_map.second);
153 const std::string& library_path) {
155 LibPathSharedLibVector::iterator itr;
156 for (itr = opened_libraries.begin(); itr != opened_libraries.end(); ++itr) {
157 if (itr->first == library_path) {
169 return itr != opened_libraries.end();
177 auto num_lib_class_factory_objs = lib_class_factory_objs.size();
178 if (is_lib_loaded_by_anyone && num_lib_class_factory_objs == 0) {
183 for (
auto& class_factory_obj : lib_class_factory_objs) {
184 if (class_factory_obj->IsOwnedBy(class_loader)) {
185 lib_loader_class_factory_objs.emplace_back(class_factory_obj);
189 auto num_lib_loader_class_factory_objs = lib_loader_class_factory_objs.size();
190 return (is_lib_loaded_by_anyone &&
191 (num_lib_loader_class_factory_objs <= num_lib_class_factory_objs));
196 AINFO <<
"lib has been loaded by others,only attach to class factory obj."
200 for (
auto& class_factory_obj : lib_class_factory_objs) {
201 class_factory_obj->AddOwnedClassLoader(loader);
207 static std::recursive_mutex loader_mutex;
209 std::lock_guard<std::recursive_mutex> lck(loader_mutex);
215 }
catch (
const LibraryLoadException& e) {
218 AERROR <<
"LibraryLoadException: " << e.what();
219 }
catch (
const LibraryAlreadyLoadedException& e) {
222 AERROR <<
"LibraryAlreadyLoadedException: " << e.what();
223 }
catch (
const SymbolNotFoundException& e) {
226 AERROR <<
"SymbolNotFoundException: " << e.what();
233 if (shared_library ==
nullptr) {
234 AERROR <<
"shared library failed: " << library_path;
239 if (num_lib_objs == 0) {
240 AWARN <<
"Class factory objs counts is 0, maybe registerclass failed.";
245 opened_libraries.emplace_back(
246 std::pair<std::string, SharedLibraryPtr>(library_path, shared_library));
255 if (itr == opened_libraries.end()) {
256 AERROR <<
"Attempt to UnloadLibrary lib, but can't find lib: "
261 std::string library_path = itr->first;
266 itr->second->Unload();
267 itr = opened_libraries.erase(itr);
269 AWARN <<
"ClassFactory objects still remain in memory, meaning other"
270 "class loaders are still using library:"
273 }
catch (
const std::runtime_error& e) {
274 AERROR <<
"Library unload error: " << e.what();
for library load,createclass object
const std::string GetRelativeLibraryPath() const
void RemoveOwnedClassLoader(const ClassLoader *loader)
bool IsOwnedBy(const ClassLoader *loader)
ClassClassFactoryMap & GetClassFactoryMapByBaseClass(const std::string &typeid_base_class_name)
LibPathSharedLibVector & GetLibPathSharedLibVector()
std::map< std::string, utility::AbstractClassFactoryBase * > ClassClassFactoryMap
std::string GetCurLoadingLibraryName()
BaseToClassFactoryMapMap & GetClassFactoryMapMap()
bool LoadLibrary(const std::string &library_path, ClassLoader *loader)
bool IsLibraryLoadedByAnybody(const std::string &library_path)
ClassLoader *& GetCurActiveClassLoaderReference()
std::vector< std::pair< std::string, SharedLibraryPtr > > LibPathSharedLibVector
std::recursive_mutex & GetClassFactoryMapMapMutex()
void SetCurActiveClassLoader(ClassLoader *loader)
void DestroyClassFactoryObjectsOfLibrary(const std::string &library_path, const ClassLoader *class_loader, ClassClassFactoryMap *class_factory_map)
void UnloadLibrary(const std::string &library_path, ClassLoader *loader)
void SetCurLoadingLibraryName(const std::string &library_name)
ClassFactoryVector GetAllClassFactoryObjectsOfLibrary(const std::string &library_path)
std::shared_ptr< SharedLibrary > SharedLibraryPtr
std::recursive_mutex & GetLibPathSharedLibMutex()
bool IsLibraryLoaded(const std::string &library_path, ClassLoader *class_loader)
LibPathSharedLibVector::iterator FindLoadedLibrary(const std::string &library_path)
ClassFactoryVector GetAllClassFactoryObjects()
std::vector< AbstractClassFactoryBase * > ClassFactoryVector
ClassLoader * GetCurActiveClassLoader()
std::string & GetCurLoadingLibraryNameReference()
std::map< std::string, ClassClassFactoryMap > BaseToClassFactoryMapMap