diff --git a/include/zenoh-pico/system/common/platform.h b/include/zenoh-pico/system/common/platform.h index 4b3937abd..9c2433cd8 100644 --- a/include/zenoh-pico/system/common/platform.h +++ b/include/zenoh-pico/system/common/platform.h @@ -149,6 +149,7 @@ z_result_t _z_task_init(_z_task_t *task, z_task_attr_t *attr, void *(*fun)(void z_result_t _z_task_join(_z_task_t *task); z_result_t _z_task_detach(_z_task_t *task); z_result_t _z_task_cancel(_z_task_t *task); +void _z_task_exit(void); void _z_task_free(_z_task_t **task); /** diff --git a/src/system/arduino/esp32/system.c b/src/system/arduino/esp32/system.c index e0d4a630d..23876dd50 100644 --- a/src/system/arduino/esp32/system.c +++ b/src/system/arduino/esp32/system.c @@ -97,6 +97,8 @@ z_result_t _z_task_cancel(_z_task_t *task) { return 0; } +void _z_task_exit(void) { vTaskDelete(NULL); } + void _z_task_free(_z_task_t **task) { _z_task_t *ptr = *task; z_free(ptr); diff --git a/src/system/arduino/opencr/system.c b/src/system/arduino/opencr/system.c index ab49a1e5c..fc0dae379 100644 --- a/src/system/arduino/opencr/system.c +++ b/src/system/arduino/opencr/system.c @@ -71,6 +71,8 @@ z_result_t _z_task_detach(_z_task_t *task) { return -1; } z_result_t _z_task_cancel(_z_task_t *task) { return -1; } +void _z_task_exit(void) {} + void _z_task_free(_z_task_t **task) { _z_task_t *ptr = *task; z_free(ptr); diff --git a/src/system/emscripten/system.c b/src/system/emscripten/system.c index b224c0f6b..66dc09418 100644 --- a/src/system/emscripten/system.c +++ b/src/system/emscripten/system.c @@ -56,7 +56,13 @@ z_result_t _z_task_detach(_z_task_t *task) { _Z_CHECK_SYS_ERR(pthread_detach(*ta z_result_t _z_task_cancel(_z_task_t *task) { _Z_CHECK_SYS_ERR(pthread_cancel(*task)); } -void _z_task_free(_z_task_t **task) { *task = NULL; } +void _z_task_exit(void) { pthread_exit(NULL); } + +void _z_task_free(_z_task_t **task) { + _z_task_t *ptr = *task; + z_free(ptr); + *task = NULL; +} /*------------------ Mutex ------------------*/ z_result_t _z_mutex_init(_z_mutex_t *m) { _Z_CHECK_SYS_ERR(pthread_mutex_init(m, 0)); } diff --git a/src/system/espidf/system.c b/src/system/espidf/system.c index 8f6c79c72..cd860314e 100644 --- a/src/system/espidf/system.c +++ b/src/system/espidf/system.c @@ -126,9 +126,13 @@ z_result_t z_task_cancel(_z_task_t *task) { return 0; } +void _z_task_exit(void) { vTaskDelete(NULL); } + void _z_task_free(_z_task_t **task) { - z_free((*task)->join_event); - z_free(*task); + _z_task_t *ptr = *task; + z_free(ptr->join_event); + z_free(ptr); + *task = NULL; } /*------------------ Mutex ------------------*/ diff --git a/src/system/flipper/system.c b/src/system/flipper/system.c index 92c1091ca..1aa2af608 100644 --- a/src/system/flipper/system.c +++ b/src/system/flipper/system.c @@ -91,11 +91,14 @@ z_result_t _z_task_detach(_z_task_t* task) { return -1; } z_result_t _z_task_cancel(_z_task_t* task) { return -1; } +void _z_task_exit(void) {} + void _z_task_free(_z_task_t** task) { if (task == NULL || *task == NULL) { return; } furi_thread_free(**task); + z_free(*task); *task = NULL; } diff --git a/src/system/freertos_plus_tcp/system.c b/src/system/freertos_plus_tcp/system.c index e00d79e0c..7504d9fcd 100644 --- a/src/system/freertos_plus_tcp/system.c +++ b/src/system/freertos_plus_tcp/system.c @@ -142,8 +142,8 @@ z_result_t _z_task_join(_z_task_t *task) { } z_result_t _z_task_detach(_z_task_t *task) { - // Note: task/thread detach not supported on FreeRTOS API, so we force its deletion instead. - return _z_task_cancel(task); + _ZP_UNUSED(task); + return _Z_ERR_GENERIC; } z_result_t _z_task_cancel(_z_task_t *task) { @@ -159,9 +159,12 @@ z_result_t _z_task_cancel(_z_task_t *task) { return _Z_RES_OK; } +void _z_task_exit(void) { vTaskDelete(NULL); } + void _z_task_free(_z_task_t **task) { _z_task_t *ptr = *task; vEventGroupDelete(ptr->join_event); + z_free(ptr); *task = NULL; } diff --git a/src/system/mbed/system.cpp b/src/system/mbed/system.cpp index 5ab66242c..dde824cfb 100644 --- a/src/system/mbed/system.cpp +++ b/src/system/mbed/system.cpp @@ -64,6 +64,8 @@ z_result_t _z_task_cancel(_z_task_t *task) { return res; } +void _z_task_exit(void) {} + void _z_task_free(_z_task_t **task) { _z_task_t *ptr = *task; z_free(ptr); diff --git a/src/system/rpi_pico/system.c b/src/system/rpi_pico/system.c index c6a6ead24..09be82733 100644 --- a/src/system/rpi_pico/system.c +++ b/src/system/rpi_pico/system.c @@ -117,9 +117,13 @@ z_result_t _z_task_cancel(_z_task_t *task) { return 0; } +void _z_task_exit(void) { vTaskDelete(NULL); } + void _z_task_free(_z_task_t **task) { - z_free((*task)->join_event); - z_free(*task); + _z_task_t *ptr = *task; + z_free(ptr->join_event); + z_free(ptr); + *task = NULL; } /*------------------ Mutex ------------------*/ diff --git a/src/system/unix/system.c b/src/system/unix/system.c index 3a92f2b9d..ab58318ce 100644 --- a/src/system/unix/system.c +++ b/src/system/unix/system.c @@ -13,6 +13,7 @@ // #include +#include #include #include #include @@ -114,7 +115,13 @@ z_result_t _z_task_detach(_z_task_t *task) { _Z_CHECK_SYS_ERR(pthread_detach(*ta z_result_t _z_task_cancel(_z_task_t *task) { _Z_CHECK_SYS_ERR(pthread_cancel(*task)); } -void _z_task_free(_z_task_t **task) { *task = NULL; } +void _z_task_exit(void) { pthread_exit(NULL); } + +void _z_task_free(_z_task_t **task) { + _z_task_t *ptr = *task; + z_free(ptr); + *task = NULL; +} /*------------------ Mutex ------------------*/ z_result_t _z_mutex_init(_z_mutex_t *m) { _Z_CHECK_SYS_ERR(pthread_mutex_init(m, 0)); } diff --git a/src/system/windows/system.c b/src/system/windows/system.c index 78086a6c0..eb28916b6 100644 --- a/src/system/windows/system.c +++ b/src/system/windows/system.c @@ -79,6 +79,7 @@ z_result_t _z_task_join(_z_task_t *task) { z_result_t _z_task_detach(_z_task_t *task) { z_result_t ret = _Z_RES_OK; CloseHandle(*task); + *task = 0; return ret; } @@ -88,9 +89,13 @@ z_result_t _z_task_cancel(_z_task_t *task) { return ret; } +void _z_task_exit(void) { ExitThread(0); } + void _z_task_free(_z_task_t **task) { _z_task_t *ptr = *task; - CloseHandle(*ptr); + if (*ptr != 0) { + CloseHandle(*ptr); + } z_free(ptr); *task = NULL; } diff --git a/src/system/zephyr/system.c b/src/system/zephyr/system.c index 3cd8ee634..fd59dc518 100644 --- a/src/system/zephyr/system.c +++ b/src/system/zephyr/system.c @@ -90,7 +90,13 @@ z_result_t _z_task_detach(_z_task_t *task) { _Z_CHECK_SYS_ERR(pthread_detach(*ta z_result_t _z_task_cancel(_z_task_t *task) { _Z_CHECK_SYS_ERR(pthread_cancel(*task)); } -void _z_task_free(_z_task_t **task) { *task = NULL; } +void _z_task_exit(void) { pthread_exit(NULL); } + +void _z_task_free(_z_task_t **task) { + _z_task_t *ptr = *task; + z_free(ptr); + *task = NULL; +} /*------------------ Mutex ------------------*/ z_result_t _z_mutex_init(_z_mutex_t *m) { _Z_CHECK_SYS_ERR(pthread_mutex_init(m, 0)); } diff --git a/src/transport/common/transport.c b/src/transport/common/transport.c index 433a6a1b1..16099c98f 100644 --- a/src/transport/common/transport.c +++ b/src/transport/common/transport.c @@ -29,7 +29,7 @@ void _z_common_transport_clear(_z_transport_common_t *ztc, bool detach_tasks) { } else { _z_task_join(ztc->_read_task); } - z_free(ztc->_read_task); + _z_task_free(&ztc->_read_task); ztc->_read_task = NULL; } if (ztc->_lease_task != NULL) { @@ -39,7 +39,7 @@ void _z_common_transport_clear(_z_transport_common_t *ztc, bool detach_tasks) { } else { _z_task_join(ztc->_lease_task); } - z_free(ztc->_lease_task); + _z_task_free(&ztc->_lease_task); ztc->_lease_task = NULL; } diff --git a/src/transport/unicast/lease.c b/src/transport/unicast/lease.c index f684289d3..b25e23ac7 100644 --- a/src/transport/unicast/lease.c +++ b/src/transport/unicast/lease.c @@ -57,6 +57,8 @@ static void _zp_unicast_failed(_z_transport_unicast_t *ztu) { _Z_ERROR("Reopen failed: %i", ret); } #endif + + _z_task_exit(); } void *_zp_unicast_lease_task(void *ztu_arg) {