diff options
Diffstat (limited to 'kernel/task.c')
| -rw-r--r-- | kernel/task.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/kernel/task.c b/kernel/task.c index ac54dbe..586340b 100644 --- a/kernel/task.c +++ b/kernel/task.c @@ -9,6 +9,7 @@ #include "console.h" #include "x86.h" +#include "vmem.h" #include "syscalls.h" #include "fs/fs.h" #include "fs/ext2.h" @@ -24,9 +25,10 @@ static volatile struct task_list_struct int parent; bool active; uint32_t esp; // stack pointer of the task; - uint32_t vmem; // number of virtual memory table to switch to + pdirectory *vmem; // number of virtual memory table to switch to bool waiting; bool skipwait; + uint32_t brk; }volatile task_list[MAX_TASKS]; @@ -44,6 +46,7 @@ int add_task(uint32_t esp, uint32_t vmem) task_list[i].active=true; task_list[i].waiting=false; task_list[i].skipwait=false; + task_list[i].brk=task_list[current_task].brk; return i; } @@ -97,6 +100,7 @@ uint32_t task_exit(uint32_t oldesp) int parent_pid=task_list[current_task].parent; log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[%d] exit ", current_task); + if(task_list[parent_pid].active) { if(task_list[parent_pid].waiting) @@ -113,6 +117,8 @@ uint32_t task_exit(uint32_t oldesp) } + vmem_free_dir(task_list[current_task].vmem); + return my_scheduler(oldesp); } @@ -134,18 +140,18 @@ uint32_t task_wait(uint32_t oldesp) uint32_t task_fork(uint32_t oldesp) { int pid=add_task(oldesp,vmem_new_space_dir(task_list[current_task].vmem)); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[%d] forked -> [%d]", current_task, pid); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[%d] forked -> [%d] (free blocks remaining: %d )", current_task, pid,mem_get_free_blocks_count()); return pid; } // init task (root of all other tasks / processes) // -void task_init() +void task_init(pdirectory *dir) { // this is our main task on slot 0 task_list[0].parent=0; task_list[0].active=true; task_list[0].waiting=false; - task_list[0].vmem=0; + task_list[0].vmem=dir; task_list[0].esp = 0; // will be set by next task_switch_next() call. current_task=0; @@ -160,4 +166,13 @@ int task_get_current_pid() return current_task; } +uint32_t task_get_brk() +{ + return task_list[current_task].brk; +} +void task_set_brk(uint32_t brk) +{ + task_list[current_task].brk=brk; +} + |
