diff options
Diffstat (limited to 'arm9/lib')
-rw-r--r-- | arm9/lib/include/OS_irqTable.h | 6 | ||||
-rw-r--r-- | arm9/lib/include/OS_mutex.h | 7 | ||||
-rw-r--r-- | arm9/lib/include/mmap.h | 3 | ||||
-rw-r--r-- | arm9/lib/src/OS_mutex.c | 142 | ||||
-rw-r--r-- | arm9/lib/src/SND_bank.c | 2 | ||||
-rw-r--r-- | arm9/lib/src/SND_main.c | 5 |
6 files changed, 152 insertions, 13 deletions
diff --git a/arm9/lib/include/OS_irqTable.h b/arm9/lib/include/OS_irqTable.h index 8cd7b7b3..10165a11 100644 --- a/arm9/lib/include/OS_irqTable.h +++ b/arm9/lib/include/OS_irqTable.h @@ -1,5 +1,5 @@ -#ifndef POKEDIAMOND_OS_IRQTABLE_H -#define POKEDIAMOND_OS_IRQTABLE_H +#ifndef POKEDIAMOND_ARM9_OS_IRQTABLE_H +#define POKEDIAMOND_ARM9_OS_IRQTABLE_H #include "consts.h" #include "OS_interrupt.h" @@ -20,4 +20,4 @@ static inline void OS_SetIrqCheckFlag(OSIrqMask intr) *(vu32 *)HW_INTR_CHECK_BUF |= (u32)intr; } -#endif //POKEDIAMOND_OS_IRQTABLE_H +#endif //POKEDIAMOND_ARM9_OS_IRQTABLE_H diff --git a/arm9/lib/include/OS_mutex.h b/arm9/lib/include/OS_mutex.h index 9da89c69..23e4337e 100644 --- a/arm9/lib/include/OS_mutex.h +++ b/arm9/lib/include/OS_mutex.h @@ -4,7 +4,14 @@ #include "OS_thread.h" #include "OS_context.h" #include "nitro/OS_mutex_shared.h" +#include "nitro/types.h" +void OS_InitMutex(OSMutex *mutex); +void OS_LockMutex(OSMutex *mutex); +void OS_UnlockMutex(OSMutex *mutex); void OSi_UnlockAllMutex(OSThread * thread); +BOOL OS_TryLockMutex(OSMutex *mutex); +void OSi_EnqueueTail(OSThread *thread, OSMutex *mutex); +void OSi_DequeueItem(OSThread *thread, OSMutex *mutex); #endif //POKEDIAMOND_ARM9_OS_MUTEX_H diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h index 143b609b..8b30ffc8 100644 --- a/arm9/lib/include/mmap.h +++ b/arm9/lib/include/mmap.h @@ -32,7 +32,6 @@ extern u32 SDK_AUTOLOAD_DTCM_START[]; #define HW_MAIN_MEM_EX_END (HW_MAIN_MEM + HW_MAIN_MEM_EX_SIZE) #define HW_MAIN_MEM_SHARED (HW_MAIN_MEM_EX_END - HW_MAIN_MEM_SHARED_SIZE) #define HW_DTCM_SVC_STACK_END (HW_DTCM + 0x00003fc0) -#define HW_SVC_STACK_SIZE 0x00000040 #define HW_DTCM_SVC_STACK (HW_DTCM_SVC_STACK_END - HW_SVC_STACK_SIZE) #define HW_DTCM_IRQ_STACK_END (HW_DTCM_SVC_STACK) @@ -49,8 +48,6 @@ extern u32 SDK_AUTOLOAD_DTCM_START[]; #define HW_SHARED_LOCK_BUF (HW_MAIN_MEM + 0x007fffc0) #define HW_CARD_LOCK_BUF (HW_MAIN_MEM + 0x007fffe0) -#define HW_BUTTON_XY_BUF (HW_MAIN_MEM + 0x007fffa8) - #define OSi_MAIN_ARENA_HI_DEFAULT (HW_MAIN_MEM_MAIN_END) #define OSi_MAINEX_ARENA_HI_DEFAULT (HW_MAIN_MEM + HW_MAIN_MEM_DEBUGGER_OFFSET) #define HW_ITCM_ARENA_HI_DEFAULT (HW_ITCM + HW_ITCM_SIZE) diff --git a/arm9/lib/src/OS_mutex.c b/arm9/lib/src/OS_mutex.c new file mode 100644 index 00000000..5eb999a9 --- /dev/null +++ b/arm9/lib/src/OS_mutex.c @@ -0,0 +1,142 @@ +#include "nitro/types.h" +#include "function_target.h" +#include "OS_mutex.h" +#include "OS_system.h" + +ARM_FUNC void OS_InitMutex(OSMutex *mutex) +{ + OS_InitThreadQueue(&mutex->queue); + mutex->thread = NULL; + mutex->count = 0; +} + +ARM_FUNC void OS_LockMutex(OSMutex *mutex) +{ + OSIntrMode prevIntrMode = OS_DisableInterrupts(); + OSThread *currentThread = OS_GetCurrentThread(); + + OSThread *ownerThread; + for (;;) + { + ownerThread = ((volatile OSMutex *)mutex)->thread; + + if (ownerThread == NULL) + { + mutex->thread = currentThread; + mutex->count++; + OSi_EnqueueTail(currentThread, mutex); + break; + } + else if (ownerThread == currentThread) + { + mutex->count++; + break; + } + else + { + currentThread->mutex = mutex; + OS_SleepThread(&mutex->queue); + currentThread->mutex = NULL; + } + } + + (void)OS_RestoreInterrupts(prevIntrMode); +} + +ARM_FUNC void OS_UnlockMutex(OSMutex *mutex) +{ + OSIntrMode prevIntrMode = OS_DisableInterrupts(); + OSThread *currentThread = OS_GetCurrentThread(); + + if (mutex->thread == currentThread && --mutex->count == 0) + { + OSi_DequeueItem(currentThread, mutex); + mutex->thread = NULL; + + OS_WakeupThread(&mutex->queue); + } + + (void)OS_RestoreInterrupts(prevIntrMode); +} + +ARM_FUNC void OSi_UnlockAllMutex(OSThread *thread) +{ + OSMutex *mutex; + while (thread->mutexQueue.head) + { + mutex = OSi_RemoveMutexLinkFromQueue(&thread->mutexQueue); + + mutex->count = 0; + mutex->thread = NULL; + OS_WakeupThread(&mutex->queue); + } +} + +ARM_FUNC BOOL OS_TryLockMutex(OSMutex *mutex) +{ + OSIntrMode prevIntrMode = OS_DisableInterrupts(); + OSThread *currentThread = OS_GetCurrentThread(); + BOOL locked; + + if (mutex->thread == NULL) + { + mutex->thread = currentThread; + mutex->count++; + OSi_EnqueueTail(currentThread, mutex); + locked = TRUE; + } + else if (mutex->thread == currentThread) + { + mutex->count++; + locked = TRUE; + } + else + { + locked = FALSE; + } + + (void)OS_RestoreInterrupts(prevIntrMode); + return locked; +} + +ARM_FUNC void OSi_EnqueueTail(OSThread *thread, OSMutex *mutex) +{ + OSMutex *prev = thread->mutexQueue.tail; + + if (!prev) + { + thread->mutexQueue.head = mutex; + } + else + { + prev->link.next = mutex; + } + + mutex->link.prev = prev; + mutex->link.next = NULL; + thread->mutexQueue.tail = mutex; +} + +ARM_FUNC void OSi_DequeueItem(OSThread *thread, OSMutex *mutex) +{ + OSMutex *next = mutex->link.next; + OSMutex *prev = mutex->link.prev; + + if (!next) + { + thread->mutexQueue.tail = prev; + } + else + { + next->link.prev = prev; + } + + if(!prev) + { + thread->mutexQueue.head = next; + } + else + { + prev->link.next = next; + } +} diff --git a/arm9/lib/src/SND_bank.c b/arm9/lib/src/SND_bank.c index 7f5bd94a..44075454 100644 --- a/arm9/lib/src/SND_bank.c +++ b/arm9/lib/src/SND_bank.c @@ -1,8 +1,6 @@ #include "SND_bank.h" #include "OS_mutex.h" -void OS_LockMutex(struct OSMutex *); -void OS_UnlockMutex(struct OSMutex *); void DC_StoreRange(const void *, u32); /* diff --git a/arm9/lib/src/SND_main.c b/arm9/lib/src/SND_main.c index 34b839b1..f97b0873 100644 --- a/arm9/lib/src/SND_main.c +++ b/arm9/lib/src/SND_main.c @@ -8,11 +8,6 @@ static struct OSMutex sSndMutex; static s32 sSndInitialized; -// TODO remove these declarations once we have the functions in the headers -void OS_InitMutex(struct OSMutex *); -void OS_UnlockMutex(struct OSMutex *); -void OS_LockMutex(struct OSMutex *); - ARM_FUNC void SND_Init(void) { if (sSndInitialized) return; |