diff options
Diffstat (limited to 'lib/ultralib/src/os/sendmesg.c')
| -rw-r--r-- | lib/ultralib/src/os/sendmesg.c | 28 |
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; +} |
