summaryrefslogtreecommitdiff
path: root/kernel/task.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/task.c')
-rw-r--r--kernel/task.c23
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;
+}
+