diff --git a/panda/src/pgraph/pandaNode.cxx b/panda/src/pgraph/pandaNode.cxx index 0baf30c7dd..e332ef18f5 100644 --- a/panda/src/pgraph/pandaNode.cxx +++ b/panda/src/pgraph/pandaNode.cxx @@ -2898,11 +2898,21 @@ get_component(NodePathComponent *parent, PandaNode *child_node, // First, walk through the list of NodePathComponents we already have on the // child, looking for one that already exists, referencing the indicated // parent component. - Paths::const_iterator pi; - for (pi = child_node->_paths.begin(); pi != child_node->_paths.end(); ++pi) { - if ((*pi)->get_next(pipeline_stage, current_thread) == parent) { + for (NodePathComponent *child : child_node->_paths) { + if (child->get_next(pipeline_stage, current_thread) == parent) { // If we already have such a component, just return it. - return (*pi); + // But before we do, we have to make sure it's not in the middle of being + // destructed. +#ifdef HAVE_THREADS + if (child->ref_if_nonzero()) { + PT(NodePathComponent) result; + result.cheat() = child; + return result; + } +#else + // If we're not building with threading, increment as normal. + return child; +#endif } } @@ -2940,11 +2950,21 @@ get_top_component(PandaNode *child_node, bool force, int pipeline_stage, // Walk through the list of NodePathComponents we already have on the child, // looking for one that already exists as a top node. - Paths::const_iterator pi; - for (pi = child_node->_paths.begin(); pi != child_node->_paths.end(); ++pi) { - if ((*pi)->is_top_node(pipeline_stage, current_thread)) { + for (NodePathComponent *child : child_node->_paths) { + if (child->is_top_node(pipeline_stage, current_thread)) { // If we already have such a component, just return it. - return (*pi); + // But before we do, we have to make sure it's not in the middle of being + // destructed. +#ifdef HAVE_THREADS + if (child->ref_if_nonzero()) { + PT(NodePathComponent) result; + result.cheat() = child; + return result; + } +#else + // If we're not building with threading, increment as normal. + return child; +#endif } }