summaryrefslogtreecommitdiff
path: root/arm9/lib
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/lib')
-rw-r--r--arm9/lib/include/OS_spinLock.h2
-rw-r--r--arm9/lib/src/OS_spinLock.c13
2 files changed, 15 insertions, 0 deletions
diff --git a/arm9/lib/include/OS_spinLock.h b/arm9/lib/include/OS_spinLock.h
index 7711b423..208cb677 100644
--- a/arm9/lib/include/OS_spinLock.h
+++ b/arm9/lib/include/OS_spinLock.h
@@ -20,6 +20,8 @@ static inline void OSi_WaitByLoop()
}
void OS_InitLock();
+s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void),
+ BOOL disableFiq);
s32 OS_GetLockID(void);
#endif //POKEDIAMOND_OS_SPINLOCK_H
diff --git a/arm9/lib/src/OS_spinLock.c b/arm9/lib/src/OS_spinLock.c
index 46309c42..45e29ab8 100644
--- a/arm9/lib/src/OS_spinLock.c
+++ b/arm9/lib/src/OS_spinLock.c
@@ -10,6 +10,8 @@
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),
+ BOOL disableFiq);
ARM_FUNC void OS_InitLock()
{
@@ -44,3 +46,14 @@ ARM_FUNC void OS_InitLock()
OS_UnlockByWord(0x7e, lockp, NULL);
OS_TryLockByWord(0x7f, lockp, NULL);
}
+
+ARM_FUNC s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void), //should be static
+ BOOL disableFiq)
+{
+ s32 lastLockFlag;
+ while ((lastLockFlag = OSi_DoTryLockByWord(lockId, lockp, ctrlFuncp, disableFiq)) > 0) {
+ OSi_WaitByLoop();
+ }
+
+ return lastLockFlag;
+}