summaryrefslogtreecommitdiff
path: root/arm9/lib/src/OS_message.c
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-08-01 18:32:46 +0100
committerred031000 <rubenru09@aol.com>2020-08-01 18:32:46 +0100
commit2fea2eeae228e99cde255e64b3e1a766d8729e50 (patch)
treedf2e6769331c45959eea3942516c919c44966f1a /arm9/lib/src/OS_message.c
parent7137811b1453c782adc621ceaa646d04fae4c286 (diff)
arm9 OS_message
Diffstat (limited to 'arm9/lib/src/OS_message.c')
-rw-r--r--arm9/lib/src/OS_message.c123
1 files changed, 123 insertions, 0 deletions
diff --git a/arm9/lib/src/OS_message.c b/arm9/lib/src/OS_message.c
new file mode 100644
index 00000000..9f7beb8e
--- /dev/null
+++ b/arm9/lib/src/OS_message.c
@@ -0,0 +1,123 @@
+#include "OS_message.h"
+#include "function_target.h"
+#include "OS_system.h"
+
+ARM_FUNC void OS_InitMessageQueue(OSMessageQueue *mq, OSMessage *msgArray, s32 msgCount)
+{
+ OS_InitThreadQueue(&mq->queueSend);
+ OS_InitThreadQueue(&mq->queueReceive);
+ mq->msgArray = msgArray;
+ mq->msgCount = msgCount;
+ mq->firstIndex = 0;
+ mq->usedCount = 0;
+}
+
+ARM_FUNC BOOL OS_SendMessage(OSMessageQueue *mq, OSMessage msg, s32 flags)
+{
+ OSIntrMode enabled = OS_DisableInterrupts();
+
+ while (mq->msgCount <= mq->usedCount)
+ {
+ if (!(flags & OS_MESSAGE_BLOCK))
+ {
+ (void)OS_RestoreInterrupts(enabled);
+ return FALSE;
+ }
+ else
+ {
+ OS_SleepThread(&mq->queueSend);
+ }
+ }
+
+ s32 lastIndex = (mq->firstIndex + mq->usedCount) % mq->msgCount;
+ mq->msgArray[lastIndex] = msg;
+ mq->usedCount++;
+
+ OS_WakeupThread(&mq->queueReceive);
+
+ (void)OS_RestoreInterrupts(enabled);
+ return TRUE;
+}
+
+ARM_FUNC BOOL OS_ReceiveMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags)
+{
+ OSIntrMode enabled = OS_DisableInterrupts();
+
+ while (mq->usedCount == 0)
+ {
+ if (!(flags & OS_MESSAGE_BLOCK))
+ {
+ (void)OS_RestoreInterrupts(enabled);
+ return FALSE;
+ }
+ else
+ {
+ OS_SleepThread(&mq->queueReceive);
+ }
+ }
+
+ if (msg != NULL)
+ {
+ *msg = mq->msgArray[mq->firstIndex];
+ }
+ mq->firstIndex = (mq->firstIndex + 1) % mq->msgCount;
+ mq->usedCount--;
+
+ OS_WakeupThread(&mq->queueSend);
+
+ (void)OS_RestoreInterrupts(enabled);
+ return TRUE;
+}
+
+ARM_FUNC BOOL OS_JamMessage(OSMessageQueue *mq, OSMessage msg, s32 flags)
+{
+ OSIntrMode enabled = OS_DisableInterrupts();
+
+ while (mq->msgCount <= mq->usedCount)
+ {
+ if (!(flags & OS_MESSAGE_BLOCK))
+ {
+ (void)OS_RestoreInterrupts(enabled);
+ return FALSE;
+ }
+ else
+ {
+ OS_SleepThread(&mq->queueSend);
+ }
+ }
+
+ mq->firstIndex = (mq->firstIndex + mq->msgCount - 1) % mq->msgCount;
+ mq->msgArray[mq->firstIndex] = msg;
+ mq->usedCount++;
+
+ OS_WakeupThread(&mq->queueReceive);
+
+ (void)OS_RestoreInterrupts(enabled);
+ return TRUE;
+}
+
+ARM_FUNC BOOL OS_ReadMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags)
+{
+ OSIntrMode enabled = OS_DisableInterrupts();
+
+ while (mq->usedCount == 0)
+ {
+ if (!(flags & OS_MESSAGE_BLOCK))
+ {
+ (void)OS_RestoreInterrupts(enabled);
+ return FALSE;
+ }
+ else
+ {
+ OS_SleepThread(&mq->queueReceive);
+ }
+ }
+
+ if (msg != NULL)
+ {
+ *msg = mq->msgArray[mq->firstIndex];
+ }
+
+ (void)OS_RestoreInterrupts(enabled);
+ return TRUE;
+}