diff --git a/src/modules/mavlink/mavlink_main.cpp b/src/modules/mavlink/mavlink_main.cpp index ceb4bf891a..9df0992eb2 100644 --- a/src/modules/mavlink/mavlink_main.cpp +++ b/src/modules/mavlink/mavlink_main.cpp @@ -338,31 +338,46 @@ Mavlink::get_instance_for_network_port(unsigned long port) int Mavlink::destroy_all_instances() { - LockGuard lg{mavlink_module_mutex}; - unsigned iterations = 0; - PX4_INFO("waiting for instances to stop"); - for (Mavlink *inst_to_del : mavlink_module_instances) { - if (inst_to_del != nullptr) { - /* set flag to stop thread and wait for all threads to finish */ - inst_to_del->request_stop(); + unsigned iterations = 0; - while (inst_to_del->running()) { - printf("."); - fflush(stdout); - px4_usleep(10000); - iterations++; + while (iterations < 1000) { + int running = 0; - if (iterations > 1000) { - PX4_ERR("Couldn't stop all mavlink instances."); - return PX4_ERROR; + pthread_mutex_lock(&mavlink_module_mutex); + + for (Mavlink *inst_to_del : mavlink_module_instances) { + if (inst_to_del != nullptr) { + if (inst_to_del->running()) { + running++; + + // set flag to stop thread and wait for all threads to finish + inst_to_del->request_stop(); } } } + + pthread_mutex_unlock(&mavlink_module_mutex); + + if (running == 0) { + break; + + } else if (iterations > 1000) { + PX4_ERR("Couldn't stop all mavlink instances."); + return PX4_ERROR; + + } else { + iterations++; + printf("."); + fflush(stdout); + px4_usleep(10000); + } } - //we know all threads have exited, so it's safe to delete objects. + LockGuard lg{mavlink_module_mutex}; + + // we know all threads have exited, so it's safe to delete objects. for (Mavlink *inst_to_del : mavlink_module_instances) { delete inst_to_del; } @@ -370,7 +385,6 @@ Mavlink::destroy_all_instances() delete _event_buffer; _event_buffer = nullptr; - printf("\n"); PX4_INFO("all instances stopped"); return OK; }