Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions libminifi/include/core/extension/ExtensionManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ namespace org::apache::nifi::minifi::core::extension {
class ExtensionManager {
public:
explicit ExtensionManager(const std::shared_ptr<Configure>& config);
~ExtensionManager();

private:
std::vector<std::unique_ptr<Extension>> extensions_;
Expand Down
3 changes: 3 additions & 0 deletions libminifi/src/agent/agent_docs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,8 @@ std::map<BundleIdentifier, Components>& ClassDescriptionRegistry::getMutableClas
return getAgentDocsClassMappings();
}

void ClassDescriptionRegistry::clearClassDescriptions() {
getAgentDocsClassMappings().clear();
}

} // namespace org::apache::nifi::minifi
11 changes: 11 additions & 0 deletions libminifi/src/core/extension/ExtensionManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -86,4 +87,14 @@ ExtensionManager::ExtensionManager(const std::shared_ptr<Configure>& config): lo
}
}

ExtensionManager::~ExtensionManager() {
// Extensions must be destroyed before clearing the registry,
// because DLL static destructors (StaticClassType) may still reference
// the registry during DLL unload.
extensions_.clear();
// Clear the class description registry to avoid dangling pointers
// to validator objects that lived in the now-unloaded extension DLLs.
minifi::ClassDescriptionRegistry::clearClassDescriptions();
}

} // namespace org::apache::nifi::minifi::core::extension
1 change: 1 addition & 0 deletions minifi-api/include/minifi-cpp/agent/agent_docs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Loading