From 7e7504cde75b733a39c7ae28daffe89d754897a9 Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 27 Jun 2023 19:34:45 -0300 Subject: [PATCH] scheduler: sched_setroot and sched_setcwd --- kernel-src/include/kernel/scheduler.h | 2 ++ kernel-src/sys/scheduler.c | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) 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;