@@ -9,33 +9,44 @@ struct QueuedMessage {
99 PTR (OSMesgQueue) mq;
1010 OSMesg mesg;
1111 bool jam;
12+ bool requeue_if_blocked;
1213};
1314
1415static moodycamel::BlockingConcurrentQueue<QueuedMessage> external_messages {};
1516
16- void enqueue_external_message (PTR(OSMesgQueue) mq, OSMesg msg, bool jam) {
17- external_messages.enqueue ({mq, msg, jam});
17+ void ultramodern:: enqueue_external_message (PTR(OSMesgQueue) mq, OSMesg msg, bool jam, bool requeue_if_blocked ) {
18+ external_messages.enqueue ({mq, msg, jam, requeue_if_blocked });
1819}
1920
2021bool do_send (RDRAM_ARG PTR (OSMesgQueue) mq_, OSMesg msg, bool jam, bool block);
2122
2223void dequeue_external_messages (RDRAM_ARG1) {
2324 QueuedMessage to_send;
25+ std::vector<QueuedMessage> requeued_messages{};
2426 while (external_messages.try_dequeue (to_send)) {
25- do_send (PASS_RDRAM to_send.mq , to_send.mesg , to_send.jam , false );
27+ if (!do_send (PASS_RDRAM to_send.mq , to_send.mesg , to_send.jam , false ) && to_send.requeue_if_blocked ) {
28+ requeued_messages.push_back (to_send);
29+ }
30+ }
31+ for (QueuedMessage& cur_mesg : requeued_messages) {
32+ external_messages.enqueue (cur_mesg);
2633 }
2734}
2835
2936void ultramodern::wait_for_external_message (RDRAM_ARG1) {
3037 QueuedMessage to_send;
3138 external_messages.wait_dequeue (to_send);
32- do_send (PASS_RDRAM to_send.mq , to_send.mesg , to_send.jam , false );
39+ if (!do_send (PASS_RDRAM to_send.mq , to_send.mesg , to_send.jam , false ) && to_send.requeue_if_blocked ) {
40+ external_messages.enqueue (to_send);
41+ }
3342}
3443
35- void ultramodern::wait_for_external_message_timed (RDRAM_ARG1, u32 millis) {
44+ void ultramodern::wait_for_external_message_timed (RDRAM_ARG u32 millis) {
3645 QueuedMessage to_send;
3746 if (external_messages.wait_dequeue_timed (to_send, std::chrono::milliseconds{millis})) {
38- do_send (PASS_RDRAM to_send.mq , to_send.mesg , to_send.jam , false );
47+ if (!do_send (PASS_RDRAM to_send.mq , to_send.mesg , to_send.jam , false ) && to_send.requeue_if_blocked ) {
48+ external_messages.enqueue (to_send);
49+ }
3950 }
4051}
4152
@@ -138,7 +149,7 @@ extern "C" s32 osSendMesg(RDRAM_ARG PTR(OSMesgQueue) mq_, OSMesg msg, s32 flags)
138149
139150 // Don't directly send to the message queue if this isn't a game thread to avoid contention.
140151 if (!ultramodern::is_game_thread ()) {
141- enqueue_external_message (mq_, msg, jam);
152+ ultramodern:: enqueue_external_message (mq_, msg, jam, false );
142153 return 0 ;
143154 }
144155
@@ -160,7 +171,7 @@ extern "C" s32 osJamMesg(RDRAM_ARG PTR(OSMesgQueue) mq_, OSMesg msg, s32 flags)
160171
161172 // Don't directly send to the message queue if this isn't a game thread to avoid contention.
162173 if (!ultramodern::is_game_thread ()) {
163- enqueue_external_message (mq_, msg, jam);
174+ ultramodern:: enqueue_external_message (mq_, msg, jam, false );
164175 return 0 ;
165176 }
166177
0 commit comments