mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
pthread: Fix possible deadlock when using pthread_join() and Debug log level
Possible for a joined task to be deleted at the moment it is logging, meaning it might hold the stdout lock. In that case the lock isn't released and the next task to try and take it (i.e. call printf) will block indefinitely.
This commit is contained in:
parent
b23f8e21cd
commit
aea01b00e1
@ -360,7 +360,7 @@ int pthread_join(pthread_t thread, void **retval)
|
||||
if (pthread->state == PTHREAD_TASK_STATE_RUN) {
|
||||
pthread->join_task = xTaskGetCurrentTaskHandle();
|
||||
wait = true;
|
||||
} else {
|
||||
} else { // thread has exited and task is already suspended, or about to be suspended
|
||||
child_task_retval = pthread->retval;
|
||||
pthread_delete(pthread);
|
||||
}
|
||||
@ -451,10 +451,14 @@ void pthread_exit(void *value_ptr)
|
||||
pthread->state = PTHREAD_TASK_STATE_EXIT;
|
||||
}
|
||||
}
|
||||
xSemaphoreGive(s_threads_mux);
|
||||
|
||||
ESP_LOGD(TAG, "Task stk_wm = %d", uxTaskGetStackHighWaterMark(NULL));
|
||||
|
||||
xSemaphoreGive(s_threads_mux);
|
||||
// note: if this thread is joinable then after giving back s_threads_mux
|
||||
// this task could be deleted at any time, so don't take another lock or
|
||||
// do anything that might lock (such as printing to stdout)
|
||||
|
||||
if (detached) {
|
||||
vTaskDelete(NULL);
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user