forked from xuos/xiuos
fix sys_sem_* and sys_mbox_* function
This commit is contained in:
parent
8c0b51161e
commit
a0c6addb14
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue