From 876c78aebf3a5d4d849bd0119b50907c07e9ee54 Mon Sep 17 00:00:00 2001 From: Sergey Yakubov <sergey.yakubov@desy.de> Date: Tue, 20 Jul 2021 15:53:22 +0200 Subject: [PATCH] fix memleak --- producer/api/c/include/asapo/producer_c.h | 1 - producer/api/cpp/src/producer_c_glue.cpp | 37 ++++++++++++----------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/producer/api/c/include/asapo/producer_c.h b/producer/api/c/include/asapo/producer_c.h index 02b46d418..ec90bdcb7 100644 --- a/producer/api/c/include/asapo/producer_c.h +++ b/producer/api/c/include/asapo/producer_c.h @@ -156,7 +156,6 @@ int asapo_producer_send_stream_metadata(AsapoProducerHandle producer, AsapoRequestCallback callback, AsapoErrorHandle* error); -AsapoMessageDataHandle asapo_request_callback_payload_get_data(AsapoRequestCallbackPayloadHandle handle); AsapoStringHandle asapo_request_callback_payload_get_response(AsapoRequestCallbackPayloadHandle handle); const struct AsapoGenericRequestHeader* asapo_request_callback_payload_get_original_header( AsapoRequestCallbackPayloadHandle handle); diff --git a/producer/api/cpp/src/producer_c_glue.cpp b/producer/api/cpp/src/producer_c_glue.cpp index bb7d314c0..40920cb4a 100644 --- a/producer/api/cpp/src/producer_c_glue.cpp +++ b/producer/api/cpp/src/producer_c_glue.cpp @@ -12,6 +12,8 @@ typedef AsapoHandlerHolder<asapo::Producer>* AsapoProducerHandle; typedef AsapoHandlerHolder<asapo::RequestCallbackPayload>* AsapoRequestCallbackPayloadHandle; typedef AsapoHandlerHolder<asapo::MessageHeader>* AsapoMessageHeaderHandle; + + extern "C" { #include "asapo/producer_c.h" static_assert(kOpcodeUnknownOp == asapo::Opcode::kOpcodeUnknownOp&& @@ -142,16 +144,18 @@ extern "C" { auto_id != 0)); } -#define BUILD_WRAPPER asapo::RequestCallback wrapper = [ = ](asapo::RequestCallbackPayload payload, asapo::Error err) -> void { \ - void* data = (void*) payload.data.release(); \ - auto payLoadHandle = new AsapoHandlerHolder<asapo::RequestCallbackPayload>(&payload, false); \ - auto errorHandle = new AsapoHandlerHolder<asapo::ErrorInterface>(err.release()); \ - if (callback != NULL) { \ - callback(data,payLoadHandle, errorHandle); \ - } \ - delete errorHandle; \ - delete payLoadHandle; \ - } + extern "C++" asapo::RequestCallback GetWrapper(AsapoRequestCallback callback, bool release_data) { + return [ = ](asapo::RequestCallbackPayload payload, asapo::Error err) -> void { + void* data = release_data ? (void*) payload.data.release() : NULL; + auto payLoadHandle = new AsapoHandlerHolder<asapo::RequestCallbackPayload>(&payload, false); + auto errorHandle = new AsapoHandlerHolder<asapo::ErrorInterface>(err.release()); + if (callback != NULL) { + callback(data, payLoadHandle, errorHandle); + } + delete errorHandle; + delete payLoadHandle; + }; + } int asapo_producer_send(AsapoProducerHandle producer, const AsapoMessageHeaderHandle message_header, @@ -160,7 +164,7 @@ extern "C" { const char* stream, AsapoRequestCallback callback, AsapoErrorHandle* error) { - BUILD_WRAPPER; + auto wrapper = GetWrapper(callback, true); auto err = producer->handle->Send__(*message_header->handle, data, ingest_mode, @@ -175,7 +179,7 @@ extern "C" { const char* stream, AsapoRequestCallback callback, AsapoErrorHandle* error) { - BUILD_WRAPPER; + auto wrapper = GetWrapper(callback, true); auto err = producer->handle->SendFile(*message_header->handle, file_name, ingest_mode, @@ -189,7 +193,7 @@ extern "C" { const char* next_stream, AsapoRequestCallback callback, AsapoErrorHandle* error) { - BUILD_WRAPPER; + auto wrapper = GetWrapper(callback, false); auto err = producer->handle->SendStreamFinishedFlag(stream, last_id, next_stream, @@ -202,7 +206,7 @@ extern "C" { AsapoBool upsert, AsapoRequestCallback callback, AsapoErrorHandle* error) { - BUILD_WRAPPER; + auto wrapper = GetWrapper(callback, false); asapo::MetaIngestMode im(static_cast<asapo::MetaIngestOp>(mode), upsert != 0); auto err = producer->handle->SendBeamtimeMetadata(metadata, im, @@ -217,7 +221,7 @@ extern "C" { const char* stream, AsapoRequestCallback callback, AsapoErrorHandle* error) { - BUILD_WRAPPER; + auto wrapper = GetWrapper(callback, false); asapo::MetaIngestMode im(static_cast<asapo::MetaIngestOp>(mode), upsert != 0); auto err = producer->handle->SendStreamMetadata(metadata, im, @@ -226,9 +230,6 @@ extern "C" { return process_error(error, std::move(err)); } - AsapoMessageDataHandle asapo_request_callback_payload_get_data(AsapoRequestCallbackPayloadHandle handle) { - return new typename std::remove_pointer<AsapoMessageDataHandle>::type(handle->handle->data); - } AsapoStringHandle asapo_request_callback_payload_get_response(AsapoRequestCallbackPayloadHandle handle) { return new typename std::remove_pointer<AsapoStringHandle>::type(handle->handle->response); } -- GitLab