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

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