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

Add a threadalloc function that behaves like Linux' kthread_create.

Use threadalloc to create gc_worker threads (and eventually use it for lwIP threads.)
上级 0410531d
......@@ -123,12 +123,8 @@ gc(void)
void
gc_worker(void)
gc_worker(void *x)
{
release(&myproc()->lock); // initially held by scheduler
mtstart(rcu_gc_worker, myproc());
struct spinlock wl;
initlock(&wl, "rcu_gc_worker"); // dummy lock
......
......@@ -108,8 +108,7 @@ void gc_begin_epoch();
void gc_end_epoch();
void gc_delayed(void*, void (*dofree)(void*));
void gc_delayed2(int, u64, void (*dofree)(int, u64));
void gc_start(void);
void gc_worker(void);
void gc_start(void);
// hwvm.c
void freevm(pml4e_t*);
......@@ -228,6 +227,7 @@ void userinit(void);
int wait(void);
void yield(void);
void migrate(struct proc *);
struct proc* threadalloc(void (*fn)(void*), void *arg);
// prof.c
extern int profenable;
......
......@@ -12,6 +12,8 @@
#include "vm.h"
#include "sched.h"
extern void threadstub(void);
int __mpalign__ idle[NCPU];
struct ns *nspid __mpalign__;
static struct proc *bootproc __mpalign__;
......@@ -267,17 +269,19 @@ inituser(void)
release(&p->lock);
for (u32 c = 0; c < NCPU; c++) {
struct proc *rcup = allocproc();
rcup->vmap = vmap_alloc();
rcup->context->rip = (u64) gc_worker;
rcup->cwd = 0;
rcup->cpuid = c;
rcup->cpu_pin = 1;
acquire(&rcup->lock);
rcup->state = RUNNABLE;
addrun(rcup);
release(&rcup->lock);
extern void gc_worker(void*);
struct proc *gcp;
gcp = threadalloc(gc_worker, NULL);
if (gcp == NULL)
panic("threadalloc: gc_worker");
gcp->cpuid = c;
gcp->cpu_pin = 1;
acquire(&gcp->lock);
gcp->state = RUNNABLE;
addrun(gcp);
release(&gcp->lock);
}
}
......@@ -352,7 +356,7 @@ scheduler(void)
mtpause(schedp);
if (p->context->rip != (uptr)forkret &&
p->context->rip != (uptr)gc_worker)
p->context->rip != (uptr)threadstub)
{
mtresume(p);
}
......@@ -663,3 +667,34 @@ wait(void)
release(&myproc()->lock);
}
}
void
threadhelper(void (*fn)(void *), void *arg)
{
release(&myproc()->lock); // initially held by scheduler
mtstart(fn, myproc());
fn(arg);
exit();
}
struct proc*
threadalloc(void (*fn)(void *), void *arg)
{
struct proc *p;
p = allocproc();
if (p == NULL)
return NULL;
p->vmap = vmap_alloc();
if (p->vmap == NULL) {
gc_delayed(p, kmfree);
return NULL;
}
p->context->rip = (u64)threadstub;
p->context->r12 = (u64)fn;
p->context->r13 = (u64)arg;
p->cwd = 0;
return p;
}
......@@ -24,3 +24,9 @@ swtch:
popq %rbp
popq %rbx
ret
.globl threadstub
threadstub:
movq %r12, %rdi
movq %r13, %rsi
jmp threadhelper
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论