Fix RT memory leak with completion messages found by Ted Moore

A paradigmatic example of why raw pointers are hard: ASyncCmd takes 
ownership of the cmd pointer, but *copies* the completion message (so we 
still need to free the latter)
nix
Owen Green 5 years ago
parent 4c1db2cb23
commit 60659962a2

@ -152,8 +152,9 @@ struct FluidSCMessaging{
args->getb(completionMsgData, completionMsgSize); args->getb(completionMsgData, completionMsgSize);
} }
auto ft = getInterfaceTable();
getInterfaceTable()->fDoAsynchronousCommand(inWorld, replyAddr, getName(), msg,
ft->fDoAsynchronousCommand(inWorld, replyAddr, getName(), msg,
[](World* world, void* data) // NRT thread: invocation [](World* world, void* data) // NRT thread: invocation
{ {
MessageData* m = static_cast<MessageData*>(data); MessageData* m = static_cast<MessageData*>(data);
@ -191,6 +192,9 @@ struct FluidSCMessaging{
delete m; delete m;
}, },
static_cast<int>(completionMsgSize), completionMsgData); static_cast<int>(completionMsgSize), completionMsgData);
if(completionMsgSize) ft->fRTFree(inWorld, completionMsgData);
} }
template <size_t N, typename ArgsTuple, size_t... Is> // Call from NRT template <size_t N, typename ArgsTuple, size_t... Is> // Call from NRT

@ -663,6 +663,9 @@ namespace impl {
args->getb(completionMsgData, completionMsgSize); args->getb(completionMsgData, completionMsgSize);
} }
runAsyncCommand(world, cmd, replyAddr, completionMsgSize, completionMsgData); runAsyncCommand(world, cmd, replyAddr, completionMsgSize, completionMsgData);
if(completionMsgSize) ft->fRTFree(world, completionMsgData);
}; };
ft->fDefinePlugInCmd(Command::name(),commandRunner,nullptr); ft->fDefinePlugInCmd(Command::name(),commandRunner,nullptr);
} }

Loading…
Cancel
Save