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_;
 };
 
 /*!