Fix memory leak caught by LSAN

This commit is contained in:
Tyler Neely 2022-07-08 11:04:44 +00:00
parent 25b0a445b9
commit eee2a7e019
3 changed files with 17 additions and 4 deletions

View File

@ -143,7 +143,8 @@ class OpaquePromise {
.request_id = opaque_message.request_id,
.from_address = opaque_message.from_address};
ResponsePromise<T> *promise = static_cast<ResponsePromise<T> *>(this_ptr);
promise->Fill(std::move(response_envelope));
auto unique_promise = std::unique_ptr<ResponsePromise<T>>(promise);
unique_promise->Fill(std::move(response_envelope));
}),
time_out_([](void *ptr) {
ResponseResult<T> result = TimedOut{};
@ -163,6 +164,7 @@ class OpaquePromise {
void Fill(OpaqueMessage &&opaque_message) {
MG_ASSERT(ptr_ != nullptr);
fill_(ptr_, std::move(opaque_message));
ptr_ = nullptr;
}
~OpaquePromise() {

View File

@ -26,6 +26,9 @@ using memgraph::utils::BasicResult;
class SimulatorHandle;
template <typename I>
class Io;
template <typename T>
concept Message = requires(T a, uint8_t *ptr, size_t len) {
// These are placeholders and will be replaced
@ -56,6 +59,11 @@ struct RequestEnvelope {
std::variant<Ms...> message;
uint64_t request_id;
Address from_address;
template <Message T, typename I>
void Reply(T response, Io<I> &io) {
io.Send(from_address, request_id, response);
}
};
template <Message... Ms>

View File

@ -44,17 +44,18 @@ int main() {
// send request
RequestMsg cli_req;
cli_req.data = "hello";
ResponseFuture<ResponseMsg> response_future = cli_io.template Request<RequestMsg, ResponseMsg>(srv_addr, cli_req);
ResponseFuture<ResponseMsg> response_future = cli_io.Request<RequestMsg, ResponseMsg>(srv_addr, cli_req);
// receive request
RequestResult<RequestMsg> request_result = srv_io.template Receive<RequestMsg>();
RequestResult<RequestMsg> request_result = srv_io.Receive<RequestMsg>();
auto request_envelope = request_result.GetValue();
RequestMsg req = std::get<RequestMsg>(request_envelope.message);
auto srv_res = ResponseMsg{req.data};
// send response
srv_io.Send(request_envelope.from_address, request_envelope.request_id, srv_res);
// srv_io.Send(request_envelope.from_address, request_envelope.request_id, srv_res);
request_envelope.Reply(srv_res, srv_io);
// receive response
auto response_result = response_future.Wait();
@ -62,5 +63,7 @@ int main() {
MG_ASSERT(response_envelope.message.data == "hello");
std::cout << "IT WORKED :)" << std::endl;
return 0;
}