Furi Thread: don't use thread pointer after FuriThreadStateStopped callback (#1799)
* Furi Thread: correct furi_thread_join, do not use thread pointer after FuriThreadStateStopped callback * Furi: a little bit easier way to do harakiri * Furi: crash on thread self join attempt Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
parent
f8b532f063
commit
5883e134d4
@ -85,7 +85,6 @@ static void furi_thread_body(void* context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
furi_assert(thread->state == FuriThreadStateRunning);
|
furi_assert(thread->state == FuriThreadStateRunning);
|
||||||
furi_thread_set_state(thread, FuriThreadStateStopped);
|
|
||||||
|
|
||||||
if(thread->is_service) {
|
if(thread->is_service) {
|
||||||
FURI_LOG_E(
|
FURI_LOG_E(
|
||||||
@ -99,7 +98,10 @@ static void furi_thread_body(void* context) {
|
|||||||
furi_assert(pvTaskGetThreadLocalStoragePointer(NULL, 0) != NULL);
|
furi_assert(pvTaskGetThreadLocalStoragePointer(NULL, 0) != NULL);
|
||||||
vTaskSetThreadLocalStoragePointer(NULL, 0, NULL);
|
vTaskSetThreadLocalStoragePointer(NULL, 0, NULL);
|
||||||
|
|
||||||
vTaskDelete(thread->task_handle);
|
// from here we can't use thread pointer
|
||||||
|
furi_thread_set_state(thread, FuriThreadStateStopped);
|
||||||
|
|
||||||
|
vTaskDelete(NULL);
|
||||||
furi_thread_catch();
|
furi_thread_catch();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,7 +207,9 @@ void furi_thread_start(FuriThread* thread) {
|
|||||||
bool furi_thread_join(FuriThread* thread) {
|
bool furi_thread_join(FuriThread* thread) {
|
||||||
furi_assert(thread);
|
furi_assert(thread);
|
||||||
|
|
||||||
while(thread->state != FuriThreadStateStopped) {
|
furi_check(furi_thread_get_current() != thread);
|
||||||
|
|
||||||
|
while(eTaskGetState(thread->task_handle) != eDeleted) {
|
||||||
furi_delay_ms(10);
|
furi_delay_ms(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user