| 63 | } |
| 64 | |
| 65 | IOSMsgQueueId IOS_CreateMessageQueue(IOSMessage* messageArray, uint32 messageCount) |
| 66 | { |
| 67 | std::unique_lock _l(sInternalMutex); |
| 68 | cemu_assert(messageCount != 0); |
| 69 | auto it = std::find_if(sMsgQueuePool.begin(), sMsgQueuePool.end(), [](const IOSMessageQueue& q) { return q.msgArraySize == 0; }); |
| 70 | if (it == sMsgQueuePool.end()) |
| 71 | { |
| 72 | cemu_assert_suspicious(); |
| 73 | return IOS_ERROR_MAXIMUM_REACHED; |
| 74 | } |
| 75 | size_t index = std::distance(sMsgQueuePool.begin(), it); |
| 76 | IOSMessageQueue& msgQueue = sMsgQueuePool.at(index); |
| 77 | // create queue handle |
| 78 | static uint32 sQueueHandleCounter = 0; |
| 79 | uint32 queueHandle = (uint32)index | ((sQueueHandleCounter<<12)&0x7FFFFFFF); |
| 80 | sQueueHandleCounter++; |
| 81 | |
| 82 | msgQueue.queueHandle = queueHandle; |
| 83 | msgQueue.msgArraySize = messageCount; |
| 84 | msgQueue.msgArray = (betype<IOSMessage>*)messageArray; |
| 85 | |
| 86 | msgQueue.numQueuedMessages = 0; |
| 87 | msgQueue.readIndex = 0; |
| 88 | |
| 89 | return queueHandle; |
| 90 | } |
| 91 | |
| 92 | IOS_ERROR IOS_DestroyMessageQueue(IOSMsgQueueId msgQueueId) |
| 93 | { |
no test coverage detected