Hi,

the custom deallocator is actually an interesting idea, though the
general pattern to deallocate the memory is something like:

===

char* payload = new char[1024];
Message msg = MessageBuilder()
                  .setAllocatedContent(payload, sizeof(payload))
                  .build();
producer.sendAsync(msg, [&](Result res, const MessageId& messageId) {
    if (res == ResultOk) {
        // message was published correctly
    } else {
        // publish error
    }
    delete[] payload;
});
===

Does that work for you?


--
Matteo Merli
<mme...@apache.org>


On Thu, May 6, 2021 at 5:48 AM Marco Guest <marcogues...@gmail.com> wrote:
>
> Hi,
> I am implementing a message exchange between C++ applications using Pulsar 
> technology.
> To improve performances I would like to avoid copying my application data 
> when creating a new Pulsar::Message.
> For this reason I would like to use 
> pulsar::MessageBuilder::setAllocatedContent().
> However I’m in trouble currently because I don’t have a way to specify to 
> pulsar-client-cpp how to deallocate the buffer provided to 
> setAllocatedContent().
>
> Moreover the current documentation is a bit unclear about this aspect:
>   “The caller is responsible to ensure the memory buffer is valid until the 
> message has been persisted (or an error is returned).”
> It’s not clear honestly when the message “has been persisted” in my opinion 
> given that the underlying PulsarMessageImpl is a refcounted data structure 
> and so it’s hard to tell when its refcount goes to zero (e.g. imagine some 
> Pulsar::Message being saved into some data structure for later use).
>
> Would you accept a patch that expands the arguments of 
> pulsar::MessageBuilder::setAllocatedContent() by taking a deallocation 
> function pointer as well?
>
> Thanks,
> Marco
>

Reply via email to