int main(int argc, char **argv) { OSMessage msg; int i; OSInitMessageQueue(&sQueue, sMessages, NumMessages); OSCreateThread(&sThread, msgThreadEntry, 0, NULL, sThreadStack + StackSize, StackSize, 20, 0); OSResumeThread(&sThread); // Make sure other thread gets to a blocking read OSSleepTicks(OSMillisecondsToTicks(10)); // Sending message into empty queue should succeed. for (i = 0; i < NumMessages; ++i) { msg.message = (void *)1; msg.args[0] = 2 + i; msg.args[1] = 3; msg.args[2] = 4; test_eq(OSSendMessage(&sQueue, &msg, 0), TRUE); } // Make sure other thread gets a chance to read all messages. OSSleepTicks(OSMillisecondsToTicks(10)); test_eq(sMessagesRead, NumMessages); return 0; }
void Module::initialiseMessageQueues() { gSystemMessageQueue = coreinit::internal::sysAlloc<OSMessageQueue>(); gSystemMessageArray = reinterpret_cast<OSMessage*>(coreinit::internal::sysAlloc(16 * sizeof(OSMessage))); OSInitMessageQueue(gSystemMessageQueue, gSystemMessageArray, 16); }
static uint32_t appIoThreadEntry(uint32_t coreId, void *arg2) { auto queue = &sAppIo->queues[coreId]; OSInitMessageQueue(queue, &sAppIo->messages[coreId * MessagesPerCore], MessagesPerCore); while (true) { OSMessage msg; OSReceiveMessage(queue, &msg, OSMessageFlags::Blocking); auto funcType = static_cast<OSFunctionType>(msg.args[2].value()); switch (funcType) { case OSFunctionType::FsaCmdAsync: { auto result = FSAGetAsyncResult(&msg); if (result->userCallback) { result->userCallback(result->error, result->command, result->request, result->response, result->userContext); } break; } case OSFunctionType::FsCmdAsync: { auto result = FSGetAsyncResult(&msg); if (result->asyncData.userCallback) { result->asyncData.userCallback(result->client, result->block, result->status, result->asyncData.userContext); } break; } case OSFunctionType::FsCmdHandler: { fsCmdBlockHandleResult(reinterpret_cast<FSCmdBlockBody *>(msg.message.get())); break; } default: decaf_abort(fmt::format("Unimplemented OSFunctionType {}", funcType)); } } }