Fix my brain dead implementation of the lwIP sys_arch.c glue

上级 6eed9483
......@@ -10,7 +10,6 @@ typedef u64 sys_prot_t;
typedef struct sys_mbox {
#define MBOXSLOTS 32
struct spinlock s;
struct condvar c;
volatile int invalid;
volatile int head;
......@@ -19,7 +18,6 @@ typedef struct sys_mbox {
} sys_mbox_t;
typedef struct sys_sem {
struct spinlock s;
struct condvar c;
volatile int invalid;
volatile u8 count;
......@@ -27,6 +25,7 @@ typedef struct sys_sem {
#define SYS_ARCH_NOWAIT 0xfffffffe
extern void lwip_core_sleep(struct condvar *);
extern void lwip_core_unlock(void);
extern void lwip_core_lock(void);
extern void lwip_core_init(void);
......
......@@ -27,7 +27,6 @@ sys_mbox_new(sys_mbox_t *mbox, int size)
mbox->head = 0;
mbox->tail = 0;
mbox->invalid = 0;
initlock(&mbox->s, "lwIP mbox");
initcondvar(&mbox->c, "lwIP mbox");
return ERR_OK;
......@@ -50,14 +49,12 @@ sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
{
err_t r = ERR_MEM;
acquire(&mbox->s);
if (mbox->head - mbox->tail < MBOXSLOTS) {
mbox->msg[mbox->head % MBOXSLOTS] = msg;
mbox->head++;
cv_wakeup(&mbox->c);
r = ERR_OK;
}
release(&mbox->s);
return r;
}
......@@ -65,16 +62,12 @@ sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
void
sys_mbox_post(sys_mbox_t *mbox, void *msg)
{
acquire(&mbox->s);
while (mbox->head - mbox->tail == MBOXSLOTS) {
lwip_core_unlock();
cv_sleep(&mbox->c, &mbox->s);
lwip_core_lock();
}
while (mbox->head - mbox->tail == MBOXSLOTS)
lwip_core_sleep(&mbox->c);
mbox->msg[mbox->head % MBOXSLOTS] = msg;
mbox->head++;
cv_wakeup(&mbox->c);
release(&mbox->s);
}
void
......@@ -90,7 +83,6 @@ sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
u64 start, to;
u32 r;
acquire(&mbox->s);
start = nsectime();
to = (u64)timeout*1000000 + start;
while (mbox->head-mbox->tail == 0) {
......@@ -99,13 +91,9 @@ sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
r = SYS_ARCH_TIMEOUT;
goto done;
}
lwip_core_unlock();
cv_sleepto(&mbox->c, &mbox->s, to);
lwip_core_lock();
lwip_core_sleep(&mbox->c);
} else {
lwip_core_unlock();
cv_sleep(&mbox->c, &mbox->s);
lwip_core_lock();
lwip_core_sleep(&mbox->c);
}
}
r = nsectime()-start;
......@@ -114,7 +102,6 @@ sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
mbox->tail++;
done:
release(&mbox->s);
return r;
}
......@@ -123,14 +110,12 @@ sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
{
u32_t r = SYS_MBOX_EMPTY;
acquire(&mbox->s);
if (mbox->head - mbox->tail != 0) {
if (msg)
*msg = mbox->msg[mbox->tail % MBOXSLOTS];
mbox->tail++;
r = 0;
}
release(&mbox->s);
return r;
}
......@@ -140,7 +125,6 @@ sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
err_t
sys_sem_new(sys_sem_t *sem, u8_t count)
{
initlock(&sem->s, "lwIP sem");
initcondvar(&sem->c, "lwIP condvar");
sem->count = count;
sem->invalid = 0;
......@@ -167,10 +151,8 @@ sys_sem_valid(sys_sem_t *sem)
void
sys_sem_signal(sys_sem_t *sem)
{
acquire(&sem->s);
sem->count++;
cv_wakeup(&sem->c);
release(&sem->s);
}
u32_t
......@@ -179,7 +161,6 @@ sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
u64 start, to;
u32 r;
acquire(&sem->s);
start = nsectime();
to = (u64)timeout*1000000 + start;
while (sem->count == 0) {
......@@ -188,20 +169,15 @@ sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
r = SYS_ARCH_TIMEOUT;
goto done;
}
lwip_core_unlock();
cv_sleepto(&sem->c, &sem->s, to);
lwip_core_lock();
lwip_core_sleep(&sem->c);
} else {
lwip_core_unlock();
cv_sleep(&sem->c, &sem->s);
lwip_core_lock();
lwip_core_sleep(&sem->c);
}
}
r = nsectime()-start;
sem->count--;
done:
release(&sem->s);
return r;
}
......@@ -273,6 +249,12 @@ lwip_core_lock(void)
}
void
lwip_core_sleep(struct condvar *c)
{
cv_sleep(c, &lwprot.lk);
}
void
lwip_core_init(void)
{
initlock(&lwprot.lk, "lwIP lwprot");
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论