diff --git a/components/pthread/pthread.c b/components/pthread/pthread.c index ef87e8f22..55d90978f 100644 --- a/components/pthread/pthread.c +++ b/components/pthread/pthread.c @@ -591,12 +591,15 @@ int pthread_mutex_destroy(pthread_mutex_t *mutex) return EBUSY; } - // FreeRTOS mutex must not be deleted while taken (breaks priority inheritance): - vTaskSuspendAll(); - pthread_mutex_unlock(mutex); + if (mux->type == PTHREAD_MUTEX_RECURSIVE) { + res = xSemaphoreGiveRecursive(mux->sem); + } else { + res = xSemaphoreGive(mux->sem); + } + if (res != pdTRUE) { + assert(false && "Failed to release mutex!"); + } vSemaphoreDelete(mux->sem); - xTaskResumeAll(); - free(mux); return 0;