| 28 | } |
| 29 | |
| 30 | bool OSReceiveMessage(OSMessageQueue* msgQueue, OSMessage* msg, uint32 flags) |
| 31 | { |
| 32 | bool isSystemMessageQueue = (msgQueue == g_systemMessageQueue); |
| 33 | if(isSystemMessageQueue) |
| 34 | UpdateSystemMessageQueue(); |
| 35 | __OSLockScheduler(msgQueue); |
| 36 | while (msgQueue->usedCount == (uint32be)0) |
| 37 | { |
| 38 | if ((flags & OS_MESSAGE_BLOCK)) |
| 39 | { |
| 40 | msgQueue->threadQueueReceive.queueAndWait(OSGetCurrentThread()); |
| 41 | } |
| 42 | else |
| 43 | { |
| 44 | __OSUnlockScheduler(msgQueue); |
| 45 | return false; |
| 46 | } |
| 47 | } |
| 48 | // copy message |
| 49 | sint32 messageIndex = msgQueue->firstIndex; |
| 50 | OSMessage* readMsg = &(msgQueue->msgArray[messageIndex]); |
| 51 | memcpy(msg, readMsg, sizeof(OSMessage)); |
| 52 | msgQueue->firstIndex = ((uint32)msgQueue->firstIndex + 1) % (uint32)(msgQueue->msgCount); |
| 53 | msgQueue->usedCount = (uint32)msgQueue->usedCount - 1; |
| 54 | // wake up any thread waiting to add a message |
| 55 | if (!msgQueue->threadQueueSend.isEmpty()) |
| 56 | msgQueue->threadQueueSend.wakeupSingleThreadWaitQueue(true); |
| 57 | __OSUnlockScheduler(msgQueue); |
| 58 | if(isSystemMessageQueue) |
| 59 | HandleReceivedSystemMessage(msg); |
| 60 | return true; |
| 61 | } |
| 62 | |
| 63 | bool OSPeekMessage(OSMessageQueue* msgQueue, OSMessage* msg) |
| 64 | { |
no test coverage detected