sm64

A Super Mario 64 decompilation
Log | Files | Refs | README | LICENSE

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 }