osSendMesg.c (689B)
1 #include "libultra_internal.h" 2 3 s32 osSendMesg(OSMesgQueue *mq, OSMesg msg, s32 flag) { 4 register u32 int_disabled; 5 register s32 index; 6 int_disabled = __osDisableInt(); 7 8 while (MQ_IS_FULL(mq)) { 9 if (flag == OS_MESG_BLOCK) { 10 __osRunningThread->state = 8; 11 __osEnqueueAndYield(&mq->fullqueue); 12 } else { 13 __osRestoreInt(int_disabled); 14 return -1; 15 } 16 } 17 18 index = (mq->first + mq->validCount) % mq->msgCount; 19 mq->msg[index] = msg; 20 mq->validCount++; 21 22 if (mq->mtqueue->next != NULL) { 23 osStartThread(__osPopThread(&mq->mtqueue)); 24 } 25 26 __osRestoreInt(int_disabled); 27 return 0; 28 }