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

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

commit 9fc45a8ca5e45e9a333091f64405c4d5f8298299
Author: Martin Zink <[email protected]>
AuthorDate: Mon Mar 30 17:36:47 2026 +0200

    MINIFICPP-2752 - Register processors one-by-one
    #2150
---
 Extensions.md                                      | 21 +++++----
 .../include/utils/ExtensionInitUtils.h             |  4 +-
 extensions/ExtensionInitializer.cpp                |  8 ++--
 .../llamacpp/processors/ExtensionInitializer.cpp   | 19 ++++----
 extensions/opencv/OpenCVLoader.cpp                 |  8 ++--
 .../python/pythonlibloader/PythonLibLoader.cpp     | 10 ++---
 extensions/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 +++++++++++++---------
 .../extension-verification-test/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 +
 17 files changed, 106 insertions(+), 101 deletions(-)

diff --git a/Extensions.md b/Extensions.md
index f75c068e6..c002c96ce 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<minifi::extensions::llamacpp::processors::RunLlamaCppInference>([&]
 (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/extension-framework/include/utils/ExtensionInitUtils.h 
b/extension-framework/include/utils/ExtensionInitUtils.h
index 75da5c1ae..bde5fe1f0 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::optional<std::string>(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 47a4c2185..288615f72 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 4b3c5b4e0..ac5e0519d 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<minifi::extensions::llamacpp::processors::RunLlamaCppInference>([&]
 (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 87c6615c5..65860a267 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 79ef21556..9395e1f49 100644
--- a/extensions/python/pythonlibloader/PythonLibLoader.cpp
+++ b/extensions/python/pythonlibloader/PythonLibLoader.cpp
@@ -98,10 +98,10 @@ class PythonLibLoader {
   std::shared_ptr<minifi::core::logging::Logger> logger_ = 
minifi::core::logging::LoggerFactory<PythonLibLoader>::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::string> {
     std::optional<std::string> 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<std::optional<std::string>*>(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 e92bbea41..e6bb76f61 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::string> {
     std::optional<std::string> 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<std::optional<std::string>*>(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 c8309cc60..b7df94ec9 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 85cf4fc60..2db7e9420 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<minifi::Configure> config;
+    std::function<Extension*(Info)> 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<minifi::Configure>& configure);
 
-  bool setInfo(Info info);
+  std::optional<Info> 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 f8ca0f5f0..1e600d3b5 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<minifi::Configure>& 
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<minifi::Configure>& configure)
     return false;
   }
   logger_->log_debug("Found initializer for '{}'", library_name_);
-  auto init_fn = reinterpret_cast<void(*)(MinifiExtension*, 
MinifiConfig*)>(init_symbol_ptr);
-  auto config_handle = reinterpret_cast<MinifiConfig*>(configure.get());
-  auto extension_handle = reinterpret_cast<MinifiExtension*>(this);
-  init_fn(extension_handle, config_handle);
+
+  auto init_fn = 
reinterpret_cast<void(*)(MinifiExtensionContext*)>(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<MinifiExtensionContext*>(&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 55fe7cf8d..bf9c5e84c 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<CProcessorFactory>(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<org::apache::nifi::minifi::core::extension::Extension*>(extension)->setInfo(org::apache::nifi::minifi::core::extension::Extension::Info{
+  auto* extension = 
reinterpret_cast<org::apache::nifi::minifi::core::extension::Extension::Context*>(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<MinifiExtension*>(extension);
+  }
+  return MINIFI_NULL;
+}
+
+MinifiStatus MinifiRegisterProcessor(MinifiExtension* extension_handle, const 
MinifiProcessorClassDefinition* processor) {
+  gsl_Assert(extension_handle);
+  gsl_Assert(processor);
+  auto extension_info = 
reinterpret_cast<org::apache::nifi::minifi::core::extension::Extension*>(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<CProcessorFactory>(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<minifi::core::ProcessContext*>(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<minifi::Configure*>(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<org::apache::nifi::minifi::core::extension::Extension::Context*>(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 18f47f280..ad3c4a7a3 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 59daee45d..04122d036 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 276ffa6d5..7be0a0fea 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 86084f80d..9475500e3 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 a2f0349ac..86dc7b407 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 9e1592b3a..a22f8c696 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

Reply via email to