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;
}
Ejemplo n.º 2
0
void
Module::initialiseMessageQueues()
{
   gSystemMessageQueue = coreinit::internal::sysAlloc<OSMessageQueue>();
   gSystemMessageArray = reinterpret_cast<OSMessage*>(coreinit::internal::sysAlloc(16 * sizeof(OSMessage)));
   OSInitMessageQueue(gSystemMessageQueue, gSystemMessageArray, 16);
}
Ejemplo n.º 3
0
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));
      }
   }
}