Not unload plugins when they have already done (#1426)
authorРоман Михайлович Русяев/AI Tools Lab /SRR/Staff Engineer/삼성전자 <r.rusyaev@samsung.com>
Mon, 10 Sep 2018 10:49:30 +0000 (13:49 +0300)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Mon, 10 Sep 2018 10:49:30 +0000 (13:49 +0300)
workaround for bugs: #1300, #1198

Signed-off-by: Roman Rusyaev <r.rusyaev@samsung.com>
contrib/nnc/include/support/shared_library.h
contrib/nnc/unittests/module/PluginManager.cpp

index c9d9aae..497dd37 100644 (file)
@@ -103,11 +103,15 @@ void SharedLibrary<ExceptionT>::unloadLibrary()
   // reset errors
   dlerror();
 
+  // This is a workaround for bug when nnc is received segfault when it can access
+  // to vtable from unloaded plugin. When we eliminate plugins it will be fixed
+  /*
   // close the library
   if ( dlclose(_handle) )
   {
     throw ExceptionT("Cannot unloaded library: '" + _path + "' : " + dlerror());
   }
+  */
 
 } // unloadLibrary
 
index 2f7652d..135037c 100644 (file)
@@ -39,49 +39,26 @@ TEST(CONTRIB_NNC, PluginManager)
   EXPECT_TRUE(os.str() == plugin );
 }
 
-// Unload shared library
-static void unloadShared(std::string plugin_path)
-{
-  void *handle = dlopen(plugin_path.c_str(), RTLD_LAZY);
-  assert(handle);
-
-  // try to close library until it is closed
-  for ( int i = 0; !dlclose(handle) && i < 10; i++ ) ;
-
-} // unloadShared
-
-// Test PluginManager that destructor throws exception correctly
-TEST(SUPPORT_NNC, verifyPluginManager4UnloadPlugin)
+// Test PluginManager that destructor doesn't throw exception
+TEST(SUPPORT_NNC, verifyPluginManagerForLoadPlugin)
 {
   std::string plugin_path{STRING(CMAKE_SAMPLE_PLUGIN_ABS_PATH)};
-  bool is_thrown = false;
 
-  // test that destructor throws exception
   try
   {
     // load the library
     PluginManager pluginManager(plugin_path);
-
-    // unload the library directly
-    unloadShared(plugin_path);
   }
   catch ( const PluginException &e )
   {
-    // the exception must be thrown from destructor because the library is already unloaded
-    is_thrown = true;
+    FAIL();
   }
 
-  ASSERT_EQ(is_thrown, true);
-
-  // test that destructor doesn't throw exception while stack is unwinding
   try
   {
     // load the library
     PluginManager pluginManager(plugin_path);
 
-    // unload the library directly
-    unloadShared(plugin_path);
-
     throw PluginException("test exception");
   }
   catch (const PluginException &e)