You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by je...@apache.org on 2022/03/08 17:49:00 UTC
[incubator-mxnet] branch master updated: Avoid modifying loaded library map while iterating in lib_close() (#20941)
This is an automated email from the ASF dual-hosted git repository.
jevans pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git
The following commit(s) were added to refs/heads/master by this push:
new 13b8690 Avoid modifying loaded library map while iterating in lib_close() (#20941)
13b8690 is described below
commit 13b869002877a80f0f50a0f6cd2b0d8b55ea905f
Author: Joe Evans <jo...@gmail.com>
AuthorDate: Tue Mar 8 09:46:34 2022 -0800
Avoid modifying loaded library map while iterating in lib_close() (#20941)
* Update close libs to not modify map while iterating over opened libraries, rename loaded_libs to loaded_libs_ to signify it is a private member.
* Clean up and simplify library close code.
* Fix clang-format.
---
src/initialize.cc | 22 +++++++---------------
src/initialize.h | 4 ++--
2 files changed, 9 insertions(+), 17 deletions(-)
diff --git a/src/initialize.cc b/src/initialize.cc
index 5cb5b63..cfad17d 100644
--- a/src/initialize.cc
+++ b/src/initialize.cc
@@ -103,7 +103,7 @@ LibraryInitializer::LibraryInitializer()
LibraryInitializer::~LibraryInitializer() = default;
bool LibraryInitializer::lib_is_loaded(const std::string& path) const {
- return loaded_libs.count(path) > 0;
+ return loaded_libs_.count(path) > 0;
}
/*!
@@ -139,9 +139,9 @@ void* LibraryInitializer::lib_load(const char* path) {
}
#endif // _WIN32 or _WIN64 or __WINDOWS__
// then store the pointer to the library
- loaded_libs[path] = handle;
+ loaded_libs_[path] = handle;
} else {
- handle = loaded_libs.at(path);
+ handle = loaded_libs_.at(path);
}
return handle;
}
@@ -150,15 +150,7 @@ void* LibraryInitializer::lib_load(const char* path) {
* \brief Closes the loaded dynamic shared library file
* \param handle library file handle
*/
-void LibraryInitializer::lib_close(void* handle) {
- std::string libpath;
- for (const auto& l : loaded_libs) {
- if (l.second == handle) {
- libpath = l.first;
- break;
- }
- }
- CHECK(!libpath.empty());
+void LibraryInitializer::lib_close(void* handle, const std::string& libpath) {
#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__)
FreeLibrary((HMODULE)handle);
#else
@@ -167,7 +159,6 @@ void LibraryInitializer::lib_close(void* handle) {
<< " loaded from: '" << libpath << "': " << dlerror();
}
#endif // _WIN32 or _WIN64 or __WINDOWS__
- loaded_libs.erase(libpath);
}
/*!
@@ -393,9 +384,10 @@ SIGNAL_HANDLER(SIGBUS, SIGBUSHandler, false);
#endif
void LibraryInitializer::close_open_libs() {
- for (const auto& l : loaded_libs) {
- lib_close(l.second);
+ for (const auto& l : loaded_libs_) {
+ lib_close(l.second, l.first);
}
+ loaded_libs_.clear();
}
/**
diff --git a/src/initialize.h b/src/initialize.h
index 5a1062a..dea5b77 100644
--- a/src/initialize.h
+++ b/src/initialize.h
@@ -64,7 +64,7 @@ class LibraryInitializer {
// Library loading
bool lib_is_loaded(const std::string& path) const;
void* lib_load(const char* path);
- void lib_close(void* handle);
+ void lib_close(void* handle, const std::string& libpath);
static void get_sym(void* handle, void** func, const char* name);
/**
@@ -104,7 +104,7 @@ class LibraryInitializer {
void close_open_libs();
- loaded_libs_t loaded_libs;
+ loaded_libs_t loaded_libs_;
};
/*!