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