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

The start of lwIP mbox and thread.

上级 5ac7038c
...@@ -4,10 +4,14 @@ ...@@ -4,10 +4,14 @@
#include "spinlock.h" #include "spinlock.h"
#include "condvar.h" #include "condvar.h"
typedef int sys_thread_t; typedef struct proc* sys_thread_t;
typedef struct sys_mbox { typedef struct sys_mbox {
#define MBOXSLOTS 32 #define MBOXSLOTS 32
struct spinlock s;
struct condvar c;
int head;
int tail;
void *msg[MBOXSLOTS]; void *msg[MBOXSLOTS];
} sys_mbox_t; } sys_mbox_t;
......
#include "lwip/sys.h" #include "lwip/sys.h"
#include "arch/sys_arch.h" #include "arch/sys_arch.h"
#include "queue.h"
#include "kernel.h" #include "kernel.h"
#include "proc.h"
#define DIE panic(__func__) #define DIE panic(__func__)
...@@ -14,6 +17,10 @@ sys_mbox_new(sys_mbox_t *mbox, int size) ...@@ -14,6 +17,10 @@ sys_mbox_new(sys_mbox_t *mbox, int size)
cprintf("sys_mbox_new: size %u\n", size); cprintf("sys_mbox_new: size %u\n", size);
return ERR_MEM; return ERR_MEM;
} }
mbox->head = 0;
mbox->tail = 0;
initlock(&mbox->s, "lwIP mbox");
initcondvar(&mbox->c, "lwIP mbox");
return ERR_OK; return ERR_OK;
} }
...@@ -51,7 +58,26 @@ sys_mbox_free(sys_mbox_t *mbox) ...@@ -51,7 +58,26 @@ sys_mbox_free(sys_mbox_t *mbox)
u32_t u32_t
sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
{ {
DIE; u64 start, to;
u32 r;
acquire(&mbox->s);
start = nsectime();
to = (u64)timeout*1000000 + start;
while (mbox->head-mbox->tail == 0) {
if (to < nsectime()) {
r = SYS_ARCH_TIMEOUT;
goto done;
}
cv_sleepto(&mbox->c, &mbox->s, to);
}
r = nsectime()-start;
*msg = mbox->msg[mbox->tail % MBOXSLOTS];
mbox->tail++;
done:
release(&mbox->s);
return r;
} }
u32_t u32_t
...@@ -137,7 +163,17 @@ sys_thread_t ...@@ -137,7 +163,17 @@ sys_thread_t
sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, sys_thread_new(const char *name, lwip_thread_fn thread, void *arg,
int stacksize, int prio) int stacksize, int prio)
{ {
DIE; struct proc *p;
p = threadalloc(thread, arg);
safestrcpy(p->name, name, sizeof(p->name));
acquire(&p->lock);
p->state = RUNNABLE;
addrun(p);
release(&p->lock);
return p;
} }
// //
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论