You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by ph...@apache.org on 2018/10/24 22:50:47 UTC
nifi-minifi-cpp git commit: MINIFICPP-644 - C API: add support to
register terminate handler
Repository: nifi-minifi-cpp
Updated Branches:
refs/heads/master 1a50a4ab0 -> 0043155dc
MINIFICPP-644 - C API: add support to register terminate handler
This closes #422.
Signed-off-by: Marc Parisi <ph...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/commit/0043155d
Tree: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/tree/0043155d
Diff: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/diff/0043155d
Branch: refs/heads/master
Commit: 0043155dce73ded463f42c80de142ce908a9c08b
Parents: 1a50a4a
Author: Arpad Boda <ab...@hortonworks.com>
Authored: Tue Oct 9 17:56:38 2018 +0200
Committer: Marc Parisi <ph...@apache.org>
Committed: Wed Oct 24 18:50:34 2018 -0400
----------------------------------------------------------------------
LibExample/CMakeLists.txt | 28 ++++++++++------
LibExample/generate_flow.c | 3 +-
LibExample/terminate_handler.c | 58 ++++++++++++++++++++++++++++++++++
libminifi/include/capi/api.h | 2 ++
libminifi/src/capi/api.cpp | 5 +++
libminifi/test/capi/CAPITests.cpp | 2 +-
6 files changed, 86 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/0043155d/LibExample/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/LibExample/CMakeLists.txt b/LibExample/CMakeLists.txt
index ff076b0..88901cc 100644
--- a/LibExample/CMakeLists.txt
+++ b/LibExample/CMakeLists.txt
@@ -23,7 +23,7 @@ IF(POLICY CMP0048)
CMAKE_POLICY(SET CMP0048 OLD)
ENDIF(POLICY CMP0048)
-include_directories(../blocks/ ../libminifi/include ../libminifi/include/c2 ../libminifi/include/c2/protocols/ ../libminifi/include/core/state ./libminifi/include/core/statemanagement/metrics ../libminifi/include/core/yaml ../libminifi/include/core ../thirdparty/spdlog-20170710/include ../thirdparty/concurrentqueue ../thirdparty/yaml-cpp-yaml-cpp-20171024/include ../thirdparty/civetweb-1.9.1/include ../thirdparty/)
+include_directories(../blocks/ ../libminifi/include ../libminifi/include/c2 ../libminifi/include/c2/protocols/ ../libminifi/include/core/state ./libminifi/include/core/statemanagement/metrics ../libminifi/include/core/yaml ../libminifi/include/core ../thirdparty/spdlog-20170710/include ../thirdparty/concurrentqueue ../thirdparty/yaml-cpp-yaml-cpp-20171024/include ../thirdparty/civetweb-1.9.1/include ../thirdparty/)
include(CheckCXXCompilerFlag)
if (WIN32)
@@ -46,23 +46,33 @@ endif()
endif()
+if (WIN32)
+ set(LINK_FLAGS "/WHOLEARCHIVE")
+ set(LINK_END_FLAGS "")
+elseif (APPLE)
+ set(LINK_FLAGS "-Wl,-all_load")
+ set(LINK_END_FLAGS "")
+else ()
+ set(LINK_FLAGS "-Wl,--whole-archive")
+ set(LINK_END_FLAGS "-Wl,--no-whole-archive")
+endif ()
add_executable(generate_flow generate_flow.c)
-target_link_libraries(generate_flow capi core-minifi minifi ${CMAKE_THREAD_LIBS_INIT})
-
-if (NOT WIN32)
-
-add_executable(transmit_flow transmit_flow.c)
+add_executable(terminate_handler terminate_handler.c)
-target_link_libraries(transmit_flow capi core-minifi minifi ${CMAKE_THREAD_LIBS_INIT})
+target_link_libraries(generate_flow capi ${CMAKE_THREAD_LIBS_INIT} ${LINK_FLAGS} minifi ${LINK_END_FLAGS})
+target_link_libraries(terminate_handler capi ${CMAKE_THREAD_LIBS_INIT} ${LINK_FLAGS} minifi ${LINK_END_FLAGS})
+if (NOT WIN32)
+add_executable(transmit_flow transmit_flow.c)
+target_link_libraries(transmit_flow capi ${CMAKE_THREAD_LIBS_INIT} ${LINK_FLAGS} minifi ${LINK_END_FLAGS})
add_executable(monitor_directory monitor_directory.c)
-target_link_libraries(monitor_directory capi core-minifi minifi ${CMAKE_THREAD_LIBS_INIT})
+target_link_libraries(monitor_directory capi ${CMAKE_THREAD_LIBS_INIT} ${LINK_FLAGS} minifi ${LINK_END_FLAGS})
-endif()
\ No newline at end of file
+endif()
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/0043155d/LibExample/generate_flow.c
----------------------------------------------------------------------
diff --git a/LibExample/generate_flow.c b/LibExample/generate_flow.c
index 923ddb4..eb5e7a3 100644
--- a/LibExample/generate_flow.c
+++ b/LibExample/generate_flow.c
@@ -22,7 +22,6 @@
#include <sys/stat.h>
#include "capi/api.h"
-
/**
* This is an example of the C API that transmits a flow file to a remote instance.
*/
@@ -42,7 +41,7 @@ int main(int argc, char **argv) {
nifi_instance *instance = create_instance(instance_str, &port);
- flow *new_flow = create_flow(instance,"GenerateFlowFile");
+ flow *new_flow = create_flow(instance, "GenerateFlowFile");
flow_file_record *record = get_next_flow_file(instance, new_flow );
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/0043155d/LibExample/terminate_handler.c
----------------------------------------------------------------------
diff --git a/LibExample/terminate_handler.c b/LibExample/terminate_handler.c
new file mode 100644
index 0000000..daa9f3b
--- /dev/null
+++ b/LibExample/terminate_handler.c
@@ -0,0 +1,58 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include "capi/api.h"
+
+/**
+ * This is an example of the C API that registers terminate handler and generates an exception.
+ */
+
+void example_terminate_handler() {
+ fprintf(stderr, "Unhandled exception! Let's pretend that this is normal!");
+ exit(0);
+}
+
+int main(int argc, char **argv) {
+
+ nifi_port port;
+
+ port.port_id = "12345";
+
+ set_terminate_callback(example_terminate_handler);
+
+ nifi_instance *instance = create_instance("random instance", &port);
+
+ flow *new_flow = create_flow(instance, "GenerateFlowFile");
+
+ processor *put_proc = add_processor_with_linkage(new_flow, "PutFile");
+
+ // Target directory for PutFile is missing, it's not allowed to create, so tries to transmit to failure relationship
+ // As it doesn't exist, an exception is thrown
+ set_property(put_proc, "Directory", "/tmp/never_existed");
+ set_property(put_proc, "Create Missing Directories", "false");
+
+ flow_file_record *record = get_next_flow_file(instance, new_flow );
+
+ // Here be dragons - nothing below this line gets executed
+ fprintf(stderr, "Dragons!!!");
+ free_flowfile(record);
+ free_flow(new_flow);
+ free_instance(instance);
+}
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/0043155d/libminifi/include/capi/api.h
----------------------------------------------------------------------
diff --git a/libminifi/include/capi/api.h b/libminifi/include/capi/api.h
index 2b3622d..4e319ef 100644
--- a/libminifi/include/capi/api.h
+++ b/libminifi/include/capi/api.h
@@ -37,6 +37,8 @@ extern "C" {
void enable_logging();
+void set_terminate_callback(void (*terminate_callback)());
+
/****
* ##################################################################
* BASE NIFI OPERATIONS
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/0043155d/libminifi/src/capi/api.cpp
----------------------------------------------------------------------
diff --git a/libminifi/src/capi/api.cpp b/libminifi/src/capi/api.cpp
index 66ed19b..21010a1 100644
--- a/libminifi/src/capi/api.cpp
+++ b/libminifi/src/capi/api.cpp
@@ -19,6 +19,7 @@
#include <map>
#include <memory>
#include <utility>
+#include <exception>
#include "core/Core.h"
#include "capi/api.h"
#include "capi/expect.h"
@@ -47,6 +48,10 @@ void enable_logging() {
logging::LoggerConfiguration::getConfiguration().enableLogging();
}
+void set_terminate_callback(void (*terminate_callback)()) {
+ std::set_terminate(terminate_callback);
+}
+
class DirectoryConfiguration {
protected:
DirectoryConfiguration() {
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/0043155d/libminifi/test/capi/CAPITests.cpp
----------------------------------------------------------------------
diff --git a/libminifi/test/capi/CAPITests.cpp b/libminifi/test/capi/CAPITests.cpp
index 08214ac..d4e1c49 100644
--- a/libminifi/test/capi/CAPITests.cpp
+++ b/libminifi/test/capi/CAPITests.cpp
@@ -185,7 +185,7 @@ TEST_CASE("Test manipulation of attributes", "[testAttributes]") {
const char * new_testattr_value = "S0me t3st t3xt";
// Attribute already exist, should fail
- REQUIRE(add_attribute(record, test_attr.key, (void* )new_testattr_value, strlen(new_testattr_value)) != 0); // NOLINT
+ REQUIRE(add_attribute(record, test_attr.key, (void*) new_testattr_value, strlen(new_testattr_value)) != 0); // NOLINT
// Update overwrites values
update_attribute(record, test_attr.key, (void*) new_testattr_value, strlen(new_testattr_value)); // NOLINT