mirror of https://github.com/mgba-emu/mgba.git
Core: Fix leaks and clean up mDirectorySet
This commit is contained in:
parent
11589d874f
commit
96c137c1a2
|
@ -10,92 +10,53 @@
|
||||||
|
|
||||||
#if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2
|
#if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2
|
||||||
void mDirectorySetInit(struct mDirectorySet* dirs) {
|
void mDirectorySetInit(struct mDirectorySet* dirs) {
|
||||||
dirs->base = 0;
|
dirs->base = NULL;
|
||||||
dirs->archive = 0;
|
dirs->archive = NULL;
|
||||||
dirs->save = 0;
|
dirs->save = NULL;
|
||||||
dirs->patch = 0;
|
dirs->patch = NULL;
|
||||||
dirs->state = 0;
|
dirs->state = NULL;
|
||||||
dirs->screenshot = 0;
|
dirs->screenshot = NULL;
|
||||||
dirs->cheats = 0;
|
dirs->cheats = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mDirectorySetDetachDir(struct mDirectorySet* dirs, struct VDir* dir) {
|
||||||
|
if (!dir) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dirs->base == dir) {
|
||||||
|
dirs->base = NULL;
|
||||||
|
}
|
||||||
|
if (dirs->archive == dir) {
|
||||||
|
dirs->archive = NULL;
|
||||||
|
}
|
||||||
|
if (dirs->save == dir) {
|
||||||
|
dirs->save = NULL;
|
||||||
|
}
|
||||||
|
if (dirs->patch == dir) {
|
||||||
|
dirs->patch = NULL;
|
||||||
|
}
|
||||||
|
if (dirs->state == dir) {
|
||||||
|
dirs->state = NULL;
|
||||||
|
}
|
||||||
|
if (dirs->screenshot == dir) {
|
||||||
|
dirs->screenshot = NULL;
|
||||||
|
}
|
||||||
|
if (dirs->cheats == dir) {
|
||||||
|
dirs->cheats = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
dir->close(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mDirectorySetDeinit(struct mDirectorySet* dirs) {
|
void mDirectorySetDeinit(struct mDirectorySet* dirs) {
|
||||||
mDirectorySetDetachBase(dirs);
|
mDirectorySetDetachBase(dirs);
|
||||||
|
mDirectorySetDetachDir(dirs, dirs->archive);
|
||||||
if (dirs->archive) {
|
mDirectorySetDetachDir(dirs, dirs->save);
|
||||||
if (dirs->archive == dirs->save) {
|
mDirectorySetDetachDir(dirs, dirs->patch);
|
||||||
dirs->save = NULL;
|
mDirectorySetDetachDir(dirs, dirs->state);
|
||||||
}
|
mDirectorySetDetachDir(dirs, dirs->screenshot);
|
||||||
if (dirs->archive == dirs->patch) {
|
mDirectorySetDetachDir(dirs, dirs->cheats);
|
||||||
dirs->patch = NULL;
|
|
||||||
}
|
|
||||||
if (dirs->archive == dirs->state) {
|
|
||||||
dirs->state = NULL;
|
|
||||||
}
|
|
||||||
if (dirs->archive == dirs->screenshot) {
|
|
||||||
dirs->screenshot = NULL;
|
|
||||||
}
|
|
||||||
if (dirs->archive == dirs->cheats) {
|
|
||||||
dirs->cheats = NULL;
|
|
||||||
}
|
|
||||||
dirs->archive->close(dirs->archive);
|
|
||||||
dirs->archive = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dirs->save) {
|
|
||||||
if (dirs->save == dirs->patch) {
|
|
||||||
dirs->patch = NULL;
|
|
||||||
}
|
|
||||||
if (dirs->save == dirs->state) {
|
|
||||||
dirs->state = NULL;
|
|
||||||
}
|
|
||||||
if (dirs->save == dirs->screenshot) {
|
|
||||||
dirs->screenshot = NULL;
|
|
||||||
}
|
|
||||||
if (dirs->save == dirs->cheats) {
|
|
||||||
dirs->cheats = NULL;
|
|
||||||
}
|
|
||||||
dirs->save->close(dirs->save);
|
|
||||||
dirs->save = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dirs->patch) {
|
|
||||||
if (dirs->patch == dirs->state) {
|
|
||||||
dirs->state = NULL;
|
|
||||||
}
|
|
||||||
if (dirs->patch == dirs->screenshot) {
|
|
||||||
dirs->screenshot = NULL;
|
|
||||||
}
|
|
||||||
if (dirs->patch == dirs->cheats) {
|
|
||||||
dirs->cheats = NULL;
|
|
||||||
}
|
|
||||||
dirs->patch->close(dirs->patch);
|
|
||||||
dirs->patch = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dirs->state) {
|
|
||||||
if (dirs->state == dirs->screenshot) {
|
|
||||||
dirs->state = NULL;
|
|
||||||
}
|
|
||||||
if (dirs->state == dirs->cheats) {
|
|
||||||
dirs->cheats = NULL;
|
|
||||||
}
|
|
||||||
dirs->state->close(dirs->state);
|
|
||||||
dirs->state = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dirs->screenshot) {
|
|
||||||
if (dirs->screenshot == dirs->cheats) {
|
|
||||||
dirs->cheats = NULL;
|
|
||||||
}
|
|
||||||
dirs->screenshot->close(dirs->screenshot);
|
|
||||||
dirs->screenshot = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dirs->cheats) {
|
|
||||||
dirs->cheats->close(dirs->cheats);
|
|
||||||
dirs->cheats = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void mDirectorySetAttachBase(struct mDirectorySet* dirs, struct VDir* base) {
|
void mDirectorySetAttachBase(struct mDirectorySet* dirs, struct VDir* base) {
|
||||||
|
@ -118,36 +79,20 @@ void mDirectorySetAttachBase(struct mDirectorySet* dirs, struct VDir* base) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void mDirectorySetDetachBase(struct mDirectorySet* dirs) {
|
void mDirectorySetDetachBase(struct mDirectorySet* dirs) {
|
||||||
if (dirs->save == dirs->base) {
|
mDirectorySetDetachDir(dirs, dirs->archive);
|
||||||
dirs->save = NULL;
|
mDirectorySetDetachDir(dirs, dirs->base);
|
||||||
}
|
|
||||||
if (dirs->patch == dirs->base) {
|
|
||||||
dirs->patch = NULL;
|
|
||||||
}
|
|
||||||
if (dirs->state == dirs->base) {
|
|
||||||
dirs->state = NULL;
|
|
||||||
}
|
|
||||||
if (dirs->screenshot == dirs->base) {
|
|
||||||
dirs->screenshot = NULL;
|
|
||||||
}
|
|
||||||
if (dirs->cheats == dirs->base) {
|
|
||||||
dirs->cheats = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dirs->base) {
|
|
||||||
dirs->base->close(dirs->base);
|
|
||||||
dirs->base = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct VFile* mDirectorySetOpenPath(struct mDirectorySet* dirs, const char* path, bool (*filter)(struct VFile*)) {
|
struct VFile* mDirectorySetOpenPath(struct mDirectorySet* dirs, const char* path, bool (*filter)(struct VFile*)) {
|
||||||
dirs->archive = VDirOpenArchive(path);
|
struct VDir* archive = VDirOpenArchive(path);
|
||||||
struct VFile* file;
|
struct VFile* file;
|
||||||
if (dirs->archive) {
|
if (archive) {
|
||||||
file = VDirFindFirst(dirs->archive, filter);
|
file = VDirFindFirst(archive, filter);
|
||||||
if (!file) {
|
if (!file) {
|
||||||
dirs->archive->close(dirs->archive);
|
archive->close(archive);
|
||||||
dirs->archive = 0;
|
} else {
|
||||||
|
mDirectorySetDetachDir(dirs, dirs->archive);
|
||||||
|
dirs->archive = archive;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
file = VFileOpen(path, O_RDONLY);
|
file = VFileOpen(path, O_RDONLY);
|
||||||
|
|
Loading…
Reference in New Issue