提交 18399524 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

More lwIP sys_mbox implementation.

上级 a6a56669
...@@ -12,15 +12,16 @@ typedef struct sys_mbox { ...@@ -12,15 +12,16 @@ typedef struct sys_mbox {
#define MBOXSLOTS 32 #define MBOXSLOTS 32
struct spinlock s; struct spinlock s;
struct condvar c; struct condvar c;
int head; volatile int invalid;
int tail; volatile int head;
volatile int tail;
void *msg[MBOXSLOTS]; void *msg[MBOXSLOTS];
} sys_mbox_t; } sys_mbox_t;
typedef struct sys_sem { typedef struct sys_sem {
struct spinlock s; struct spinlock s;
struct condvar c; struct condvar c;
u8 count; volatile u8 count;
} sys_sem_t; } sys_sem_t;
#define SYS_ARCH_NOWAIT 0xfffffffe #define SYS_ARCH_NOWAIT 0xfffffffe
......
...@@ -26,6 +26,7 @@ sys_mbox_new(sys_mbox_t *mbox, int size) ...@@ -26,6 +26,7 @@ sys_mbox_new(sys_mbox_t *mbox, int size)
} }
mbox->head = 0; mbox->head = 0;
mbox->tail = 0; mbox->tail = 0;
mbox->invalid = 0;
initlock(&mbox->s, "lwIP mbox"); initlock(&mbox->s, "lwIP mbox");
initcondvar(&mbox->c, "lwIP mbox"); initcondvar(&mbox->c, "lwIP mbox");
...@@ -35,7 +36,7 @@ sys_mbox_new(sys_mbox_t *mbox, int size) ...@@ -35,7 +36,7 @@ sys_mbox_new(sys_mbox_t *mbox, int size)
void void
sys_mbox_set_invalid(sys_mbox_t *mbox) sys_mbox_set_invalid(sys_mbox_t *mbox)
{ {
DIE; mbox->invalid = 1;
} }
err_t err_t
...@@ -47,13 +48,18 @@ sys_mbox_trypost(sys_mbox_t *mbox, void *msg) ...@@ -47,13 +48,18 @@ sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
int int
sys_mbox_valid(sys_mbox_t *mbox) sys_mbox_valid(sys_mbox_t *mbox)
{ {
DIE; return !mbox->invalid;
} }
void void
sys_mbox_post(sys_mbox_t *mbox, void *msg) sys_mbox_post(sys_mbox_t *mbox, void *msg)
{ {
DIE; acquire(&mbox->s);
while (mbox->head - mbox->tail == MBOXSLOTS)
cv_sleep(&mbox->c, &mbox->s);
mbox->msg[mbox->head % MBOXSLOTS] = msg;
mbox->head++;
release(&mbox->s);
} }
void void
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论