scheduler: getcwd, getroot, and initialise process cwd and root to vfsroot

This commit is contained in:
Matheus
2023-05-09 23:25:56 -03:00
parent 4cfb83f4fe
commit cfdab9598d
2 changed files with 38 additions and 0 deletions
+4
View File
@@ -50,6 +50,7 @@ typedef struct proc_t {
int flags;
vnode_t *cwd;
vnode_t *root;
spinlock_t nodeslock;
} proc_t;
#include <arch/cpu.h>
@@ -64,6 +65,9 @@ void sched_preparesleep(bool interruptible);
void sched_wakeup(thread_t *thread, int reason);
int sched_sleep();
proc_t *sched_newproc();
vnode_t *sched_getcwd();
vnode_t *sched_getroot();
thread_t *sched_newthread(void *ip, size_t kstacksize, int priority, proc_t *proc, void *ustack);
#endif
+34
View File
@@ -40,6 +40,7 @@ proc_t *sched_newproc() {
proc->threadtablesize = 1;
proc->runningthreadcount = 1;
SPINLOCK_INIT(proc->lock);
SPINLOCK_INIT(proc->nodeslock);
proc->fdcount = 3;
proc->fdfirst = 3;
SPINLOCK_INIT(proc->fdlock);
@@ -273,6 +274,27 @@ void sched_wakeup(thread_t *thread, int reason) {
interrupt_set(intstate);
}
static vnode_t *getnodeslock(vnode_t **addr) {
proc_t *proc = _cpu()->thread->proc;
bool intstatus = interrupt_set(false);
spinlock_acquire(&proc->nodeslock);
vnode_t *vnode = *addr;
VOP_HOLD(vnode);
spinlock_release(&proc->nodeslock);
interrupt_set(intstatus);
return vnode;
}
vnode_t *sched_getcwd() {
proc_t *proc = _cpu()->thread->proc;
return getnodeslock(&proc->cwd);
}
vnode_t *sched_getroot() {
proc_t *proc = _cpu()->thread->proc;
return getnodeslock(&proc->root);
}
static void timerhook(void *private, context_t *context) {
thread_t* current = _cpu()->thread;
@@ -360,6 +382,18 @@ void sched_runinit() {
__assert(interpinterp == NULL);
}
vnode_t *stdinvnode;
__assert(vfs_open(vfsroot, "/dev/console", V_FFLAGS_READ, &stdinvnode) == 0);
vnode_t *stdoutnode;
__assert(vfs_open(vfsroot, "/dev/console", V_FFLAGS_WRITE, &stdoutnode) == 0);
vnode_t *stderrnode;
__assert(vfs_open(vfsroot, "/dev/console", V_FFLAGS_WRITE, &stderrnode) == 0);
proc->cwd = vfsroot;
VOP_HOLD(vfsroot);
proc->root = vfsroot;
VOP_HOLD(vfsroot);
char *argv = {NULL};
char *envp = {NULL};