From 08ee3208b2923c43b8f602c519223c9b528522a7 Mon Sep 17 00:00:00 2001 From: Daniel Agar Date: Wed, 8 Dec 2021 16:00:42 -0500 Subject: [PATCH] mavlink: stop_command fix potential dead lock --- src/modules/mavlink/mavlink_main.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/modules/mavlink/mavlink_main.cpp b/src/modules/mavlink/mavlink_main.cpp index 9df0992eb2..495676ca53 100644 --- a/src/modules/mavlink/mavlink_main.cpp +++ b/src/modules/mavlink/mavlink_main.cpp @@ -3035,13 +3035,24 @@ Mavlink::stop_command(int argc, char *argv[]) if (inst != nullptr) { /* set flag to stop thread and wait for all threads to finish */ if (inst->running() && !inst->should_exit()) { - inst->request_stop(); + int iterations = 0; + + while ((iterations < 1000) && inst->running()) { + inst->request_stop(); + iterations++; + px4_usleep(1000); + } + + if (inst->running()) { + PX4_ERR("unable to stop instance %d", inst->get_instance_id()); + return PX4_ERROR; + } LockGuard lg{mavlink_module_mutex}; for (int mavlink_instance = 0; mavlink_instance < MAVLINK_COMM_NUM_BUFFERS; mavlink_instance++) { if (mavlink_module_instances[mavlink_instance] == inst) { - delete mavlink_module_instances[mavlink_instance]; + delete inst; mavlink_module_instances[mavlink_instance] = nullptr; return PX4_OK; }