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
<[email protected]>
On Thu, May 6, 2021 at 5:48 AM Marco Guest <[email protected]> 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
>