BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / 9d6eb508c283ff07934a3007f68d4f0c933d5430 / task / task.c

// Related

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;
+}