use a bitset internally to reduce overhead, but keep struct of bools in public API

This commit is contained in:
Garrett Smith 2026-01-14 16:36:35 -08:00
parent da43a09c9b
commit 47c364a51d

View file

@ -1,3 +1,4 @@
#include <bitset>
#include <thread>
#include "blockingconcurrentqueue.h"
@ -13,27 +14,21 @@ struct QueuedMessage {
};
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) {
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) {
bool requeue_if_blocked = false;
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});
external_messages.enqueue({mq, msg, jam, requeue_enabled[event_type]});
}
void ultramodern::enqueue_external_message(PTR(OSMesgQueue) mq, OSMesg msg, bool jam, bool requeue_if_blocked) {