Try and fix thread callback double-free crash by going via RT message queue

nix
Owen Green 5 years ago
parent 54cda6c78b
commit 360155f4c4

@ -70,7 +70,7 @@ namespace impl {
} }
else //client has screwed up else //client has screwed up
{ {
std::cout << "ERROR: ID " << id << " already in use\n"; std::cout << "ERROR: " << Wrapper::getName() << " ID " << id << " already in use\n";
return {}; return {};
} }
} }
@ -313,29 +313,30 @@ namespace impl {
bool mSuccess; bool mSuccess;
}; };
static void doProcessCallback(World* world, index id,size_t completionMsgSize,char* completionMessage,void* replyAddress) static void doProcessCallback(World* world, index id,size_t completionMsgSize,char* completionMessage,void* replyAddress)
{ {
// std::cout << "In callback\n"; auto ft = getInterfaceTable();
auto ft = getInterfaceTable(); struct Context{
World* mWorld;
index mID;
size_t mCompletionMsgSize;
char* mCompletionMessage;
void* mReplyAddress;
};
struct Context{ Context* c = new Context{world,id,completionMsgSize,completionMessage,replyAddress};
World* mWorld;
index mID;
size_t mCompletionMsgSize;
char* mCompletionMessage;
void* mReplyAddress;
};
Context* c = new Context{world,id,completionMsgSize,completionMessage,replyAddress};
auto launchCompletionFromNRT = [](FifoMsg* inmsg)
{
auto runCompletion = [](FifoMsg* msg){ auto runCompletion = [](FifoMsg* msg){
// std::cout << "In FIFOMsg\n"; // std::cout << "In FIFOMsg\n";
Context* c = static_cast<Context*>(msg->mData); Context* c = static_cast<Context*>(msg->mData);
World* world = c->mWorld; World* world = c->mWorld;
index id = c->mID; index id = c->mID;
auto ft = getInterfaceTable(); auto ft = getInterfaceTable();
void* space = ft->fRTAlloc(world,sizeof(CommandAsyncComplete)); void* space = ft->fRTAlloc(world,sizeof(CommandAsyncComplete));
CommandAsyncComplete* cmd = new (space) CommandAsyncComplete(world, id,c->mReplyAddress); CommandAsyncComplete* cmd = new (space) CommandAsyncComplete(world, id,c->mReplyAddress);
runAsyncCommand(world, cmd, c->mReplyAddress, c->mCompletionMsgSize, c->mCompletionMessage); runAsyncCommand(world, cmd, c->mReplyAddress, c->mCompletionMsgSize, c->mCompletionMessage);
}; };
@ -345,9 +346,17 @@ namespace impl {
delete c; delete c;
}; };
FifoMsg msg; auto ft = getInterfaceTable();
msg.Set(world, runCompletion, tidyup, c); FifoMsg fwd = *inmsg;
if(world->mRunning) ft->fSendMsgToRT(world,msg); fwd.Set(inmsg->mWorld, runCompletion, tidyup, inmsg->mData);
if(inmsg->mWorld->mRunning)
ft->fSendMsgToRT(inmsg->mWorld,fwd);
};
FifoMsg msg;
msg.Set(world, launchCompletionFromNRT, nullptr, c);
if(world->mRunning) ft->fSendMsgFromRT(world,msg);
} }
struct CommandProcess: public NRTCommand struct CommandProcess: public NRTCommand

Loading…
Cancel
Save