Merge pull request #29198 from NilsIrl/seg_fault

Fix Segmentation fault and reduce memory consumption
This commit is contained in:
Rémi Verschelde 2019-05-27 11:59:38 +02:00 committed by GitHub
commit 0d3ae2a415
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 7 additions and 19 deletions

View file

@ -1627,40 +1627,28 @@ void ProjectManager::_show_project(const String &p_path) {
OS::get_singleton()->shell_open(String("file://") + p_path); OS::get_singleton()->shell_open(String("file://") + p_path);
} }
void ProjectManager::_scan_dir(DirAccess *da, float pos, float total, List<String> *r_projects) { void ProjectManager::_scan_dir(const String &path, List<String> *r_projects) {
DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
List<String> subdirs; da->change_dir(path);
da->list_dir_begin(); da->list_dir_begin();
String n = da->get_next(); String n = da->get_next();
while (n != String()) { while (n != String()) {
if (da->current_is_dir() && !n.begins_with(".")) { 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") { } else if (n == "project.godot") {
r_projects->push_back(da->get_current_dir()); r_projects->push_back(da->get_current_dir());
} }
n = da->get_next(); n = da->get_next();
} }
da->list_dir_end(); da->list_dir_end();
int m = 0; memdelete(da);
for (List<String>::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++;
}
} }
void ProjectManager::_scan_begin(const String &p_base) { void ProjectManager::_scan_begin(const String &p_base) {
print_line("Scanning projects at: " + p_base); print_line("Scanning projects at: " + p_base);
List<String> projects; List<String> projects;
DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); _scan_dir(p_base, &projects);
da->change_dir(p_base);
_scan_dir(da, 0, 1, &projects);
memdelete(da);
print_line("Found " + itos(projects.size()) + " projects."); print_line("Found " + itos(projects.size()) + " projects.");
for (List<String>::Element *E = projects.front(); E; E = E->next()) { for (List<String>::Element *E = projects.front(); E; E = E->next()) {

View file

@ -106,7 +106,7 @@ class ProjectManager : public Control {
void _on_project_created(const String &dir); void _on_project_created(const String &dir);
void _on_projects_updated(); void _on_projects_updated();
void _update_scroll_position(const String &dir); void _update_scroll_position(const String &dir);
void _scan_dir(DirAccess *da, float pos, float total, List<String> *r_projects); void _scan_dir(const String &path, List<String> *r_projects);
void _install_project(const String &p_zip_path, const String &p_title); void _install_project(const String &p_zip_path, const String &p_title);