From 47c364a51dc5c2172b4dfdd70af2fbaabe194a20 Mon Sep 17 00:00:00 2001 From: Garrett Smith Date: Wed, 14 Jan 2026 16:36:35 -0800 Subject: [PATCH] use a bitset internally to reduce overhead, but keep struct of bools in public API --- ultramodern/src/mesgqueue.cpp | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/ultramodern/src/mesgqueue.cpp b/ultramodern/src/mesgqueue.cpp index 7adb97b..2f8cc5f 100644 --- a/ultramodern/src/mesgqueue.cpp +++ b/ultramodern/src/mesgqueue.cpp @@ -1,3 +1,4 @@ +#include #include #include "blockingconcurrentqueue.h" @@ -13,27 +14,21 @@ struct QueuedMessage { }; static moodycamel::BlockingConcurrentQueue 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) {