mirror of
https://github.com/N64Recomp/N64ModernRuntime.git
synced 2026-05-09 18:31:55 +00:00
use a bitset internally to reduce overhead, but keep struct of bools in public API
This commit is contained in:
parent
da43a09c9b
commit
47c364a51d
1 changed files with 11 additions and 16 deletions
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include <bitset>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
#include "blockingconcurrentqueue.h"
|
#include "blockingconcurrentqueue.h"
|
||||||
|
|
@ -13,27 +14,21 @@ struct QueuedMessage {
|
||||||
};
|
};
|
||||||
|
|
||||||
static moodycamel::BlockingConcurrentQueue<QueuedMessage> external_messages {};
|
static moodycamel::BlockingConcurrentQueue<QueuedMessage> external_messages {};
|
||||||
static ultramodern::MessageQueueControl message_queue_control;
|
std::bitset<32> requeue_enabled;
|
||||||
|
|
||||||
void ultramodern::set_message_queue_control(const ultramodern::MessageQueueControl& mqc) {
|
void ultramodern::set_message_queue_control(const ultramodern::MessageQueueControl& mqc) {
|
||||||
message_queue_control = mqc;
|
requeue_enabled.reset();
|
||||||
|
requeue_enabled.set(OS_EVENT_COUNTER, mqc.requeue_counter);
|
||||||
|
requeue_enabled.set(OS_EVENT_SP, mqc.requeue_sp);
|
||||||
|
requeue_enabled.set(OS_EVENT_SI, mqc.requeue_si);
|
||||||
|
requeue_enabled.set(OS_EVENT_AI, mqc.requeue_ai);
|
||||||
|
requeue_enabled.set(OS_EVENT_VI, mqc.requeue_vi);
|
||||||
|
requeue_enabled.set(OS_EVENT_PI, mqc.requeue_pi);
|
||||||
|
requeue_enabled.set(OS_EVENT_DP, mqc.requeue_dp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ultramodern::enqueue_external_message_type(PTR(OSMesgQueue) mq, OSMesg msg, bool jam, OSEvent event_type) {
|
void ultramodern::enqueue_external_message_type(PTR(OSMesgQueue) mq, OSMesg msg, bool jam, OSEvent event_type) {
|
||||||
bool requeue_if_blocked = false;
|
external_messages.enqueue({mq, msg, jam, requeue_enabled[event_type]});
|
||||||
switch (event_type) {
|
|
||||||
case OS_EVENT_COUNTER: requeue_if_blocked = message_queue_control.requeue_counter; break;
|
|
||||||
case OS_EVENT_SP: requeue_if_blocked = message_queue_control.requeue_sp; break;
|
|
||||||
case OS_EVENT_SI: requeue_if_blocked = message_queue_control.requeue_si; break;
|
|
||||||
case OS_EVENT_AI: requeue_if_blocked = message_queue_control.requeue_ai; break;
|
|
||||||
case OS_EVENT_VI: requeue_if_blocked = message_queue_control.requeue_vi; break;
|
|
||||||
case OS_EVENT_PI: requeue_if_blocked = message_queue_control.requeue_pi; break;
|
|
||||||
case OS_EVENT_DP: requeue_if_blocked = message_queue_control.requeue_dp; break;
|
|
||||||
default:
|
|
||||||
assert(!"unhandled OSEvent type");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
external_messages.enqueue({mq, msg, jam, requeue_if_blocked});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ultramodern::enqueue_external_message(PTR(OSMesgQueue) mq, OSMesg msg, bool jam, bool requeue_if_blocked) {
|
void ultramodern::enqueue_external_message(PTR(OSMesgQueue) mq, OSMesg msg, bool jam, bool requeue_if_blocked) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue