Nucleus
Barry Per-CPU Scheduler bb0cb77 (3 years, 2 months ago)
diff --git a/task/task.c b/task/task.c
index 69af014..b0268e2 100644
--- a/task/task.c
+++ b/task/task.c
@@ -12,7 +12,6 @@
#include <nucleus/object.h>
#include <nucleus/vfs.h>
-void init_scheduler(void);
void timer_handler(struct InterruptFrame *frame);
void syscall_handler(struct InterruptFrame *frame);
@@ -27,17 +26,15 @@ ObjectType taskType = {
.delete = task_delete,
};
-Task *currentTask[MAX_CPUS];
-pid_t nextTid = 1;
extern char stackTop[];
-extern ObjectList *readyQueue[];
/* Create a new Task */
static void
task_new(Object *obj)
{
+ static pid_t tid = 1;
Task *task = (void *) obj;
- task->tid = nextTid++;
+ task->tid = tid++;
task->tgid = task->tid;
task->priority = NORMAL;
task->state = READY;
@@ -48,16 +45,22 @@ static void
task_delete(Object *obj)
{
Task *task = (void *) obj;
- put(task->executable);
- put(task->stack);
+ if (task->executable)
+ put(task->executable);
+ if (task->stack)
+ put(task->stack);
if (task->target)
put(task->target);
if (task->wait)
destroy_list(task->wait);
- put(task->fs);
- put(task->files);
- put(task->vm);
- put(task->signals);
+ if (task->fs)
+ put(task->fs);
+ if (task->files)
+ put(task->files);
+ if (task->vm)
+ put(task->vm);
+ if (task->signals)
+ put(task->signals);
}
/* Move the stack */
@@ -109,7 +112,7 @@ init_tasking(void)
/* Signals namespace */
current->signals = new(&signalsType);
- init_scheduler();
+ cpu->scheduler->tasks = 1;
register_interrupt(0, timer_handler);
register_exception(128, syscall_handler);
}
@@ -139,7 +142,7 @@ unblock_task(Task *task)
{
lock(task);
task->state = READY;
- add(readyQueue[task->priority], task);
+ enqueue_task(task);
unlock(task);
}