1#include "basis/seadNew.h"
2#include "basis/seadRawPrint.h"
3#include "thread/seadMessageQueue.h"
4
5namespace sead
6{
7MessageQueue::MessageQueue() = default;
8
9MessageQueue::~MessageQueue() = default;
10
11void MessageQueue::allocate(s32 size, Heap* heap)
12{
13 if (size <= 0)
14 {
15 SEAD_ASSERT_MSG(false, "MessageQueue size must not be zero");
16 return;
17 }
18
19 mBuffer = new (heap) Element[size];
20 nn::os::InitializeMessageQueue(&mMessageQueueInner, buf: reinterpret_cast<u64*>(mBuffer), queueCount: size);
21}
22
23void MessageQueue::free()
24{
25 nn::os::FinalizeMessageQueue(&mMessageQueueInner);
26 if (mBuffer)
27 {
28 delete[] mBuffer;
29 mBuffer = nullptr;
30 }
31}
32
33bool MessageQueue::push(MessageQueue::Element message, MessageQueue::BlockType block_type)
34{
35 if (block_type == BlockType::Blocking)
36 {
37 nn::os::SendMessageQueue(&mMessageQueueInner, message);
38 return true;
39 }
40
41 return nn::os::TrySendMessageQueue(&mMessageQueueInner, message);
42}
43
44MessageQueue::Element MessageQueue::pop(MessageQueue::BlockType block_type)
45{
46 u64 message;
47
48 if (block_type == BlockType::Blocking)
49 {
50 nn::os::ReceiveMessageQueue(out: &message, &mMessageQueueInner);
51 return message;
52 }
53
54 if (nn::os::TryReceiveMessageQueue(out: &message, &mMessageQueueInner))
55 return message;
56 return 0;
57}
58
59MessageQueue::Element MessageQueue::peek(MessageQueue::BlockType block_type) const
60{
61 u64 message;
62
63 if (block_type == BlockType::Blocking)
64 {
65 nn::os::PeekMessageQueue(&message, &mMessageQueueInner);
66 return message;
67 }
68
69 if (nn::os::TryPeekMessageQueue(&message, &mMessageQueueInner))
70 return message;
71 return 0;
72}
73
74bool MessageQueue::jam(MessageQueue::Element message, MessageQueue::BlockType block_type)
75{
76 if (block_type == BlockType::Blocking)
77 {
78 nn::os::JamMessageQueue(&mMessageQueueInner, message);
79 return true;
80 }
81
82 return nn::os::TryJamMessageQueue(&mMessageQueueInner, message);
83}
84} // namespace sead
85