mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
scheduler: getcwd, getroot, and initialise process cwd and root to vfsroot
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user