fix sys_sem_* and sys_mbox_* function

This commit is contained in:
lr 2024-05-23 16:55:36 +08:00
parent 8c0b51161e
commit a0c6addb14
2 changed files with 36 additions and 47 deletions

View File

@ -65,12 +65,9 @@ void sys_arch_unprotect(sys_prot_t pval)
err_t sys_sem_new(sys_sem_t* sem, u8_t count) err_t sys_sem_new(sys_sem_t* sem, u8_t count)
{ {
struct Session sem_session; connect_session(&sem->sess, sem_server_name, 4096);
sem_t semaphore; sem_create(&sem->sess, &sem->sem, (int)count);
connect_session(&sem_session, sem_server_name, 4096);
sem_create(&sem_session, &semaphore, (int)count);
sem->sem = semaphore;
sem->sess = sem_session;
#if SYS_STATS #if SYS_STATS
++lwip_stats.sys.sem.used; ++lwip_stats.sys.sem.used;
if (lwip_stats.sys.sem.max < 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; mbox->first = mbox->last = 0;
sys_sem_new(&mbox->not_empty, 0);
sys_sem_t not_empty; sys_sem_new(&mbox->not_full, 0);
sys_sem_new(&not_empty, 0); sys_sem_new(&mbox->mutex, 1);
mbox->not_empty = &not_empty;
sys_sem_t not_full;
sys_sem_new(&not_full, 0);
mbox->not_full = &not_full;
sys_sem_t mutex;
sys_sem_new(&mutex, 1);
mbox->mutex = &mutex;
mbox->wait_send = 0; mbox->wait_send = 0;
#if SYS_STATS #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) void sys_mbox_free(sys_mbox_t* mbox)
{ {
if (mbox != SYS_MBOX_NULL){ if (mbox != SYS_MBOX_NULL){
sys_arch_sem_wait(mbox->mutex, 0); // sys_arch_sem_wait(&mbox->mutex, 0);
sys_sem_free(mbox->not_empty); // sys_sem_free(&mbox->not_empty);
sys_sem_free(mbox->not_full); // sys_sem_free(&mbox->not_full);
sys_sem_free(mbox->mutex); // sys_sem_free(&mbox->mutex);
mbox->not_empty = mbox->not_full = mbox->mutex = NULL;
free(mbox); free(mbox);
mbox = NULL; mbox = NULL;
} }
@ -220,20 +206,22 @@ void sys_mbox_post(sys_mbox_t* q, void* msg)
if (q == NULL) if (q == NULL)
printf("lw: [%s] alloc %d mbox %p failed\n", __func__, q); 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); 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)) { while ((q->last + 1) >= (q->first + SYS_MBOX_SIZE)) {
q->wait_send++; q->wait_send++;
sys_sem_signal(q->mutex); sys_sem_signal(&q->mutex);
sys_arch_sem_wait(q->not_full, 0); sys_arch_sem_wait(&q->not_full, 0);
sys_arch_sem_wait(q->mutex, 0); sys_arch_sem_wait(&q->mutex, 0);
q->wait_send--; q->wait_send--;
} }
q->msgs[q->last % SYS_MBOX_SIZE] = msg; q->msgs[q->last % SYS_MBOX_SIZE] = msg;
// q->first == q->last means mbox is empty
if (q->last == q->first) { if (q->last == q->first) {
first = 1; first = 1;
} else { } else {
@ -243,9 +231,9 @@ void sys_mbox_post(sys_mbox_t* q, void* msg)
q->last++; q->last++;
if (first) { 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) 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) if (q == NULL)
printf("lw: [%s] alloc %d mbox %p failed\n", __func__, q); 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); printf("sys_mbox_trypost: mbox %p msg %p\n",(void *)q, (void *)msg);
if ((q->last + 1) >= (q->first + SYS_MBOX_SIZE)) { if ((q->last + 1) >= (q->first + SYS_MBOX_SIZE)) {
sys_sem_signal(q->mutex); sys_sem_signal(&q->mutex);
return ERR_MEM; return ERR_MEM;
} }
@ -274,10 +262,10 @@ err_t sys_mbox_trypost(sys_mbox_t* q, void* msg)
q->last++; q->last++;
if (first) { 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; 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) if (q == NULL)
printf("lw: [%s] alloc %d mbox %p failed\n", __func__, q); 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) { while (q->first == q->last) {
sys_sem_signal(q->mutex); sys_sem_signal(&q->mutex);
sys_arch_sem_wait(q->not_empty, 0); sys_arch_sem_wait(&q->not_empty, 0);
sys_arch_sem_wait(q->mutex, 0); sys_arch_sem_wait(&q->mutex, 0);
} }
if (msg != NULL) { if (msg != NULL) {
@ -311,10 +300,10 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t* q, void** msg, u32_t timeout)
q->first++; q->first++;
if (q->wait_send) { 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; return 0;
} }
@ -323,10 +312,10 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t* q, void** msg)
if (q == NULL) if (q == NULL)
printf("lw: [%s] alloc %d mbox %p failed\n", __func__, q); 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) { if (q->first == q->last) {
sys_sem_signal(q->mutex); sys_sem_signal(&q->mutex);
return SYS_MBOX_EMPTY; return SYS_MBOX_EMPTY;
} }
@ -341,10 +330,10 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t* q, void** msg)
q->first++; q->first++;
if (q->wait_send) { 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; return 0;
} }

View File

@ -51,9 +51,9 @@ typedef struct sys_sem sys_mutex_t;
struct sys_mbox{ struct sys_mbox{
int first, last; int first, last;
void *msgs[SYS_MBOX_SIZE]; void *msgs[SYS_MBOX_SIZE];
struct sys_sem *not_empty; struct sys_sem not_empty;
struct sys_sem *not_full; struct sys_sem not_full;
struct sys_sem *mutex; struct sys_sem mutex;
int wait_send; int wait_send;
}; };
typedef struct sys_mbox sys_mbox_t; typedef struct sys_mbox sys_mbox_t;