diff options
Diffstat (limited to 'arm9')
| -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; | 
