summaryrefslogtreecommitdiff
path: root/lib/ultralib/src/os/sendmesg.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ultralib/src/os/sendmesg.c')
-rw-r--r--lib/ultralib/src/os/sendmesg.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/ultralib/src/os/sendmesg.c b/lib/ultralib/src/os/sendmesg.c
new file mode 100644
index 0000000..4d48d08
--- /dev/null
+++ b/lib/ultralib/src/os/sendmesg.c
@@ -0,0 +1,28 @@
+#include "PR/os_internal.h"
+#include "osint.h"
+
+s32 osSendMesg(OSMesgQueue *mq, OSMesg msg, s32 flags) {
+ register u32 saveMask;
+ register s32 last;
+ saveMask = __osDisableInt();
+ while (MQ_IS_FULL(mq)) {
+ if (flags == OS_MESG_BLOCK) {
+ __osRunningThread->state = OS_STATE_WAITING;
+ __osEnqueueAndYield(&mq->fullqueue);
+ } else {
+ __osRestoreInt(saveMask);
+ return -1;
+ }
+ }
+
+ last = (mq->first + mq->validCount) % mq->msgCount;
+ mq->msg[last] = msg;
+ mq->validCount++;
+
+ if (mq->mtqueue->next != NULL) {
+ osStartThread(__osPopThread(&mq->mtqueue));
+ }
+
+ __osRestoreInt(saveMask);
+ return 0;
+}