This is an automated email from the ASF dual-hosted git repository.

fgerlits pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git

commit 162ccfb558abc3c3a97326daa5da010d28977da2
Author: Gabor Gyimesi <[email protected]>
AuthorDate: Thu Feb 26 14:21:36 2026 +0100

    MINIFICPP-2732 Clear class descriptions when extensions are cleared
    
    Signed-off-by: Ferenc Gerlits <[email protected]>
    
    Closes #2121
---
 libminifi/include/core/extension/ExtensionManager.h | 6 ++++++
 libminifi/src/agent/agent_docs.cpp                  | 3 +++
 libminifi/src/core/extension/ExtensionManager.cpp   | 8 ++++++++
 minifi-api/include/minifi-cpp/agent/agent_docs.h    | 1 +
 4 files changed, 18 insertions(+)

diff --git a/libminifi/include/core/extension/ExtensionManager.h 
b/libminifi/include/core/extension/ExtensionManager.h
index ded6b4173..60af1229b 100644
--- a/libminifi/include/core/extension/ExtensionManager.h
+++ b/libminifi/include/core/extension/ExtensionManager.h
@@ -30,6 +30,12 @@ namespace org::apache::nifi::minifi::core::extension {
 class ExtensionManager {
  public:
   explicit ExtensionManager(const std::shared_ptr<Configure>& config);
+  ~ExtensionManager();
+
+  ExtensionManager(const ExtensionManager&) = delete;
+  ExtensionManager& operator=(const ExtensionManager&) = delete;
+  ExtensionManager(ExtensionManager&&) = delete;
+  ExtensionManager& operator=(ExtensionManager&&) = delete;
 
  private:
   std::vector<std::unique_ptr<Extension>> extensions_;
diff --git a/libminifi/src/agent/agent_docs.cpp 
b/libminifi/src/agent/agent_docs.cpp
index 0aeb58487..057e9188b 100644
--- a/libminifi/src/agent/agent_docs.cpp
+++ b/libminifi/src/agent/agent_docs.cpp
@@ -34,5 +34,8 @@ std::map<BundleIdentifier, Components>& 
ClassDescriptionRegistry::getMutableClas
   return getAgentDocsClassMappings();
 }
 
+void ClassDescriptionRegistry::clearClassDescriptions() {
+  getAgentDocsClassMappings().clear();
+}
 
 }  // namespace org::apache::nifi::minifi
diff --git a/libminifi/src/core/extension/ExtensionManager.cpp 
b/libminifi/src/core/extension/ExtensionManager.cpp
index 0d60e7c6b..a8ef38caa 100644
--- a/libminifi/src/core/extension/ExtensionManager.cpp
+++ b/libminifi/src/core/extension/ExtensionManager.cpp
@@ -21,6 +21,7 @@
 
 #include "core/logging/LoggerConfiguration.h"
 #include "core/extension/Extension.h"
+#include "minifi-cpp/agent/agent_docs.h"
 #include "utils/file/FilePattern.h"
 #include "minifi-cpp/agent/agent_version.h"
 #include "core/extension/Utils.h"
@@ -86,4 +87,11 @@ ExtensionManager::ExtensionManager(const 
std::shared_ptr<Configure>& config): lo
   }
 }
 
+ExtensionManager::~ExtensionManager() {
+  // Clear the class description registry to avoid dangling pointers
+  // to validator objects that live in extension DLLs to be unloaded.
+  minifi::ClassDescriptionRegistry::clearClassDescriptions();
+  extensions_.clear();
+}
+
 }  // namespace org::apache::nifi::minifi::core::extension
diff --git a/minifi-api/include/minifi-cpp/agent/agent_docs.h 
b/minifi-api/include/minifi-cpp/agent/agent_docs.h
index 912377d39..82e84f876 100644
--- a/minifi-api/include/minifi-cpp/agent/agent_docs.h
+++ b/minifi-api/include/minifi-cpp/agent/agent_docs.h
@@ -73,6 +73,7 @@ class ClassDescriptionRegistry {
  public:
   static const std::map<minifi::BundleIdentifier, Components>& 
getClassDescriptions();
   static std::map<minifi::BundleIdentifier, Components>& 
getMutableClassDescriptions();
+  static void clearClassDescriptions();
 
   template<typename Class, ResourceType Type>
   static void createClassDescription(std::string bundle_name, std::string 
class_name, std::string version);

Reply via email to