From 6afcc724656c78f9f5925e4388b197d6b3b27c2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nils=20ANDR=C3=89-CHANG?= Date: Sun, 26 May 2019 16:33:51 +0100 Subject: [PATCH] Fix Segmentation fault and reduce memory consumption (cherry picked from commit a156b7976da6a7e0a6492ae2b336faa645a19da2) --- editor/project_manager.cpp | 24 ++++++------------------ editor/project_manager.h | 2 +- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 095ec891cd7..102d57f745f 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -1609,40 +1609,28 @@ void ProjectManager::_show_project(const String &p_path) { OS::get_singleton()->shell_open(String("file://") + p_path); } -void ProjectManager::_scan_dir(DirAccess *da, float pos, float total, List *r_projects) { - - List subdirs; +void ProjectManager::_scan_dir(const String &path, List *r_projects) { + DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + da->change_dir(path); da->list_dir_begin(); String n = da->get_next(); while (n != String()) { if (da->current_is_dir() && !n.begins_with(".")) { - subdirs.push_front(n); + _scan_dir(da->get_current_dir().plus_file(n), r_projects); } else if (n == "project.godot") { r_projects->push_back(da->get_current_dir()); } n = da->get_next(); } da->list_dir_end(); - int m = 0; - for (List::Element *E = subdirs.front(); E; E = E->next()) { - - da->change_dir(E->get()); - - float slice = total / subdirs.size(); - _scan_dir(da, pos + slice * m, slice, r_projects); - da->change_dir(".."); - m++; - } + memdelete(da); } void ProjectManager::_scan_begin(const String &p_base) { print_line("Scanning projects at: " + p_base); List projects; - DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); - da->change_dir(p_base); - _scan_dir(da, 0, 1, &projects); - memdelete(da); + _scan_dir(p_base, &projects); print_line("Found " + itos(projects.size()) + " projects."); for (List::Element *E = projects.front(); E; E = E->next()) { diff --git a/editor/project_manager.h b/editor/project_manager.h index 1fdd7dbe063..d0b926886f1 100644 --- a/editor/project_manager.h +++ b/editor/project_manager.h @@ -102,7 +102,7 @@ class ProjectManager : public Control { void _on_project_created(const String &dir); void _on_projects_updated(); void _update_scroll_position(const String &dir); - void _scan_dir(DirAccess *da, float pos, float total, List *r_projects); + void _scan_dir(const String &path, List *r_projects); void _install_project(const String &p_zip_path, const String &p_title);