Nucleus
Barry Signals and small task functions 9d6eb50 (3 years, 2 months ago)
diff --git a/task/task.c b/task/task.c
index b23c54b..a4d137d 100644
--- a/task/task.c
+++ b/task/task.c
@@ -16,12 +16,14 @@ void init_scheduler(void);
void timer_handler(struct InterruptFrame *frame);
static void task_new(Object *);
+static void task_delete(Object *);
/* Task object type */
ObjectType taskType = {
.name = "TASK",
.size = sizeof(Task),
.new = task_new,
+ .delete = task_delete,
};
Task *currentTask[MAX_CPUS];
@@ -39,6 +41,23 @@ task_new(Object *obj)
task->state = READY;
}
+/* Destroy a Task object */
+static void
+task_delete(Object *obj)
+{
+ Task *task = (void *) obj;
+ put(task->executable);
+ 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);
+}
+
/* Move the stack */
static void
move_stack(uintptr_t top, size_t size)
@@ -85,8 +104,41 @@ init_tasking(void)
current->files = new(&filesType);
/* Virtual Memory namespace */
current->vm = new(&virtualMemoryType);
+ /* Signals namespace */
+ current->signals = new(&signalsType);
init_scheduler();
register_interrupt(0, timer_handler);
}
+
+/* Get the current task's PID */
+pid_t
+getpid(void)
+{
+ return current->tgid;
+}
+
+/* Block a task */
+void
+block_task(enum State reason, ObjectList *list)
+{
+ lock(current);
+ current->state = reason;
+ if (list)
+ add(list, current);
+ unlock(current);
+ schedule();
+}
+
+/* Find a task by ID */
+Task *
+find_task(pid_t tid)
+{
+ Task *task = NULL;
+ foreach (taskType.objects, task) {
+ if (task->tid == tid)
+ break;
+ }
+ return task;
+}