From 8874d533bb7320d8ac469b4df36745852ace8ad2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20=C3=96zkan?= Date: Wed, 26 Nov 2025 12:06:22 +0300 Subject: [PATCH] add fast-path mavlink forwarding for single instance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Counts active mavlink instances atomically when instances are claimed or released and uses that value to early-exit the forwarding logic. It means on single-instance scenarios this will skip taking the mavlink_module_mutex lock and will not iterate over mavlink_module_instances on every received message. Signed-off-by: Onur Özkan --- src/modules/mavlink/mavlink_main.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/modules/mavlink/mavlink_main.cpp b/src/modules/mavlink/mavlink_main.cpp index c39579645b..1cb63d526d 100644 --- a/src/modules/mavlink/mavlink_main.cpp +++ b/src/modules/mavlink/mavlink_main.cpp @@ -54,6 +54,7 @@ #include #include +#include #include #include @@ -82,6 +83,8 @@ static pthread_mutex_t mavlink_module_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t mavlink_event_buffer_mutex = PTHREAD_MUTEX_INITIALIZER; +static px4::atomic mavlink_instance_count {0}; + events::EventBuffer *Mavlink::_event_buffer = nullptr; Mavlink *mavlink_module_instances[MAVLINK_COMM_NUM_BUFFERS] {}; @@ -161,6 +164,7 @@ Mavlink::~Mavlink() if (_instance_id >= 0) { mavlink_module_instances[_instance_id] = nullptr; + mavlink_instance_count.fetch_sub(1); } // if this instance was responsible for checking events then select a new mavlink instance @@ -265,6 +269,7 @@ Mavlink::set_instance_id() if (mavlink_module_instances[instance_id] == nullptr) { mavlink_module_instances[instance_id] = this; _instance_id = instance_id; + mavlink_instance_count.fetch_add(1); return true; } } @@ -463,6 +468,11 @@ Mavlink::forward_message(const mavlink_message_t *msg, Mavlink *self) } } + // Avoid locking/iteration when there is no instance to forward to. + if (mavlink_instance_count.load() <= 1) { + return; + } + // If it's a message only for us, we keep it if (target_system_id == self->get_system_id() && target_component_id == self->get_component_id()) { return;