From ab5676fcf0a728374d5495c1980f1e2459d0ba4e Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 7 May 2020 19:55:15 -0400 Subject: FS_command.c --- arm9/lib/src/FS_command.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 arm9/lib/src/FS_command.c (limited to 'arm9/lib/src/FS_command.c') diff --git a/arm9/lib/src/FS_command.c b/arm9/lib/src/FS_command.c new file mode 100644 index 00000000..bc7839d8 --- /dev/null +++ b/arm9/lib/src/FS_command.c @@ -0,0 +1,75 @@ +#include "FS_file.h" +#include "FS_archive.h" +#include "FSi_util.h" +#include "FS_command.h" + +void FSi_ReleaseCommand(FSFile * p_file, FSResult ret) +{ + OSIntrMode bak_psr = OS_DisableInterrupts(); + FSi_CutFromList(p_file); + p_file->stat &= ~(FS_FILE_STATUS_CANCEL | FS_FILE_STATUS_BUSY | FS_FILE_STATUS_SYNC | FS_FILE_STATUS_ASYNC | FS_FILE_STATUS_OPERATING); + p_file->error = ret; + OS_WakeupThread(p_file->queue); + OS_RestoreInterrupts(bak_psr); +} + +FSResult FSi_TranslateCommand(FSFile *p_file, FSCommandType command) +{ + FSResult ret; + + FSArchive *const p_arc = p_file->arc; + const int bit = (1 << command); + + if (FS_IsFileSyncMode(p_file)) + p_arc->flag |= FS_ARCHIVE_FLAG_IS_SYNC; + else + p_arc->flag |= FS_ARCHIVE_FLAG_IS_ASYNC; + + if ((p_arc->proc_flag & bit) != 0) + { + switch (ret = (*p_arc->proc) (p_file, command)) + { + case FS_RESULT_SUCCESS: + case FS_RESULT_FAILURE: + case FS_RESULT_UNSUPPORTED: + p_file->error = ret; + break; + case FS_RESULT_PROC_ASYNC: + break; + case FS_RESULT_PROC_UNKNOWN: + ret = FS_RESULT_PROC_DEFAULT; + p_arc->proc_flag &= ~bit; + break; + } + } + else + { + ret = FS_RESULT_PROC_DEFAULT; + } + if (ret == FS_RESULT_PROC_DEFAULT) + { + ret = (*fsi_default_command[command]) (p_file); + } + if (ret == FS_RESULT_PROC_ASYNC) + { + if (FS_IsFileSyncMode(p_file)) + { + OSIntrMode bak_psr = OS_DisableInterrupts(); + while (FSi_IsArchiveSync(p_arc)) + OS_SleepThread(&p_arc->sync_q); + ret = p_file->error; + OS_RestoreInterrupts(bak_psr); + } + } + else if (!FS_IsFileSyncMode(p_file)) + { + p_arc->flag &= ~FS_ARCHIVE_FLAG_IS_ASYNC; + FSi_ReleaseCommand(p_file, ret); + } + else + { + p_arc->flag &= ~FS_ARCHIVE_FLAG_IS_SYNC; + p_file->error = ret; + } + return ret; +} -- cgit v1.2.3 From b398a161f324f88a4d4c8682eb15c63a62753a43 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 8 May 2020 19:39:43 -0400 Subject: Fix style inconsistencies --- arm9/lib/src/FS_command.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'arm9/lib/src/FS_command.c') diff --git a/arm9/lib/src/FS_command.c b/arm9/lib/src/FS_command.c index bc7839d8..818a65ea 100644 --- a/arm9/lib/src/FS_command.c +++ b/arm9/lib/src/FS_command.c @@ -3,7 +3,7 @@ #include "FSi_util.h" #include "FS_command.h" -void FSi_ReleaseCommand(FSFile * p_file, FSResult ret) +ARM_FUNC void FSi_ReleaseCommand(FSFile * p_file, FSResult ret) { OSIntrMode bak_psr = OS_DisableInterrupts(); FSi_CutFromList(p_file); @@ -13,7 +13,7 @@ void FSi_ReleaseCommand(FSFile * p_file, FSResult ret) OS_RestoreInterrupts(bak_psr); } -FSResult FSi_TranslateCommand(FSFile *p_file, FSCommandType command) +ARM_FUNC FSResult FSi_TranslateCommand(FSFile *p_file, FSCommandType command) { FSResult ret; -- cgit v1.2.3