From cd8bd91f03859984457b16dba8d38fa1e9168ab7 Mon Sep 17 00:00:00 2001 From: Adam Debreceni Date: Mon, 23 Mar 2026 14:39:46 +0100 Subject: [PATCH 1/4] MINIFICPP-2752 - Register processors one-by-one --- .../include/utils/ExtensionInitUtils.h | 4 +- extensions/ExtensionInitializer.cpp | 8 ++- .../processors/ExtensionInitializer.cpp | 19 ++++--- extensions/opencv/OpenCVLoader.cpp | 8 ++- .../pythonlibloader/PythonLibLoader.cpp | 10 ++-- .../python/pythonloader/PyProcLoader.cpp | 10 ++-- extensions/sftp/SFTPLoader.cpp | 8 ++- libminifi/include/core/extension/Extension.h | 9 +++- libminifi/src/core/extension/Extension.cpp | 25 ++++----- libminifi/src/minifi-c.cpp | 52 ++++++++++++------- .../CApiExtension.cpp | 8 ++- .../CppApiExtension.cpp | 8 ++- .../CreateNotCalled.cpp | 2 +- .../ExtensionVerificationTests.cpp | 4 +- minifi-api/include/minifi-c/minifi-c.h | 10 ++-- minifi-api/minifi-c-api.def | 1 + 16 files changed, 96 insertions(+), 90 deletions(-) diff --git a/extension-framework/include/utils/ExtensionInitUtils.h b/extension-framework/include/utils/ExtensionInitUtils.h index 75da5c1ae9..bde5fe1f09 100644 --- a/extension-framework/include/utils/ExtensionInitUtils.h +++ b/extension-framework/include/utils/ExtensionInitUtils.h @@ -30,8 +30,8 @@ inline MinifiStringView toStringView(std::string_view str) { using ConfigReader = std::function(std::string_view key)>; -static inline void MinifiCreateCppExtension(MinifiExtension* extension, const MinifiExtensionCreateInfo* create_info) { - MINIFI_CREATE_EXTENSION_FN(extension, create_info); +static inline void MinifiCreateCppExtension(MinifiExtensionContext* extension_context, const MinifiExtensionCreateInfo* create_info) { + MINIFI_CREATE_EXTENSION_FN(extension_context, create_info); } } // namespace org::apache::nifi::minifi::utils diff --git a/extensions/ExtensionInitializer.cpp b/extensions/ExtensionInitializer.cpp index 47a4c21857..288615f726 100644 --- a/extensions/ExtensionInitializer.cpp +++ b/extensions/ExtensionInitializer.cpp @@ -22,14 +22,12 @@ namespace minifi = org::apache::nifi::minifi; -extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig* /*config*/) { +extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context) { MinifiExtensionCreateInfo ext_create_info{ .name = minifi::utils::toStringView(MAKESTRING(MODULE_NAME)), .version = minifi::utils::toStringView(minifi::AgentBuild::VERSION), .deinit = nullptr, - .user_data = nullptr, - .processors_count = 0, - .processors_ptr = nullptr + .user_data = nullptr }; - minifi::utils::MinifiCreateCppExtension(extension, &ext_create_info); + minifi::utils::MinifiCreateCppExtension(extension_context, &ext_create_info); } diff --git a/extensions/llamacpp/processors/ExtensionInitializer.cpp b/extensions/llamacpp/processors/ExtensionInitializer.cpp index 4b3c5b4e0d..ac5e0519d2 100644 --- a/extensions/llamacpp/processors/ExtensionInitializer.cpp +++ b/extensions/llamacpp/processors/ExtensionInitializer.cpp @@ -26,16 +26,15 @@ namespace minifi = org::apache::nifi::minifi; CEXTENSIONAPI const uint32_t MinifiApiVersion = MINIFI_API_VERSION; -CEXTENSIONAPI void MinifiInitExtension(MinifiExtension* extension, MinifiConfig* /*config*/) { +CEXTENSIONAPI void MinifiInitExtension(MinifiExtensionContext* extension_context) { + MinifiExtensionCreateInfo ext_create_info{ + .name = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_NAME)), + .version = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_VERSION)), + .deinit = nullptr, + .user_data = nullptr + }; + auto* extension = MinifiCreateExtension(extension_context, &ext_create_info); minifi::api::core::useProcessorClassDescription([&] (const MinifiProcessorClassDefinition& description) { - MinifiExtensionCreateInfo ext_create_info{ - .name = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_NAME)), - .version = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_VERSION)), - .deinit = nullptr, - .user_data = nullptr, - .processors_count = 1, - .processors_ptr = &description, - }; - MinifiCreateExtension(extension, &ext_create_info); + MinifiRegisterProcessor(extension, &description); }); } diff --git a/extensions/opencv/OpenCVLoader.cpp b/extensions/opencv/OpenCVLoader.cpp index 87c6615c51..65860a2673 100644 --- a/extensions/opencv/OpenCVLoader.cpp +++ b/extensions/opencv/OpenCVLoader.cpp @@ -24,7 +24,7 @@ namespace minifi = org::apache::nifi::minifi; -extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig* /*config*/) { +extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context) { // By default in OpenCV, ffmpeg capture is hardcoded to use TCP and this is a workaround // also if UDP timeout, ffmpeg will retry with TCP // Note: @@ -38,9 +38,7 @@ extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig* .name = minifi::utils::toStringView(MAKESTRING(MODULE_NAME)), .version = minifi::utils::toStringView(minifi::AgentBuild::VERSION), .deinit = nullptr, - .user_data = nullptr, - .processors_count = 0, - .processors_ptr = nullptr + .user_data = nullptr }; - minifi::utils::MinifiCreateCppExtension(extension, &ext_create_info); + minifi::utils::MinifiCreateCppExtension(extension_context, &ext_create_info); } diff --git a/extensions/python/pythonlibloader/PythonLibLoader.cpp b/extensions/python/pythonlibloader/PythonLibLoader.cpp index 79ef215564..9395e1f49c 100644 --- a/extensions/python/pythonlibloader/PythonLibLoader.cpp +++ b/extensions/python/pythonlibloader/PythonLibLoader.cpp @@ -98,10 +98,10 @@ class PythonLibLoader { std::shared_ptr logger_ = minifi::core::logging::LoggerFactory::getLogger(); }; -extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig* config) { +extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context) { static PythonLibLoader python_lib_loader([&] (std::string_view key) -> std::optional { std::optional result; - MinifiConfigGet(config, minifi::utils::toStringView(key), [] (void* user_data, MinifiStringView value) { + MinifiConfigGet(extension_context, minifi::utils::toStringView(key), [] (void* user_data, MinifiStringView value) { *static_cast*>(user_data) = std::string{value.data, value.length}; }, &result); return result; @@ -110,9 +110,7 @@ extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig* .name = minifi::utils::toStringView(MAKESTRING(MODULE_NAME)), .version = minifi::utils::toStringView(minifi::AgentBuild::VERSION), .deinit = nullptr, - .user_data = nullptr, - .processors_count = 0, - .processors_ptr = nullptr + .user_data = nullptr }; - minifi::utils::MinifiCreateCppExtension(extension, &ext_create_info); + minifi::utils::MinifiCreateCppExtension(extension_context, &ext_create_info); } diff --git a/extensions/python/pythonloader/PyProcLoader.cpp b/extensions/python/pythonloader/PyProcLoader.cpp index e92bbea416..e6bb76f614 100644 --- a/extensions/python/pythonloader/PyProcLoader.cpp +++ b/extensions/python/pythonloader/PyProcLoader.cpp @@ -33,10 +33,10 @@ static minifi::extensions::python::PythonCreator& getPythonCreator() { // the symbols of the python library extern "C" const int LOAD_MODULE_AS_GLOBAL = 1; -extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig* config) { +extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context) { getPythonCreator().configure([&] (std::string_view key) -> std::optional { std::optional result; - MinifiConfigGet(config, minifi::utils::toStringView(key), [] (void* user_data, MinifiStringView value) { + MinifiConfigGet(extension_context, minifi::utils::toStringView(key), [] (void* user_data, MinifiStringView value) { *static_cast*>(user_data) = std::string{value.data, value.length}; }, &result); return result; @@ -45,9 +45,7 @@ extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig* .name = minifi::utils::toStringView(MAKESTRING(MODULE_NAME)), .version = minifi::utils::toStringView(minifi::AgentBuild::VERSION), .deinit = nullptr, - .user_data = nullptr, - .processors_count = 0, - .processors_ptr = nullptr + .user_data = nullptr }; - minifi::utils::MinifiCreateCppExtension(extension, &ext_create_info); + minifi::utils::MinifiCreateCppExtension(extension_context, &ext_create_info); } diff --git a/extensions/sftp/SFTPLoader.cpp b/extensions/sftp/SFTPLoader.cpp index c8309cc602..b7df94ec99 100644 --- a/extensions/sftp/SFTPLoader.cpp +++ b/extensions/sftp/SFTPLoader.cpp @@ -25,7 +25,7 @@ namespace minifi = org::apache::nifi::minifi; -extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig* /*config*/) { +extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context) { if (libssh2_init(0) != 0) { return; } @@ -40,9 +40,7 @@ extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig* curl_global_cleanup(); libssh2_exit(); }, - .user_data = nullptr, - .processors_count = 0, - .processors_ptr = nullptr + .user_data = nullptr }; - minifi::utils::MinifiCreateCppExtension(extension, &ext_create_info); + minifi::utils::MinifiCreateCppExtension(extension_context, &ext_create_info); } diff --git a/libminifi/include/core/extension/Extension.h b/libminifi/include/core/extension/Extension.h index 85cf4fc60a..2db7e94204 100644 --- a/libminifi/include/core/extension/Extension.h +++ b/libminifi/include/core/extension/Extension.h @@ -40,6 +40,11 @@ class Extension { void* user_data; }; + struct Context { + std::shared_ptr config; + std::function create; + }; + Extension(std::string name, std::filesystem::path library_path); Extension(const Extension&) = delete; @@ -51,7 +56,9 @@ class Extension { bool initialize(const std::shared_ptr& configure); - bool setInfo(Info info); + std::optional getInfo() const { + return info_.value(); + } private: #ifdef WIN32 diff --git a/libminifi/src/core/extension/Extension.cpp b/libminifi/src/core/extension/Extension.cpp index f8ca0f5f04..1e600d3b51 100644 --- a/libminifi/src/core/extension/Extension.cpp +++ b/libminifi/src/core/extension/Extension.cpp @@ -139,14 +139,6 @@ Extension::~Extension() { #endif } -bool Extension::setInfo(Info info) { - if (info_) { - return false; - } - info_ = std::move(info); - return true; -} - bool Extension::initialize(const std::shared_ptr& configure) { logger_->log_trace("Initializing extension '{}'", library_name_); void* init_symbol_ptr = findSymbol("MinifiInitCppExtension"); @@ -158,10 +150,19 @@ bool Extension::initialize(const std::shared_ptr& configure) return false; } logger_->log_debug("Found initializer for '{}'", library_name_); - auto init_fn = reinterpret_cast(init_symbol_ptr); - auto config_handle = reinterpret_cast(configure.get()); - auto extension_handle = reinterpret_cast(this); - init_fn(extension_handle, config_handle); + + auto init_fn = reinterpret_cast(init_symbol_ptr); + Context extension_context{ + .config = configure, + .create = [&] (Info info) -> Extension* { + if (info_) { + return nullptr; + } + info_ = std::move(info); + return this; + } + }; + init_fn(reinterpret_cast(&extension_context)); if (!info_) { logger_->log_error("Failed to initialize extension '{}'", library_name_); return false; diff --git a/libminifi/src/minifi-c.cpp b/libminifi/src/minifi-c.cpp index 55fe7cf8dc..bf9c5e84cc 100644 --- a/libminifi/src/minifi-c.cpp +++ b/libminifi/src/minifi-c.cpp @@ -225,37 +225,49 @@ void useCProcessorClassDescription(const MinifiProcessorClassDefinition& class_d extern "C" { -MinifiStatus MinifiCreateExtension(MinifiExtension* extension, const MinifiExtensionCreateInfo* extension_create_info) { - gsl_Assert(extension); +MinifiExtension* MinifiCreateExtension(MinifiExtensionContext* extension_context, const MinifiExtensionCreateInfo* extension_create_info) { + gsl_Assert(extension_context); gsl_Assert(extension_create_info); auto extension_name = toString(extension_create_info->name); minifi::BundleIdentifier bundle{ .name = extension_name, .version = toString(extension_create_info->version) }; - auto& bundle_components = minifi::ClassDescriptionRegistry::getMutableClassDescriptions()[bundle]; - for (size_t proc_idx = 0; proc_idx < extension_create_info->processors_count; ++proc_idx) { - minifi::utils::useCProcessorClassDescription(extension_create_info->processors_ptr[proc_idx], [&] (const auto& description, const auto& c_class_description) { - minifi::core::ClassLoader::getDefaultClassLoader().getClassLoader(extension_name).registerClass( - c_class_description.name, - std::make_unique(extension_name, toString(extension_create_info->processors_ptr[proc_idx].full_name), c_class_description)); - bundle_components.processors.emplace_back(description); - }); - } - bool success = reinterpret_cast(extension)->setInfo(org::apache::nifi::minifi::core::extension::Extension::Info{ + auto* extension = reinterpret_cast(extension_context)->create(org::apache::nifi::minifi::core::extension::Extension::Info{ .name = toString(extension_create_info->name), .version = toString(extension_create_info->version), .deinit = extension_create_info->deinit, .user_data = extension_create_info->user_data }); - if (success) { - return MINIFI_STATUS_SUCCESS; + if (extension) { + return reinterpret_cast(extension); + } + return MINIFI_NULL; +} + +MinifiStatus MinifiRegisterProcessor(MinifiExtension* extension_handle, const MinifiProcessorClassDefinition* processor) { + gsl_Assert(extension_handle); + gsl_Assert(processor); + auto extension_info = reinterpret_cast(extension_handle)->getInfo(); + if (!extension_info) { + return MINIFI_STATUS_UNKNOWN_ERROR; } - return MINIFI_STATUS_UNKNOWN_ERROR; + minifi::BundleIdentifier bundle{ + .name = extension_info->name, + .version = extension_info->version + }; + auto& bundle_components = minifi::ClassDescriptionRegistry::getMutableClassDescriptions()[bundle]; + minifi::utils::useCProcessorClassDescription(*processor, [&] (const auto& description, const auto& c_class_description) { + minifi::core::ClassLoader::getDefaultClassLoader().getClassLoader(extension_info->name).registerClass( + c_class_description.name, + std::make_unique(extension_info->name, toString(processor->full_name), c_class_description)); + bundle_components.processors.emplace_back(description); + }); + return MINIFI_STATUS_SUCCESS; } -MinifiStatus MINIFI_CREATE_EXTENSION_FN(MinifiExtension* extension, const MinifiExtensionCreateInfo* extension_create_info) { - return MinifiCreateExtension(extension, extension_create_info); +MinifiExtension* MINIFI_CREATE_EXTENSION_FN(MinifiExtensionContext* extension_context, const MinifiExtensionCreateInfo* extension_create_info) { + return MinifiCreateExtension(extension_context, extension_create_info); } MinifiStatus MinifiProcessContextGetProperty(MinifiProcessContext* context, MinifiStringView property_name, MinifiFlowFile* flowfile, @@ -281,9 +293,9 @@ MinifiBool MinifiProcessContextHasNonEmptyProperty(MinifiProcessContext* context return reinterpret_cast(context)->hasNonEmptyProperty(toString(property_name)); } -void MinifiConfigGet(MinifiConfig* configure, MinifiStringView key, void(*cb)(void* user_ctx, MinifiStringView result), void* user_ctx) { - gsl_Assert(configure != MINIFI_NULL); - auto value = reinterpret_cast(configure)->get(toString(key)); +void MinifiConfigGet(MinifiExtensionContext* extension_context, MinifiStringView key, void(*cb)(void* user_ctx, MinifiStringView result), void* user_ctx) { + gsl_Assert(extension_context); + auto value = reinterpret_cast(extension_context)->config->get(toString(key)); if (value) { cb(user_ctx, MinifiStringView{ .data = value->data(), diff --git a/libminifi/test/integration/extension-verification-test/CApiExtension.cpp b/libminifi/test/integration/extension-verification-test/CApiExtension.cpp index 18f47f2806..ad3c4a7a38 100644 --- a/libminifi/test/integration/extension-verification-test/CApiExtension.cpp +++ b/libminifi/test/integration/extension-verification-test/CApiExtension.cpp @@ -26,14 +26,12 @@ namespace minifi = org::apache::nifi::minifi; CEXTENSIONAPI const uint32_t MinifiApiVersion = MINIFI_TEST_API_VERSION; -CEXTENSIONAPI void MinifiInitExtension(MinifiExtension* extension, MinifiConfig* /*config*/) { +CEXTENSIONAPI void MinifiInitExtension(MinifiExtensionContext* extension_context) { MinifiExtensionCreateInfo ext_create_info{ .name = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_NAME)), .version = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_VERSION)), .deinit = nullptr, - .user_data = nullptr, - .processors_count = 0, - .processors_ptr = nullptr, + .user_data = nullptr }; - MinifiCreateExtension(extension, &ext_create_info); + MinifiCreateExtension(extension_context, &ext_create_info); } diff --git a/libminifi/test/integration/extension-verification-test/CppApiExtension.cpp b/libminifi/test/integration/extension-verification-test/CppApiExtension.cpp index 59daee45d5..04122d0366 100644 --- a/libminifi/test/integration/extension-verification-test/CppApiExtension.cpp +++ b/libminifi/test/integration/extension-verification-test/CppApiExtension.cpp @@ -24,14 +24,12 @@ namespace minifi = org::apache::nifi::minifi; -extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig* /*config*/) { +extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context) { MinifiExtensionCreateInfo ext_create_info{ .name = minifi::utils::toStringView(MAKESTRING(MODULE_NAME)), .version = minifi::utils::toStringView("1.0.0"), .deinit = nullptr, - .user_data = nullptr, - .processors_count = 0, - .processors_ptr = nullptr + .user_data = nullptr }; - minifi::utils::MinifiCreateCppExtension(extension, &ext_create_info); + minifi::utils::MinifiCreateCppExtension(extension_context, &ext_create_info); } diff --git a/libminifi/test/integration/extension-verification-test/CreateNotCalled.cpp b/libminifi/test/integration/extension-verification-test/CreateNotCalled.cpp index 8a51d873ee..ba2252baf7 100644 --- a/libminifi/test/integration/extension-verification-test/CreateNotCalled.cpp +++ b/libminifi/test/integration/extension-verification-test/CreateNotCalled.cpp @@ -21,6 +21,6 @@ CEXTENSIONAPI const uint32_t MinifiApiVersion = MINIFI_TEST_API_VERSION; -CEXTENSIONAPI void MinifiInitExtension(MinifiExtension* /*extension*/, MinifiConfig* /*config*/) { +CEXTENSIONAPI void MinifiInitExtension(MinifiExtensionContext* /*extension_context*/) { // NOT CALLING CREATE } diff --git a/libminifi/test/integration/extension-verification-test/ExtensionVerificationTests.cpp b/libminifi/test/integration/extension-verification-test/ExtensionVerificationTests.cpp index 86084f80de..9475500e3e 100644 --- a/libminifi/test/integration/extension-verification-test/ExtensionVerificationTests.cpp +++ b/libminifi/test/integration/extension-verification-test/ExtensionVerificationTests.cpp @@ -28,8 +28,8 @@ extern "C" { -MinifiStatus MinifiCreateCppExtension_MatchingBuildId(MinifiExtension* extension, const MinifiExtensionCreateInfo* extension_create_info) { - return MinifiCreateExtension(extension, extension_create_info); +MinifiExtension* MinifiCreateCppExtension_MatchingBuildId(MinifiExtensionContext* extension_context, const MinifiExtensionCreateInfo* extension_create_info) { + return MinifiCreateExtension(extension_context, extension_create_info); } } // extern "C" diff --git a/minifi-api/include/minifi-c/minifi-c.h b/minifi-api/include/minifi-c/minifi-c.h index a2f0349ac5..86dc7b407e 100644 --- a/minifi-api/include/minifi-c/minifi-c.h +++ b/minifi-api/include/minifi-c/minifi-c.h @@ -95,8 +95,8 @@ typedef struct MinifiProcessContext MinifiProcessContext; typedef struct MinifiProcessSession MinifiProcessSession; typedef struct MinifiInputStream MinifiInputStream; typedef struct MinifiOutputStream MinifiOutputStream; -typedef struct MinifiConfig MinifiConfig; typedef struct MinifiExtension MinifiExtension; +typedef struct MinifiExtensionContext MinifiExtensionContext; typedef struct MinifiPublishedMetrics MinifiPublishedMetrics; typedef struct MinifiAgent MinifiAgent; @@ -188,11 +188,11 @@ typedef struct MinifiExtensionCreateInfo { MinifiStringView version; void(*deinit)(void* user_data); void* user_data; - size_t processors_count; - const MinifiProcessorClassDefinition* processors_ptr; } MinifiExtensionCreateInfo; -MinifiStatus MINIFI_CREATE_EXTENSION_FN(MinifiExtension* extension, const MinifiExtensionCreateInfo* create_info); +MinifiExtension* MINIFI_CREATE_EXTENSION_FN(MinifiExtensionContext* extension_context, const MinifiExtensionCreateInfo* create_info); + +MinifiStatus MinifiRegisterProcessor(MinifiExtension* extension, const MinifiProcessorClassDefinition* processor); MINIFI_OWNED MinifiPublishedMetrics* MinifiPublishedMetricsCreate(size_t count, const MinifiStringView* metric_names, const double* metric_values); @@ -214,7 +214,7 @@ MinifiStatus MinifiProcessSessionRemove(MinifiProcessSession* session, MINIFI_OW MinifiStatus MinifiProcessSessionRead(MinifiProcessSession*, MinifiFlowFile*, int64_t(*cb)(void* user_ctx, MinifiInputStream*), void* user_ctx); MinifiStatus MinifiProcessSessionWrite(MinifiProcessSession*, MinifiFlowFile*, int64_t(*cb)(void* user_ctx, MinifiOutputStream*), void* user_ctx); -void MinifiConfigGet(MinifiConfig* config, MinifiStringView config_key, void(*cb)(void* user_ctx, MinifiStringView config_value), void* user_ctx); +void MinifiConfigGet(MinifiExtensionContext* extension_context, MinifiStringView config_key, void(*cb)(void* user_ctx, MinifiStringView config_value), void* user_ctx); size_t MinifiInputStreamSize(MinifiInputStream*); diff --git a/minifi-api/minifi-c-api.def b/minifi-api/minifi-c-api.def index 9e1592b3ad..a22f8c696e 100644 --- a/minifi-api/minifi-c-api.def +++ b/minifi-api/minifi-c-api.def @@ -1,6 +1,7 @@ LIBRARY core-minifi.dll EXPORTS MinifiCreateExtension + MinifiRegisterProcessor MinifiPublishedMetricsCreate MinifiProcessContextGetProperty MinifiProcessContextHasNonEmptyProperty From a74ccf3407458bc2c2a9fb94dfc24a890563f7d4 Mon Sep 17 00:00:00 2001 From: Adam Debreceni Date: Mon, 30 Mar 2026 14:47:26 +0200 Subject: [PATCH 2/4] MINIFICPP-2752 - Update readme --- Extensions.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Extensions.md b/Extensions.md index f75c068e67..c002c96ce1 100644 --- a/Extensions.md +++ b/Extensions.md @@ -28,19 +28,18 @@ Moreover the actual resource registration (processors/controller services) has t One possible example of this is: ```C++ -extern "C" const char* const MinifiApiVersion = MINIFI_API_VERSION; +extern "C" const uint32_t MinifiApiVersion = MINIFI_API_VERSION; -extern "C" void MinifiInitExtension(MinifiExtension* extension, MinifiConfig* /*config*/) { +extern "C" void MinifiInitExtension(MinifiExtensionContext* extension_context) { + MinifiExtensionCreateInfo ext_create_info{ + .name = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_NAME)), + .version = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_VERSION)), + .deinit = nullptr, + .user_data = nullptr + }; + auto* extension = MinifiCreateExtension(extension_context, &ext_create_info); minifi::api::core::useProcessorClassDescription([&] (const MinifiProcessorClassDefinition& description) { - MinifiExtensionCreateInfo ext_create_info{ - .name = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_NAME)), - .version = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_VERSION)), - .deinit = nullptr, - .user_data = nullptr, - .processors_count = 1, - .processors_ptr = &description, - }; - MinifiCreateExtension(extension, &ext_create_info); + MinifiRegisterProcessor(extension, &description); }); } ``` From b29555337d272fb8be567efe27d230af970ecaa8 Mon Sep 17 00:00:00 2001 From: Adam Debreceni Date: Thu, 16 Apr 2026 10:25:42 +0200 Subject: [PATCH 3/4] MINIFICPP-2752 - Review changes --- Extensions.md | 26 +++++++++++++------ .../include/utils/ExtensionInitUtils.h | 4 +-- extensions/ExtensionInitializer.cpp | 4 +-- .../processors/ExtensionInitializer.cpp | 4 +-- extensions/opencv/OpenCVLoader.cpp | 4 +-- .../pythonlibloader/PythonLibLoader.cpp | 4 +-- .../python/pythonloader/PyProcLoader.cpp | 4 +-- extensions/sftp/SFTPLoader.cpp | 4 +-- libminifi/include/core/extension/Extension.h | 4 ++- libminifi/src/minifi-c.cpp | 21 ++++++--------- .../CApiExtension.cpp | 4 +-- .../CMakeLists.txt | 4 +-- .../CppApiExtension.cpp | 4 +-- .../ExtensionVerificationTests.cpp | 8 +++--- .../dummy-cpp-api.def | 4 +-- minifi-api/CMakeLists.txt | 2 +- minifi-api/include/minifi-c/minifi-c.h | 15 ++++++----- minifi-api/minifi-c-api.def | 2 +- 18 files changed, 66 insertions(+), 56 deletions(-) diff --git a/Extensions.md b/Extensions.md index c002c96ce1..c4f4437a02 100644 --- a/Extensions.md +++ b/Extensions.md @@ -20,24 +20,34 @@ To enable all extensions for your platform, you may use -DENABLE_ALL=TRUE OR sel Extensions are dynamic libraries loaded at runtime by the agent. ## C extensions -You can build a shared library depending on the C capabilities of the agent as given in the `minifi-c.h` file. -For the shared library to be considered a valid extension, it has to have a global symbol with the name `MinifiCApiVersion` -with its value as a null terminated string (`const char*`) of the macro `MINIFI_API_VERSION` from `minifi-c.h`. +You can build shared libraries using the API defined in `minifi-c.h` +For the shared library to be considered a valid extension, it must export a global symbol with the name `MinifiApiVersion` +with its value equal to the uint32_t constant `MINIFI_API_VERSION` from `minifi-c.h`. -Moreover the actual resource registration (processors/controller services) has to happen during the `MinifiInitExtension` call. +### Resource Lifetime + +Unless otherwise specified, the following lifetime rules apply to all functions called by the agent (e.g., `MinifiInitExtension`, `MinifiProcessorCallbacks::onTrigger`, or other callbacks): + +* Arguments: The lifetime of any resource provided as a function argument is limited to the duration of that function call. + +* Created Resources: The lifetime of resources created within these functions (e.g., a handle returned by `MinifiProcessSessionGet` inside `MinifiProcessorCallbacks::onTrigger`) +is limited to the scope of the innermost callback. +(the return value of `MinifiRegisterExtension` is only valid during the execution of `MinifiInitExtension`). + +Because of these scoping rules, all processor and controller service registrations must occur within the `MinifiInitExtension` call. One possible example of this is: ```C++ extern "C" const uint32_t MinifiApiVersion = MINIFI_API_VERSION; extern "C" void MinifiInitExtension(MinifiExtensionContext* extension_context) { - MinifiExtensionCreateInfo ext_create_info{ + MinifiExtensionDefinition extension_definition{ .name = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_NAME)), .version = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_VERSION)), .deinit = nullptr, .user_data = nullptr }; - auto* extension = MinifiCreateExtension(extension_context, &ext_create_info); + auto* extension = MinifiRegisterExtension(extension_context, &extension_definition); minifi::api::core::useProcessorClassDescription([&] (const MinifiProcessorClassDefinition& description) { MinifiRegisterProcessor(extension, &description); }); @@ -71,7 +81,7 @@ extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig* if (!success) { return nullptr; } - MinifiExtensionCreateInfo ext_create_info{ + MinifiExtensionDefinition extension_definition{ .name = minifi::utils::toStringView(MAKESTRING(MODULE_NAME)), .version = minifi::utils::toStringView(minifi::AgentBuild::VERSION), .deinit = nullptr, @@ -79,7 +89,7 @@ extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig* .processors_count = 0, .processors_ptr = nullptr }; - minifi::utils::MinifiCreateCppExtension(extension, &ext_create_info); + minifi::utils::MinifiRegisterCppExtension(extension, &extension_definition); } ``` diff --git a/extension-framework/include/utils/ExtensionInitUtils.h b/extension-framework/include/utils/ExtensionInitUtils.h index bde5fe1f09..9ac895aabe 100644 --- a/extension-framework/include/utils/ExtensionInitUtils.h +++ b/extension-framework/include/utils/ExtensionInitUtils.h @@ -30,8 +30,8 @@ inline MinifiStringView toStringView(std::string_view str) { using ConfigReader = std::function(std::string_view key)>; -static inline void MinifiCreateCppExtension(MinifiExtensionContext* extension_context, const MinifiExtensionCreateInfo* create_info) { - MINIFI_CREATE_EXTENSION_FN(extension_context, create_info); +static inline void MinifiRegisterCppExtension(MinifiExtensionContext* extension_context, const MinifiExtensionDefinition* extension_definition) { + MINIFI_REGISTER_EXTENSION_FN(extension_context, extension_definition); } } // namespace org::apache::nifi::minifi::utils diff --git a/extensions/ExtensionInitializer.cpp b/extensions/ExtensionInitializer.cpp index 288615f726..3cc5c6cb76 100644 --- a/extensions/ExtensionInitializer.cpp +++ b/extensions/ExtensionInitializer.cpp @@ -23,11 +23,11 @@ namespace minifi = org::apache::nifi::minifi; extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context) { - MinifiExtensionCreateInfo ext_create_info{ + MinifiExtensionDefinition extension_definition{ .name = minifi::utils::toStringView(MAKESTRING(MODULE_NAME)), .version = minifi::utils::toStringView(minifi::AgentBuild::VERSION), .deinit = nullptr, .user_data = nullptr }; - minifi::utils::MinifiCreateCppExtension(extension_context, &ext_create_info); + minifi::utils::MinifiRegisterCppExtension(extension_context, &extension_definition); } diff --git a/extensions/llamacpp/processors/ExtensionInitializer.cpp b/extensions/llamacpp/processors/ExtensionInitializer.cpp index ac5e0519d2..f11b539568 100644 --- a/extensions/llamacpp/processors/ExtensionInitializer.cpp +++ b/extensions/llamacpp/processors/ExtensionInitializer.cpp @@ -27,13 +27,13 @@ namespace minifi = org::apache::nifi::minifi; CEXTENSIONAPI const uint32_t MinifiApiVersion = MINIFI_API_VERSION; CEXTENSIONAPI void MinifiInitExtension(MinifiExtensionContext* extension_context) { - MinifiExtensionCreateInfo ext_create_info{ + MinifiExtensionDefinition extension_definition{ .name = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_NAME)), .version = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_VERSION)), .deinit = nullptr, .user_data = nullptr }; - auto* extension = MinifiCreateExtension(extension_context, &ext_create_info); + auto* extension = MinifiRegisterExtension(extension_context, &extension_definition); minifi::api::core::useProcessorClassDescription([&] (const MinifiProcessorClassDefinition& description) { MinifiRegisterProcessor(extension, &description); }); diff --git a/extensions/opencv/OpenCVLoader.cpp b/extensions/opencv/OpenCVLoader.cpp index 65860a2673..d74231c267 100644 --- a/extensions/opencv/OpenCVLoader.cpp +++ b/extensions/opencv/OpenCVLoader.cpp @@ -34,11 +34,11 @@ extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context if (!success) { return; } - MinifiExtensionCreateInfo ext_create_info{ + MinifiExtensionDefinition extension_definition{ .name = minifi::utils::toStringView(MAKESTRING(MODULE_NAME)), .version = minifi::utils::toStringView(minifi::AgentBuild::VERSION), .deinit = nullptr, .user_data = nullptr }; - minifi::utils::MinifiCreateCppExtension(extension_context, &ext_create_info); + minifi::utils::MinifiRegisterCppExtension(extension_context, &extension_definition); } diff --git a/extensions/python/pythonlibloader/PythonLibLoader.cpp b/extensions/python/pythonlibloader/PythonLibLoader.cpp index 9395e1f49c..e080da22ac 100644 --- a/extensions/python/pythonlibloader/PythonLibLoader.cpp +++ b/extensions/python/pythonlibloader/PythonLibLoader.cpp @@ -106,11 +106,11 @@ extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context }, &result); return result; }); - MinifiExtensionCreateInfo ext_create_info{ + MinifiExtensionDefinition extension_definition{ .name = minifi::utils::toStringView(MAKESTRING(MODULE_NAME)), .version = minifi::utils::toStringView(minifi::AgentBuild::VERSION), .deinit = nullptr, .user_data = nullptr }; - minifi::utils::MinifiCreateCppExtension(extension_context, &ext_create_info); + minifi::utils::MinifiRegisterCppExtension(extension_context, &extension_definition); } diff --git a/extensions/python/pythonloader/PyProcLoader.cpp b/extensions/python/pythonloader/PyProcLoader.cpp index e6bb76f614..9d81503fc7 100644 --- a/extensions/python/pythonloader/PyProcLoader.cpp +++ b/extensions/python/pythonloader/PyProcLoader.cpp @@ -41,11 +41,11 @@ extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context }, &result); return result; }); - MinifiExtensionCreateInfo ext_create_info{ + MinifiExtensionDefinition extension_definition{ .name = minifi::utils::toStringView(MAKESTRING(MODULE_NAME)), .version = minifi::utils::toStringView(minifi::AgentBuild::VERSION), .deinit = nullptr, .user_data = nullptr }; - minifi::utils::MinifiCreateCppExtension(extension_context, &ext_create_info); + minifi::utils::MinifiRegisterCppExtension(extension_context, &extension_definition); } diff --git a/extensions/sftp/SFTPLoader.cpp b/extensions/sftp/SFTPLoader.cpp index b7df94ec99..620a31f41f 100644 --- a/extensions/sftp/SFTPLoader.cpp +++ b/extensions/sftp/SFTPLoader.cpp @@ -33,7 +33,7 @@ extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context libssh2_exit(); return; } - MinifiExtensionCreateInfo ext_create_info{ + MinifiExtensionDefinition extension_definition{ .name = minifi::utils::toStringView(MAKESTRING(MODULE_NAME)), .version = minifi::utils::toStringView(minifi::AgentBuild::VERSION), .deinit = [] (void* /*user_data*/) { @@ -42,5 +42,5 @@ extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context }, .user_data = nullptr }; - minifi::utils::MinifiCreateCppExtension(extension_context, &ext_create_info); + minifi::utils::MinifiRegisterCppExtension(extension_context, &extension_definition); } diff --git a/libminifi/include/core/extension/Extension.h b/libminifi/include/core/extension/Extension.h index 2db7e94204..2b0753f799 100644 --- a/libminifi/include/core/extension/Extension.h +++ b/libminifi/include/core/extension/Extension.h @@ -18,8 +18,10 @@ #pragma once #include +#include #include #include +#include #include #include "minifi-c/minifi-c.h" @@ -57,7 +59,7 @@ class Extension { bool initialize(const std::shared_ptr& configure); std::optional getInfo() const { - return info_.value(); + return info_; } private: diff --git a/libminifi/src/minifi-c.cpp b/libminifi/src/minifi-c.cpp index bf9c5e84cc..44152eb25d 100644 --- a/libminifi/src/minifi-c.cpp +++ b/libminifi/src/minifi-c.cpp @@ -225,19 +225,14 @@ void useCProcessorClassDescription(const MinifiProcessorClassDefinition& class_d extern "C" { -MinifiExtension* MinifiCreateExtension(MinifiExtensionContext* extension_context, const MinifiExtensionCreateInfo* extension_create_info) { +MinifiExtension* MinifiRegisterExtension(MinifiExtensionContext* extension_context, const MinifiExtensionDefinition* extension_definition) { gsl_Assert(extension_context); - gsl_Assert(extension_create_info); - auto extension_name = toString(extension_create_info->name); - minifi::BundleIdentifier bundle{ - .name = extension_name, - .version = toString(extension_create_info->version) - }; + gsl_Assert(extension_definition); auto* extension = reinterpret_cast(extension_context)->create(org::apache::nifi::minifi::core::extension::Extension::Info{ - .name = toString(extension_create_info->name), - .version = toString(extension_create_info->version), - .deinit = extension_create_info->deinit, - .user_data = extension_create_info->user_data + .name = toString(extension_definition->name), + .version = toString(extension_definition->version), + .deinit = extension_definition->deinit, + .user_data = extension_definition->user_data }); if (extension) { return reinterpret_cast(extension); @@ -266,8 +261,8 @@ MinifiStatus MinifiRegisterProcessor(MinifiExtension* extension_handle, const Mi return MINIFI_STATUS_SUCCESS; } -MinifiExtension* MINIFI_CREATE_EXTENSION_FN(MinifiExtensionContext* extension_context, const MinifiExtensionCreateInfo* extension_create_info) { - return MinifiCreateExtension(extension_context, extension_create_info); +MinifiExtension* MINIFI_REGISTER_EXTENSION_FN(MinifiExtensionContext* extension_context, const MinifiExtensionDefinition* extension_definition) { + return MinifiRegisterExtension(extension_context, extension_definition); } MinifiStatus MinifiProcessContextGetProperty(MinifiProcessContext* context, MinifiStringView property_name, MinifiFlowFile* flowfile, diff --git a/libminifi/test/integration/extension-verification-test/CApiExtension.cpp b/libminifi/test/integration/extension-verification-test/CApiExtension.cpp index ad3c4a7a38..eb66d4e1b5 100644 --- a/libminifi/test/integration/extension-verification-test/CApiExtension.cpp +++ b/libminifi/test/integration/extension-verification-test/CApiExtension.cpp @@ -27,11 +27,11 @@ namespace minifi = org::apache::nifi::minifi; CEXTENSIONAPI const uint32_t MinifiApiVersion = MINIFI_TEST_API_VERSION; CEXTENSIONAPI void MinifiInitExtension(MinifiExtensionContext* extension_context) { - MinifiExtensionCreateInfo ext_create_info{ + MinifiExtensionDefinition extension_definition{ .name = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_NAME)), .version = minifi::api::utils::toStringView(MAKESTRING(EXTENSION_VERSION)), .deinit = nullptr, .user_data = nullptr }; - MinifiCreateExtension(extension_context, &ext_create_info); + MinifiRegisterExtension(extension_context, &extension_definition); } diff --git a/libminifi/test/integration/extension-verification-test/CMakeLists.txt b/libminifi/test/integration/extension-verification-test/CMakeLists.txt index 7f3146b195..e38accb0ea 100644 --- a/libminifi/test/integration/extension-verification-test/CMakeLists.txt +++ b/libminifi/test/integration/extension-verification-test/CMakeLists.txt @@ -69,11 +69,11 @@ endif() create_loading_test_extension(test-extension-loading-invalid-build-id-cpp CppApiExtension.cpp) target_link_libraries(test-extension-loading-invalid-build-id-cpp dummy-cpp-api) -target_compile_definitions(test-extension-loading-invalid-build-id-cpp PRIVATE MINIFI_CREATE_EXTENSION_FN=MinifiCreateCppExtension_NonMatchingBuildId) +target_compile_definitions(test-extension-loading-invalid-build-id-cpp PRIVATE MINIFI_REGISTER_EXTENSION_FN=MinifiRegisterCppExtension_NonMatchingBuildId) create_loading_test_extension(test-extension-loading-valid-build-id-cpp CppApiExtension.cpp) target_link_libraries(test-extension-loading-valid-build-id-cpp dummy-cpp-api) -target_compile_definitions(test-extension-loading-valid-build-id-cpp PRIVATE MINIFI_CREATE_EXTENSION_FN=MinifiCreateCppExtension_MatchingBuildId) +target_compile_definitions(test-extension-loading-valid-build-id-cpp PRIVATE MINIFI_REGISTER_EXTENSION_FN=MinifiRegisterCppExtension_MatchingBuildId) create_c_test_extension(max-version 10) create_c_test_extension(valid-version 7) diff --git a/libminifi/test/integration/extension-verification-test/CppApiExtension.cpp b/libminifi/test/integration/extension-verification-test/CppApiExtension.cpp index 04122d0366..e765c07939 100644 --- a/libminifi/test/integration/extension-verification-test/CppApiExtension.cpp +++ b/libminifi/test/integration/extension-verification-test/CppApiExtension.cpp @@ -25,11 +25,11 @@ namespace minifi = org::apache::nifi::minifi; extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context) { - MinifiExtensionCreateInfo ext_create_info{ + MinifiExtensionDefinition extension_definition{ .name = minifi::utils::toStringView(MAKESTRING(MODULE_NAME)), .version = minifi::utils::toStringView("1.0.0"), .deinit = nullptr, .user_data = nullptr }; - minifi::utils::MinifiCreateCppExtension(extension_context, &ext_create_info); + minifi::utils::MinifiRegisterCppExtension(extension_context, &extension_definition); } diff --git a/libminifi/test/integration/extension-verification-test/ExtensionVerificationTests.cpp b/libminifi/test/integration/extension-verification-test/ExtensionVerificationTests.cpp index 9475500e3e..a94474923e 100644 --- a/libminifi/test/integration/extension-verification-test/ExtensionVerificationTests.cpp +++ b/libminifi/test/integration/extension-verification-test/ExtensionVerificationTests.cpp @@ -18,7 +18,7 @@ #define CUSTOM_EXTENSION_INIT -#undef MINIFI_CREATE_EXTENSION_FN +#undef MINIFI_REGISTER_EXTENSION_FN #include "unit/TestBase.h" #include "unit/Catch.h" @@ -28,8 +28,8 @@ extern "C" { -MinifiExtension* MinifiCreateCppExtension_MatchingBuildId(MinifiExtensionContext* extension_context, const MinifiExtensionCreateInfo* extension_create_info) { - return MinifiCreateExtension(extension_context, extension_create_info); +MinifiExtension* MinifiRegisterCppExtension_MatchingBuildId(MinifiExtensionContext* extension_context, const MinifiExtensionDefinition* extension_definition) { + return MinifiRegisterExtension(extension_context, extension_definition); } } // extern "C" @@ -93,7 +93,7 @@ TEST_CASE("Can't load c-api extensions with no MinifiInitExtension function") { REQUIRE(minifi::test::utils::verifyLogLinePresenceInPollTime(0s, "Failed to load as c extension 'test-extension-loading-missing-init'")); } -TEST_CASE("Can't load c-api extensions with no MinifiCreateExtension call") { +TEST_CASE("Can't load c-api extensions with no MinifiRegisterExtension call") { ExtensionLoadingTestController controller{"*test-extension-loading-create-not-called*"}; REQUIRE(minifi::test::utils::verifyLogLinePresenceInPollTime(0s, "Failed to initialize extension 'test-extension-loading-create-not-called'")); } diff --git a/libminifi/test/integration/extension-verification-test/dummy-cpp-api.def b/libminifi/test/integration/extension-verification-test/dummy-cpp-api.def index 3971f17df5..dfde648df7 100644 --- a/libminifi/test/integration/extension-verification-test/dummy-cpp-api.def +++ b/libminifi/test/integration/extension-verification-test/dummy-cpp-api.def @@ -1,4 +1,4 @@ LIBRARY ExtensionVerificationTests.exe EXPORTS - MinifiCreateCppExtension_NonMatchingBuildId - MinifiCreateCppExtension_MatchingBuildId + MinifiRegisterCppExtension_NonMatchingBuildId + MinifiRegisterCppExtension_MatchingBuildId diff --git a/minifi-api/CMakeLists.txt b/minifi-api/CMakeLists.txt index ebdd239c37..a242392f48 100644 --- a/minifi-api/CMakeLists.txt +++ b/minifi-api/CMakeLists.txt @@ -6,7 +6,7 @@ target_compile_definitions(minifi-api-common INTERFACE MINIFI_VERSION_STR="${MIN add_library(minifi-api INTERFACE) target_include_directories(minifi-api INTERFACE include) target_link_libraries(minifi-api INTERFACE minifi-api-common) -target_compile_definitions(minifi-api INTERFACE MINIFI_CREATE_EXTENSION_FN=MinifiCreateCppExtension_${BUILD_IDENTIFIER}) +target_compile_definitions(minifi-api INTERFACE MINIFI_REGISTER_EXTENSION_FN=MinifiRegisterCppExtension_${BUILD_IDENTIFIER}) add_library(minifi-c-api INTERFACE) target_include_directories(minifi-c-api INTERFACE include/minifi-c) diff --git a/minifi-api/include/minifi-c/minifi-c.h b/minifi-api/include/minifi-c/minifi-c.h index 86dc7b407e..edf8c79ba7 100644 --- a/minifi-api/include/minifi-c/minifi-c.h +++ b/minifi-api/include/minifi-c/minifi-c.h @@ -37,12 +37,12 @@ extern "C" { #define MINIFI_NULL nullptr #define MINIFI_OWNED -#ifndef MINIFI_CREATE_EXTENSION_FN -#define MINIFI_CREATE_EXTENSION_FN MinifiCreateExtension +#ifndef MINIFI_REGISTER_EXTENSION_FN +#define MINIFI_REGISTER_EXTENSION_FN MinifiRegisterExtension #endif enum : uint32_t { - MINIFI_API_VERSION = 1 + MINIFI_API_VERSION = 2 }; typedef bool MinifiBool; @@ -183,14 +183,17 @@ typedef struct MinifiProcessorClassDefinition { MinifiProcessorCallbacks callbacks; } MinifiProcessorClassDefinition; -typedef struct MinifiExtensionCreateInfo { +typedef struct MinifiExtensionDefinition { MinifiStringView name; MinifiStringView version; void(*deinit)(void* user_data); void* user_data; -} MinifiExtensionCreateInfo; +} MinifiExtensionDefinition; -MinifiExtension* MINIFI_CREATE_EXTENSION_FN(MinifiExtensionContext* extension_context, const MinifiExtensionCreateInfo* create_info); +// When directly linking against the agent library (legacy c++ extension) this declares a build identifier dependent function +// which prevents loading extensions from different builds (e.g. the agent provides MinifiRegisterCppExtension_123 but the extension +// expects MinifiRegisterCppExtension_567). Otherwise, it declares MinifiRegisterExtension. +MinifiExtension* MINIFI_REGISTER_EXTENSION_FN(MinifiExtensionContext* extension_context, const MinifiExtensionDefinition* extension_definition); MinifiStatus MinifiRegisterProcessor(MinifiExtension* extension, const MinifiProcessorClassDefinition* processor); diff --git a/minifi-api/minifi-c-api.def b/minifi-api/minifi-c-api.def index a22f8c696e..8b41b8f25a 100644 --- a/minifi-api/minifi-c-api.def +++ b/minifi-api/minifi-c-api.def @@ -1,6 +1,6 @@ LIBRARY core-minifi.dll EXPORTS - MinifiCreateExtension + MinifiRegisterExtension MinifiRegisterProcessor MinifiPublishedMetricsCreate MinifiProcessContextGetProperty From a6eac21b50f1ab7422748aa28602ce70cf9f8cbc Mon Sep 17 00:00:00 2001 From: Adam Debreceni Date: Mon, 20 Apr 2026 11:57:25 +0200 Subject: [PATCH 4/4] MINIFICPP-2752 - Fix build --- Extensions.md | 4 ++-- extensions/aws/AwsLoader.cpp | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Extensions.md b/Extensions.md index c4f4437a02..11c96b93d6 100644 --- a/Extensions.md +++ b/Extensions.md @@ -73,10 +73,10 @@ REGISTER_RESOURCE(RESTSender, DescriptionOnly); ``` Some extensions (e.g. `OpenCVExtension`) require initialization before use. -You need to define an `MinifiInitCppExtension` function of type `MinifiExtension*(MinifiConfig*)` to be called. +You need to define an `MinifiInitCppExtension` function of type `MinifiExtension*(MinifiExtensionContext*)` to be called. ```C++ -extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig* /*config*/) { +extern "C" void MinifiInitCppExtension(MinifiExtensionContext* /*extension_context*/) { const auto success = org::apache::nifi::minifi::utils::Environment::setEnvironmentVariable("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;udp", false /*overwrite*/); if (!success) { return nullptr; diff --git a/extensions/aws/AwsLoader.cpp b/extensions/aws/AwsLoader.cpp index ff33b2a57f..8ff738058e 100644 --- a/extensions/aws/AwsLoader.cpp +++ b/extensions/aws/AwsLoader.cpp @@ -50,19 +50,17 @@ void deinit(gsl::owner sdk_opts_ptr) { } } // namespace org::apache::nifi::minifi::aws::init -extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig*) { +extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context) { using minifi::aws::init::toStringView; auto sdk_options = std::make_unique(); Aws::InitAPI(*sdk_options); Aws::Utils::Logging::InitializeAWSLogging(std::make_shared()); - MinifiExtensionCreateInfo ext_create_info{.name = toStringView(MAKESTRING(MODULE_NAME)), + MinifiExtensionDefinition ext_definition{.name = toStringView(MAKESTRING(MODULE_NAME)), .version = toStringView(minifi::AgentBuild::VERSION), .deinit = &minifi::aws::init::deinit, - .user_data = sdk_options.get(), - .processors_count = 0, - .processors_ptr = nullptr}; + .user_data = sdk_options.get()}; - minifi::utils::MinifiCreateCppExtension(extension, &ext_create_info); + minifi::utils::MinifiRegisterCppExtension(extension_context, &ext_definition); std::ignore = sdk_options.release(); // ownership is transferred to deinit }