Merge pull request #36551 from AndreaCatania/navigation_destruction_flush

Flushes commands just before the navigation server is destroyed
This commit is contained in:
Rémi Verschelde 2020-02-26 10:09:43 +01:00 committed by GitHub
commit 3a4c128f07
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 33 additions and 16 deletions

View file

@ -121,6 +121,7 @@ GdNavigationServer::GdNavigationServer() :
}
GdNavigationServer::~GdNavigationServer() {
flush_queries();
memdelete(operations_mutex);
memdelete(commands_mutex);
}
@ -474,12 +475,9 @@ void GdNavigationServer::set_active(bool p_active) const {
mut_this->operations_mutex->unlock();
}
void GdNavigationServer::step(real_t p_delta_time) {
if (!active) {
return;
}
// With c++ we can't be 100% sure this is called in single thread so use the mutex.
void GdNavigationServer::flush_queries() {
// In c++ we can't be sure that this is performed in the main thread
// even with mutable functions.
commands_mutex->lock();
operations_mutex->lock();
for (size_t i(0); i < commands.size(); i++) {
@ -489,13 +487,24 @@ void GdNavigationServer::step(real_t p_delta_time) {
commands.clear();
operations_mutex->unlock();
commands_mutex->unlock();
}
// These are internal operations so don't need to be shielded.
void GdNavigationServer::process(real_t p_delta_time) {
flush_queries();
if (!active) {
return;
}
// In c++ we can't be sure that this is performed in the main thread
// even with mutable functions.
operations_mutex->lock();
for (int i(0); i < active_maps.size(); i++) {
active_maps[i]->sync();
active_maps[i]->step(p_delta_time);
active_maps[i]->dispatch_callbacks();
}
operations_mutex->unlock();
}
#undef COMMAND_1

View file

@ -131,7 +131,9 @@ public:
COMMAND_1(free, RID, p_object);
virtual void set_active(bool p_active) const;
virtual void step(real_t p_delta_time);
void flush_queries();
virtual void process(real_t p_delta_time);
};
#undef COMMAND_1