diff --git a/src/internal/mana_c_api.h b/src/internal/mana_c_api.h index e9af781..2afc5ad 100644 --- a/src/internal/mana_c_api.h +++ b/src/internal/mana_c_api.h @@ -33,13 +33,28 @@ extern "C" size_t size_bytes; } mana_offset_array_t; + typedef enum + { + mana_status_ok, + mana_status_invalid_argument, + mana_status_internal_error, + } mana_status_code_t; + + typedef struct + { + mana_status_code_t code; + char message[256]; + } mana_status_t; + #define MANA_DEFINE_PLUGIN_INIT(name) void *name(int plugin_argc, const char **plugin_argv) #define MANA_DEFINE_PLUGIN_SHUTDOWN(name) void name(void *context) -#define MANA_DEFINE_PLUGIN_BEGIN_RUN(name) void name(void *context, const char *descriptor_json) +#define MANA_DEFINE_PLUGIN_BEGIN_RUN(name) \ + mana_status_t name(void *context, const char *descriptor_json) -#define MANA_DEFINE_PLUGIN_END_RUN(name) void name(void *context, const char *descriptor_json) +#define MANA_DEFINE_PLUGIN_END_RUN(name) \ + mana_status_t name(void *context, const char *descriptor_json) #define MANA_DEFINE_PLUGIN_EVENT_DATA(name) \ void name(void *context, uint16_t eventIndex, mana_offset_array_t *arrays, size_t arrayCount, \ diff --git a/src/internal/mana_lib.hpp b/src/internal/mana_lib.hpp index ebba36d..eb2e3fe 100644 --- a/src/internal/mana_lib.hpp +++ b/src/internal/mana_lib.hpp @@ -230,6 +230,16 @@ inline std::string to_string(const ManaSinkPerfProxy::Perf &perf) totalHits, MiB, elapsed_s, hit_s, MiB_s); } +struct mana_c_error: public std::exception +{ + mana_status_t status; + mana_c_error(const mana_status_t &status_) + : status(status_) + { + } + const char *what() const noexcept override { return status.message; } +}; + // wraps a mana_api.h mana_sink_plugin_t instance struct ManaCSink: public IManaSink { @@ -248,17 +258,27 @@ struct ManaCSink: public IManaSink void begin_run(const char *descriptor_json) override { - plugin_.begin_run(context_, descriptor_json); + if (auto status = plugin_.begin_run(context_, descriptor_json); + status.code != mana_status_ok) + { + throw mana_c_error(status); + } } + void end_run(const char *descriptor_json) override { - plugin_.end_run(context_, descriptor_json); + if (auto status = plugin_.end_run(context_, descriptor_json); status.code != mana_status_ok) + { + throw mana_c_error(status); + } } + void process_event(uint16_t eventIndex, mana_offset_array_t *arrays, size_t arrayCount, size_t totalBytes) override { plugin_.process_event(context_, eventIndex, arrays, arrayCount, totalBytes); } + void process_system_event(const uint32_t *data, size_t size) override { plugin_.process_system_event(context_, data, size); diff --git a/src/mana_plugin_c_test.c b/src/mana_plugin_c_test.c index aea1350..1973912 100644 --- a/src/mana_plugin_c_test.c +++ b/src/mana_plugin_c_test.c @@ -27,12 +27,20 @@ MANA_DEFINE_PLUGIN_BEGIN_RUN(begin_run) log_info("begin_run: ctx=%p", context); /* pretty useless as the json needs to be parsed back into some c structure describing the input */ + mana_status_t result; + result.code = mana_status_ok; + strncpy(result.message, "ok", sizeof(result.message)); + return result; } MANA_DEFINE_PLUGIN_END_RUN(end_run) { (void)descriptor_json; log_info("end: ctx=%p", context); + mana_status_t result; + result.code = mana_status_ok; + strncpy(result.message, "ok", sizeof(result.message)); + return result; } MANA_DEFINE_PLUGIN_EVENT_DATA(process_event) diff --git a/src/mana_plugin_python.cc b/src/mana_plugin_python.cc index 4b985e5..5c4f67b 100644 --- a/src/mana_plugin_python.cc +++ b/src/mana_plugin_python.cc @@ -62,6 +62,12 @@ MANA_DEFINE_PLUGIN_BEGIN_RUN(begin_run) auto &jEvent = jRun["events"][ei]; ctx->eventBuffers[ei].resize(jEvent["outputs"].size()); } + + // TODO: check the above for errors and return a proper status + mana_status_t result; + result.code = mana_status_ok; + strncpy(result.message, "ok", sizeof(result.message)); + return result; } MANA_DEFINE_PLUGIN_END_RUN(end_run) @@ -69,6 +75,12 @@ MANA_DEFINE_PLUGIN_END_RUN(end_run) log_info("end: ctx=%p", context); auto ctx = reinterpret_cast(context); ctx->py_end_run(descriptor_json); + + // TODO: check the above for errors and return a proper status + mana_status_t result; + result.code = mana_status_ok; + strncpy(result.message, "ok", sizeof(result.message)); + return result; } MANA_DEFINE_PLUGIN_EVENT_DATA(process_event)