From a0c6addb142529a610415dc6e57250ce04ad2996 Mon Sep 17 00:00:00 2001 From: lr <1234@qq.com> Date: Thu, 23 May 2024 16:55:36 +0800 Subject: [PATCH] fix sys_sem_* and sys_mbox_* function --- .../services/net/net_server/arch/sys_arch.c | 77 ++++++++----------- .../services/net/net_server/arch/sys_arch.h | 6 +- 2 files changed, 36 insertions(+), 47 deletions(-) diff --git a/Ubiquitous/XiZi_AIoT/services/net/net_server/arch/sys_arch.c b/Ubiquitous/XiZi_AIoT/services/net/net_server/arch/sys_arch.c index f77de8396..6578105d7 100644 --- a/Ubiquitous/XiZi_AIoT/services/net/net_server/arch/sys_arch.c +++ b/Ubiquitous/XiZi_AIoT/services/net/net_server/arch/sys_arch.c @@ -65,12 +65,9 @@ void sys_arch_unprotect(sys_prot_t pval) err_t sys_sem_new(sys_sem_t* sem, u8_t count) { - struct Session sem_session; - sem_t semaphore; - connect_session(&sem_session, sem_server_name, 4096); - sem_create(&sem_session, &semaphore, (int)count); - sem->sem = semaphore; - sem->sess = sem_session; + connect_session(&sem->sess, sem_server_name, 4096); + sem_create(&sem->sess, &sem->sem, (int)count); + #if SYS_STATS ++lwip_stats.sys.sem.used; if (lwip_stats.sys.sem.max < lwip_stats.sys.sem.used) { @@ -162,19 +159,9 @@ err_t sys_mbox_new(sys_mbox_t* mbox, int size) { mbox->first = mbox->last = 0; - - sys_sem_t not_empty; - sys_sem_new(¬_empty, 0); - mbox->not_empty = ¬_empty; - - sys_sem_t not_full; - sys_sem_new(¬_full, 0); - mbox->not_full = ¬_full; - - sys_sem_t mutex; - sys_sem_new(&mutex, 1); - mbox->mutex = &mutex; - + sys_sem_new(&mbox->not_empty, 0); + sys_sem_new(&mbox->not_full, 0); + sys_sem_new(&mbox->mutex, 1); mbox->wait_send = 0; #if SYS_STATS @@ -194,11 +181,10 @@ err_t sys_mbox_new(sys_mbox_t* mbox, int size) void sys_mbox_free(sys_mbox_t* mbox) { if (mbox != SYS_MBOX_NULL){ - sys_arch_sem_wait(mbox->mutex, 0); - sys_sem_free(mbox->not_empty); - sys_sem_free(mbox->not_full); - sys_sem_free(mbox->mutex); - mbox->not_empty = mbox->not_full = mbox->mutex = NULL; + // sys_arch_sem_wait(&mbox->mutex, 0); + // sys_sem_free(&mbox->not_empty); + // sys_sem_free(&mbox->not_full); + // sys_sem_free(&mbox->mutex); free(mbox); mbox = NULL; } @@ -220,20 +206,22 @@ void sys_mbox_post(sys_mbox_t* q, void* msg) if (q == NULL) printf("lw: [%s] alloc %d mbox %p failed\n", __func__, q); - sys_arch_sem_wait(q->mutex, 0); + sys_arch_sem_wait(&q->mutex, 0); printf("sys_mbox_post: mbox %p msg %p\n", (void *)q, (void *)msg); + // (q->last + 1) >= (q->first + SYS_MBOX_SIZE) means mbox is full while ((q->last + 1) >= (q->first + SYS_MBOX_SIZE)) { q->wait_send++; - sys_sem_signal(q->mutex); - sys_arch_sem_wait(q->not_full, 0); - sys_arch_sem_wait(q->mutex, 0); + sys_sem_signal(&q->mutex); + sys_arch_sem_wait(&q->not_full, 0); + sys_arch_sem_wait(&q->mutex, 0); q->wait_send--; } q->msgs[q->last % SYS_MBOX_SIZE] = msg; + // q->first == q->last means mbox is empty if (q->last == q->first) { first = 1; } else { @@ -243,9 +231,9 @@ void sys_mbox_post(sys_mbox_t* q, void* msg) q->last++; if (first) { - sys_sem_signal(q->not_empty); + sys_sem_signal(&q->not_empty); } - sys_sem_signal(q->mutex); + sys_sem_signal(&q->mutex); } err_t sys_mbox_trypost(sys_mbox_t* q, void* msg) @@ -254,12 +242,12 @@ err_t sys_mbox_trypost(sys_mbox_t* q, void* msg) if (q == NULL) printf("lw: [%s] alloc %d mbox %p failed\n", __func__, q); - sys_arch_sem_wait(q->mutex, 0); + sys_arch_sem_wait(&q->mutex, 0); printf("sys_mbox_trypost: mbox %p msg %p\n",(void *)q, (void *)msg); if ((q->last + 1) >= (q->first + SYS_MBOX_SIZE)) { - sys_sem_signal(q->mutex); + sys_sem_signal(&q->mutex); return ERR_MEM; } @@ -274,10 +262,10 @@ err_t sys_mbox_trypost(sys_mbox_t* q, void* msg) q->last++; if (first) { - sys_sem_signal(q->not_empty); + sys_sem_signal(&q->not_empty); } - sys_sem_signal(q->mutex); + sys_sem_signal(&q->mutex); return ERR_OK; } @@ -292,12 +280,13 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t* q, void** msg, u32_t timeout) if (q == NULL) printf("lw: [%s] alloc %d mbox %p failed\n", __func__, q); - sys_arch_sem_wait(q->mutex, 0); + sys_arch_sem_wait(&q->mutex, 0); + // q->first == q->last means mbox is empty while (q->first == q->last) { - sys_sem_signal(q->mutex); - sys_arch_sem_wait(q->not_empty, 0); - sys_arch_sem_wait(q->mutex, 0); + sys_sem_signal(&q->mutex); + sys_arch_sem_wait(&q->not_empty, 0); + sys_arch_sem_wait(&q->mutex, 0); } if (msg != NULL) { @@ -311,10 +300,10 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t* q, void** msg, u32_t timeout) q->first++; if (q->wait_send) { - sys_sem_signal(q->not_full); + sys_sem_signal(&q->not_full); } - sys_sem_signal(q->mutex); + sys_sem_signal(&q->mutex); return 0; } @@ -323,10 +312,10 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t* q, void** msg) if (q == NULL) printf("lw: [%s] alloc %d mbox %p failed\n", __func__, q); - sys_arch_sem_wait(q->mutex, 0); + sys_arch_sem_wait(&q->mutex, 0); if (q->first == q->last) { - sys_sem_signal(q->mutex); + sys_sem_signal(&q->mutex); return SYS_MBOX_EMPTY; } @@ -341,10 +330,10 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t* q, void** msg) q->first++; if (q->wait_send) { - sys_sem_signal(q->not_full); + sys_sem_signal(&q->not_full); } - sys_sem_signal(q->mutex); + sys_sem_signal(&q->mutex); return 0; } diff --git a/Ubiquitous/XiZi_AIoT/services/net/net_server/arch/sys_arch.h b/Ubiquitous/XiZi_AIoT/services/net/net_server/arch/sys_arch.h index 01a20a2f9..e02c42359 100644 --- a/Ubiquitous/XiZi_AIoT/services/net/net_server/arch/sys_arch.h +++ b/Ubiquitous/XiZi_AIoT/services/net/net_server/arch/sys_arch.h @@ -51,9 +51,9 @@ typedef struct sys_sem sys_mutex_t; struct sys_mbox{ int first, last; void *msgs[SYS_MBOX_SIZE]; - struct sys_sem *not_empty; - struct sys_sem *not_full; - struct sys_sem *mutex; + struct sys_sem not_empty; + struct sys_sem not_full; + struct sys_sem mutex; int wait_send; }; typedef struct sys_mbox sys_mbox_t;