From 9a9b0f63ba800f2b3b0ad1a012fd372860bab1c1 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sun, 19 Apr 2026 20:04:18 +0100 Subject: [PATCH] sched: task: optional handle_table pointer can now be passed to task_create --- include/kernel/task.h | 5 ++++- init/main.c | 2 +- sched/task.c | 11 +++++++++-- syscall/task.c | 7 +++++-- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/include/kernel/task.h b/include/kernel/task.h index ce71f75..d3f6751 100644 --- a/include/kernel/task.h +++ b/include/kernel/task.h @@ -39,7 +39,10 @@ struct task { extern struct task *task_alloc(void); extern struct task *task_cast(struct object *obj); -extern struct task *task_create(const char *name, size_t name_len); +extern struct task *task_create( + const char *name, + size_t name_len, + struct handle_table *handles); static inline struct task *task_ref(struct task *task) { return OBJECT_CAST(struct task, t_base, object_ref(&task->t_base)); diff --git a/init/main.c b/init/main.c index db74020..abf6c72 100644 --- a/init/main.c +++ b/init/main.c @@ -108,7 +108,7 @@ void kernel_init(uintptr_t arg) bsp.bsp_trailer.bsp_exec_entry, bsp.bsp_vmo); - struct task *bootstrap_task = task_create("bootstrap", 9); + struct task *bootstrap_task = task_create("bootstrap", 9, NULL); tracek("created bootstrap task (pid=%u)", bootstrap_task->t_id); status = bsp_launch_async(&bsp, bootstrap_task); diff --git a/sched/task.c b/sched/task.c index 53c9414..9b64973 100644 --- a/sched/task.c +++ b/sched/task.c @@ -171,7 +171,10 @@ struct task *task_alloc(void) return t; } -struct task *task_create(const char *name, size_t name_len) +struct task *task_create( + const char *name, + size_t name_len, + struct handle_table *handles) { struct task *task = task_alloc(); if (!task) { @@ -191,9 +194,13 @@ struct task *task_create(const char *name, size_t name_len) VM_USER_LIMIT, &task->t_address_space); + if (!handles) { + handles = handle_table_create(); + } + task->t_address_space->s_pmap = pmap; task->t_state = TASK_RUNNING; - task->t_handles = handle_table_create(); + task->t_handles = handles; if (name) { name_len = MIN(name_len, sizeof task->t_name - 1); diff --git a/syscall/task.c b/syscall/task.c index 3435cad..b348105 100644 --- a/syscall/task.c +++ b/syscall/task.c @@ -124,7 +124,7 @@ kern_status_t sys_task_create( task_unlock_irqrestore(self, flags); - struct task *child = task_create(name, name_len); + struct task *child = task_create(name, name_len, NULL); if (!child) { object_unref(parent_obj); @@ -493,7 +493,10 @@ kern_status_t sys_task_duplicate( return status; } - struct task *new_task = task_create(self->t_name, strlen(self->t_name)); + struct task *new_task = task_create( + self->t_name, + strlen(self->t_name), + NULL); if (!new_task) { put_current_task(self); return KERN_NO_MEMORY;