Skip to content

Commit

Permalink
Fix transport tasks cleanup (#867)
Browse files Browse the repository at this point in the history
* Fix transport tasks cleanup
* Avoid task FreeRTOS task cancelation on detach
* Add _z_task_exit method
* Fix task cleanup
  • Loading branch information
sashacmc authored Feb 4, 2025
1 parent b60fb7a commit 0678e9f
Show file tree
Hide file tree
Showing 14 changed files with 59 additions and 12 deletions.
1 change: 1 addition & 0 deletions include/zenoh-pico/system/common/platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

/**
Expand Down
2 changes: 2 additions & 0 deletions src/system/arduino/esp32/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions src/system/arduino/opencr/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
8 changes: 7 additions & 1 deletion src/system/emscripten/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)); }
Expand Down
8 changes: 6 additions & 2 deletions src/system/espidf/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 ------------------*/
Expand Down
3 changes: 3 additions & 0 deletions src/system/flipper/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
7 changes: 5 additions & 2 deletions src/system/freertos_plus_tcp/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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;
}

Expand Down
2 changes: 2 additions & 0 deletions src/system/mbed/system.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
8 changes: 6 additions & 2 deletions src/system/rpi_pico/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 ------------------*/
Expand Down
9 changes: 8 additions & 1 deletion src/system/unix/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
//

#include <errno.h>
#include <pthread.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
Expand Down Expand Up @@ -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)); }
Expand Down
7 changes: 6 additions & 1 deletion src/system/windows/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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;
}
Expand Down
8 changes: 7 additions & 1 deletion src/system/zephyr/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)); }
Expand Down
4 changes: 2 additions & 2 deletions src/transport/common/transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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;
}

Expand Down
2 changes: 2 additions & 0 deletions src/transport/unicast/lease.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 0678e9f

Please sign in to comment.