diff --git a/kernel-src/include/kernel/scheduler.h b/kernel-src/include/kernel/scheduler.h index 4afb7304..28607eac 100644 --- a/kernel-src/include/kernel/scheduler.h +++ b/kernel-src/include/kernel/scheduler.h @@ -81,6 +81,8 @@ int sched_sleep(); proc_t *sched_newproc(); vnode_t *sched_getcwd(); vnode_t *sched_getroot(); +void sched_setcwd(vnode_t *); +void sched_setroot(vnode_t *); thread_t *sched_newthread(void *ip, size_t kstacksize, int priority, proc_t *proc, void *ustack); void sched_destroyproc(proc_t *); void sched_destroythread(thread_t *); diff --git a/kernel-src/sys/scheduler.c b/kernel-src/sys/scheduler.c index d1a2ce40..918d3d2e 100644 --- a/kernel-src/sys/scheduler.c +++ b/kernel-src/sys/scheduler.c @@ -297,6 +297,28 @@ vnode_t *sched_getroot() { return getnodeslock(&proc->root); } +static void setnodeslock(vnode_t **addr, vnode_t *new) { + proc_t *proc = _cpu()->thread->proc; + vnode_t *oldnode; + VOP_HOLD(new); + bool intstatus = interrupt_set(false); + spinlock_acquire(&proc->nodeslock); + oldnode = *addr; + *addr = new; + spinlock_release(&proc->nodeslock); + interrupt_set(intstatus); + VOP_RELEASE(oldnode); +} + +void sched_setcwd(vnode_t *new) { + proc_t *proc = _cpu()->thread->proc; + setnodeslock(&proc->cwd, new); +} +void sched_setroot(vnode_t *new) { + proc_t *proc = _cpu()->thread->proc; + setnodeslock(&proc->root, new); +} + static void timerhook(context_t *context, dpcarg_t arg) { thread_t* current = _cpu()->thread;