components: lwip
Implement lwip per-thread-sem with: vTaskSetThreadLocalStoragePointerAndDelCallback/pvTaskGetThreadLocalStoragePointer register sys_thread_tls_free to free per-thread-sem when the thread is terminated. Also let lwip use index CONFIG_LWIP_THREAD_LOCAL_STORAGE_INDEX
This commit is contained in:
parent
ad188c3854
commit
65cccfe89f
|
@ -213,7 +213,7 @@ sys_mbox_new(sys_mbox_t *mbox, int size)
|
||||||
|
|
||||||
(*mbox)->alive = true;
|
(*mbox)->alive = true;
|
||||||
|
|
||||||
LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("new *mbox ok\n"));
|
LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("new *mbox ok mbox=%p os_mbox=%p mbox_lock=%p\n", *mbox, (*mbox)->os_mbox, (*mbox)->lock));
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,13 +231,10 @@ sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
|
||||||
{
|
{
|
||||||
err_t xReturn;
|
err_t xReturn;
|
||||||
|
|
||||||
if (msg == NULL){
|
|
||||||
LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("&msg=%p\n", &msg));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (xQueueSend((*mbox)->os_mbox, &msg, (portTickType)0) == pdPASS) {
|
if (xQueueSend((*mbox)->os_mbox, &msg, (portTickType)0) == pdPASS) {
|
||||||
xReturn = ERR_OK;
|
xReturn = ERR_OK;
|
||||||
} else {
|
} else {
|
||||||
|
LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("trypost mbox=%p fail\n", (*mbox)->os_mbox));
|
||||||
xReturn = ERR_MEM;
|
xReturn = ERR_MEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -295,10 +292,11 @@ sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
|
||||||
ulReturn = SYS_ARCH_TIMEOUT;
|
ulReturn = SYS_ARCH_TIMEOUT;
|
||||||
}
|
}
|
||||||
} else { // block forever for a message.
|
} else { // block forever for a message.
|
||||||
|
|
||||||
while (1){
|
while (1){
|
||||||
LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("sys_arch_mbox_fetch: fetch mbox=%p os_mbox=%p lock=%p\n", mbox, (*mbox)->os_mbox, (*mbox)->lock));
|
LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("sys_arch_mbox_fetch: fetch mbox=%p os_mbox=%p lock=%p\n", mbox, (*mbox)->os_mbox, (*mbox)->lock));
|
||||||
//if (pdTRUE == xQueueReceive((*mbox)->os_mbox, &(*msg), portMAX_DELAY)){
|
if (pdTRUE == xQueueReceive((*mbox)->os_mbox, &(*msg), portMAX_DELAY)){
|
||||||
if (pdTRUE == xQueueReceive((*mbox)->os_mbox, &(*msg), 3000/portTICK_RATE_MS)){ //ESP32_WORKAROUND
|
//if (pdTRUE == xQueueReceive((*mbox)->os_mbox, &(*msg), 3000/portTICK_RATE_MS)){ //ESP32_WORKAROUND
|
||||||
LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("sys_arch_mbox_fetch:mbox rx msg=%p\n", (*msg)));
|
LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("sys_arch_mbox_fetch:mbox rx msg=%p\n", (*msg)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -388,7 +386,6 @@ sys_mbox_free(sys_mbox_t *mbox)
|
||||||
|
|
||||||
LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("sys_mbox_free:free mbox\n"));
|
LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("sys_mbox_free:free mbox\n"));
|
||||||
|
|
||||||
#if 1 //ESP32_WORKAROUND
|
|
||||||
if (uxQueueMessagesWaiting((*mbox)->os_mbox)) {
|
if (uxQueueMessagesWaiting((*mbox)->os_mbox)) {
|
||||||
xQueueReset((*mbox)->os_mbox);
|
xQueueReset((*mbox)->os_mbox);
|
||||||
/* Line for breakpoint. Should never break here! */
|
/* Line for breakpoint. Should never break here! */
|
||||||
|
@ -399,7 +396,6 @@ sys_mbox_free(sys_mbox_t *mbox)
|
||||||
sys_mutex_free(&(*mbox)->lock);
|
sys_mutex_free(&(*mbox)->lock);
|
||||||
free(*mbox);
|
free(*mbox);
|
||||||
*mbox = NULL;
|
*mbox = NULL;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
@ -492,12 +488,13 @@ sys_arch_assert(const char *file, int line)
|
||||||
while(1);
|
while(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SYS_TLS_INDEX CONFIG_LWIP_THREAD_LOCAL_STORAGE_INDEX
|
||||||
/*
|
/*
|
||||||
* get per thread semphore
|
* get per thread semphore
|
||||||
*/
|
*/
|
||||||
sys_sem_t* sys_thread_sem_get(void)
|
sys_sem_t* sys_thread_sem_get(void)
|
||||||
{
|
{
|
||||||
sys_sem_t *sem = (sys_sem_t*)pvTaskGetThreadLocalStoragePointer(xTaskGetCurrentTaskHandle(), 0);
|
sys_sem_t *sem = (sys_sem_t*)pvTaskGetThreadLocalStoragePointer(xTaskGetCurrentTaskHandle(), SYS_TLS_INDEX);
|
||||||
if (!sem){
|
if (!sem){
|
||||||
sem = sys_thread_sem_init();
|
sem = sys_thread_sem_init();
|
||||||
}
|
}
|
||||||
|
@ -505,6 +502,23 @@ sys_sem_t* sys_thread_sem_get(void)
|
||||||
return sem;
|
return sem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sys_thread_tls_free(int index, void* data)
|
||||||
|
{
|
||||||
|
sys_sem_t *sem = (sys_sem_t*)(data);
|
||||||
|
|
||||||
|
if (sem && *sem){
|
||||||
|
LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("sem del, i=%d sem=%p\n", index, *sem));
|
||||||
|
ets_printf("sem del:%p\n", *sem);
|
||||||
|
vSemaphoreDelete(*sem);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sem){
|
||||||
|
LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("sem pointer del, i=%d sem_p=%p\n", index, sem));
|
||||||
|
ets_printf("sem pointer del:%p\n", sem);
|
||||||
|
free(sem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sys_sem_t* sys_thread_sem_init(void)
|
sys_sem_t* sys_thread_sem_init(void)
|
||||||
{
|
{
|
||||||
sys_sem_t *sem = (sys_sem_t*)malloc(sizeof(sys_sem_t*));
|
sys_sem_t *sem = (sys_sem_t*)malloc(sizeof(sys_sem_t*));
|
||||||
|
@ -521,25 +535,19 @@ sys_sem_t* sys_thread_sem_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("sem init %p %p\n", sem, *sem));
|
LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("sem init sem_p=%p sem=%p cb=%p\n", sem, *sem, sys_thread_tls_free));
|
||||||
vTaskSetThreadLocalStoragePointer(xTaskGetCurrentTaskHandle(), 0, sem);
|
vTaskSetThreadLocalStoragePointerAndDelCallback(xTaskGetCurrentTaskHandle(), SYS_TLS_INDEX, sem, (TlsDeleteCallbackFunction_t)sys_thread_tls_free);
|
||||||
|
|
||||||
return sem;
|
return sem;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sys_thread_sem_deinit(void)
|
void sys_thread_sem_deinit(void)
|
||||||
{
|
{
|
||||||
sys_sem_t *sem = sys_thread_sem_get();
|
sys_sem_t *sem = (sys_sem_t*)pvTaskGetThreadLocalStoragePointer(xTaskGetCurrentTaskHandle(), SYS_TLS_INDEX);
|
||||||
if (sem && *sem){
|
|
||||||
LWIP_DEBUGF(THREAD_SAFE_DEBUG, ("sem del:%p %p\n", sem, *sem));
|
|
||||||
vSemaphoreDelete(*sem);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sem){
|
sys_thread_tls_free(SYS_TLS_INDEX, (void*)sem);
|
||||||
free(sem);
|
vTaskSetThreadLocalStoragePointerAndDelCallback(xTaskGetCurrentTaskHandle(), SYS_TLS_INDEX, 0, 0);
|
||||||
}
|
|
||||||
|
|
||||||
vTaskSetThreadLocalStoragePointer(xTaskGetCurrentTaskHandle(), 0, 0);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue