layered_fs: Do not open all replacement files on load

Instead open them when we want to read them. This is because the standard library has a limit on the number of opened files.
This commit is contained in:
zhupengfei 2020-02-09 21:48:42 +08:00
parent b87bc5d351
commit d9ae4c332d
No known key found for this signature in database
GPG key ID: DD129E108BD09378

View file

@ -18,7 +18,7 @@ namespace FileSys {
struct FileRelocationInfo {
int type; // 0 - none, 1 - replaced / created, 2 - patched, 3 - removed
u64 original_offset; // Type 0. Offset is absolute
FileUtil::IOFile replace_file; // Type 1
std::string replace_file_path; // Type 1
std::vector<u8> patched_file; // Type 2
u64 size; // Relocated file size
};
@ -175,14 +175,9 @@ void LayeredFS::LoadRelocations() {
}
auto* file = file_path_map.at(path);
file->relocation.replace_file = FileUtil::IOFile(directory + virtual_name, "rb");
if (file->relocation.replace_file) {
file->relocation.type = 1;
file->relocation.size = file->relocation.replace_file.GetSize();
file->relocation.replace_file_path = directory + virtual_name;
LOG_INFO(Service_FS, "LayeredFS replacement file in use for {}", path);
} else {
LOG_ERROR(Service_FS, "Could not open replacement file for {}", path);
}
return true;
};
@ -524,8 +519,14 @@ std::size_t LayeredFS::ReadFile(std::size_t offset, std::size_t length, u8* buff
romfs->ReadFile(relocation.original_offset + relative_offset, to_read,
buffer + read_size);
} else if (relocation.type == 1) { // replace
relocation.replace_file.Seek(relative_offset, SEEK_SET);
relocation.replace_file.ReadBytes(buffer + read_size, to_read);
FileUtil::IOFile replace_file(relocation.replace_file_path, "rb");
if (replace_file) {
replace_file.Seek(relative_offset, SEEK_SET);
replace_file.ReadBytes(buffer + read_size, to_read);
} else {
LOG_ERROR(Service_FS, "Could not open replacement file for {}",
current->second->path);
}
} else if (relocation.type == 2) { // patch
std::memcpy(buffer + read_size, relocation.patched_file.data() + relative_offset,
to_read);