diff options
author | red031000 <rubenru09@aol.com> | 2020-05-22 16:59:05 +0100 |
---|---|---|
committer | red031000 <rubenru09@aol.com> | 2020-05-22 16:59:05 +0100 |
commit | 4516f9c24789221cb1a065d054520884f35c5a3d (patch) | |
tree | 1f790e1ec4dfb79e67fe3f3c6c9282b673f83142 /arm9/lib/src | |
parent | 3c62c1ee513696153e6c554c0d97557b56a4c997 (diff) |
OSi_DoUnlockByWord and OS_TryLockByWord
Diffstat (limited to 'arm9/lib/src')
-rw-r--r-- | arm9/lib/src/OS_spinLock.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/arm9/lib/src/OS_spinLock.c b/arm9/lib/src/OS_spinLock.c index 45e29ab8..bf9204cb 100644 --- a/arm9/lib/src/OS_spinLock.c +++ b/arm9/lib/src/OS_spinLock.c @@ -3,11 +3,11 @@ // #include "OS_spinLock.h" +#include "OS_system.h" #include "function_target.h" #include "consts.h" #include "MI_exMemory.h" -extern void OS_TryLockByWord(u16 param1, OSLockWord* lockp, void* func); extern void OS_UnlockByWord(u16 param1, OSLockWord* lockp, void* func); extern void MIi_CpuClear32(u32 param1, void * addr, u32 length); //not too sure about names extern s32 OSi_DoTryLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void), @@ -44,7 +44,7 @@ ARM_FUNC void OS_InitLock() MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM7); OS_UnlockByWord(0x7e, lockp, NULL); - OS_TryLockByWord(0x7f, lockp, NULL); + (void)OS_TryLockByWord(0x7f, lockp, NULL); } ARM_FUNC s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void), //should be static @@ -57,3 +57,34 @@ ARM_FUNC s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) ( return lastLockFlag; } + +ARM_FUNC s32 OS_TryLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void)) +{ + return OSi_DoLockByWord(lockId, lockp, ctrlFuncp, FALSE); +} + +ARM_FUNC s32 OSi_DoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void), + BOOL disableFIQ) +{ + if (lockID != lockp->ownerID) + { + return -2; + } + + OSIntrMode lastIntrMode = (disableFIQ) ? OS_DisableInterrupts_IrqAndFiq() : OS_DisableInterrupts(); + lockp->ownerID = 0; + if (ctrlFuncp) + { + ctrlFuncp(); + } + lockp->lockFlag = 0; + if (disableFIQ) + { + OS_RestoreInterrupts_IrqAndFiq(lastIntrMode); + } + else + { + OS_RestoreInterrupts(lastIntrMode); + } + return 0; +} |