diff --git a/platforms/qurt/src/px4/tasks.cpp b/platforms/qurt/src/px4/tasks.cpp index 112fb15452..9263cb91cc 100644 --- a/platforms/qurt/src/px4/tasks.cpp +++ b/platforms/qurt/src/px4/tasks.cpp @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (C) 2022 ModalAI, Inc. All rights reserved. + * Copyright (C) 2022-2026 ModalAI, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -244,6 +244,7 @@ static px4_task_t px4_task_spawn_internal(const char *name, int priority, px4_ma (void *) &taskmap[task_index]); if (retcode != PX4_OK) { + pthread_attr_destroy(&taskmap[task_index].attr); pthread_mutex_unlock(&task_mutex); PX4_ERR("Couldn't create pthread %s", name); return -1; @@ -258,7 +259,7 @@ static px4_task_t px4_task_spawn_internal(const char *name, int priority, px4_ma pthread_mutex_unlock(&task_mutex); - return i; + return task_index; } px4_task_t px4_task_spawn_cmd(const char *name, int scheduler, int priority, int stack_size, px4_main_t entry, @@ -292,15 +293,25 @@ int px4_task_delete(px4_task_t id) if (pthread_self() == pid) { pthread_join(pid, nullptr); + pthread_attr_destroy(&taskmap[id].attr); taskmap[id].isused = false; pthread_mutex_unlock(&task_mutex); pthread_exit(nullptr); } else { rv = pthread_cancel(pid); + pthread_mutex_unlock(&task_mutex); + + if (rv == 0) { + pthread_join(pid, nullptr); + } + + pthread_mutex_lock(&task_mutex); } + pthread_attr_destroy(&taskmap[id].attr); taskmap[id].isused = false; + pthread_mutex_unlock(&task_mutex); return rv; } @@ -315,6 +326,7 @@ void px4_task_exit(int ret) for (i = 0; i < PX4_MAX_TASKS; ++i) { if (taskmap[i].tid == pid) { pthread_mutex_lock(&task_mutex); + pthread_attr_destroy(&taskmap[i].attr); taskmap[i].isused = false; break; } @@ -325,10 +337,9 @@ void px4_task_exit(int ret) } else { PX4_DEBUG("px4_task_exit: %s", taskmap[i].name); + pthread_mutex_unlock(&task_mutex); } - pthread_mutex_unlock(&task_mutex); - pthread_exit((void *)(unsigned long)ret); }