#include #include #include #include #include static struct object_type task_type = { .ob_name = "task", .ob_size = sizeof(struct task), }; static struct task *__kernel_task; static spin_lock_t task_list_lock; static struct btree task_list; BTREE_DEFINE_SIMPLE_GET(struct task, unsigned int, t_tasklist, t_id, task_list_get) BTREE_DEFINE_SIMPLE_INSERT(struct task, t_tasklist, t_id, task_list_insert) struct task *kernel_task(void) { return __kernel_task; } kern_status_t setup_kernel_task(void) { __kernel_task = task_alloc(); if (!__kernel_task) { return KERN_NO_MEMORY; } __kernel_task->t_id = 0; __kernel_task->t_pmap = get_kernel_pmap(); __kernel_task->t_state = TASK_RUNNING; snprintf(__kernel_task->t_name, sizeof __kernel_task->t_name, "kernel_task"); struct thread *kernel_thread = thread_alloc(); kernel_thread->tr_id = 0; kernel_thread->tr_prio = PRIO_NORMAL; kernel_thread->tr_state = THREAD_READY; kernel_thread->tr_parent = __kernel_task; unsigned long flags; task_lock_irqsave(__kernel_task, &flags); queue_push_back(&__kernel_task->t_threads, &kernel_thread->tr_threads); task_unlock_irqrestore(__kernel_task, flags); spin_lock_irqsave(&task_list_lock, &flags); task_list_insert(&task_list, __kernel_task); spin_unlock_irqrestore(&task_list_lock, flags); return KERN_OK; } kern_status_t task_object_type_init(void) { return object_type_register(&task_type); } struct task *task_alloc(void) { struct object *task_obj = object_create(&task_type); if (!task_obj) { return NULL; } struct task *t = object_data(task_obj); memset(t, 0x00, sizeof *t); return t; } struct task *task_from_pid(unsigned int pid) { unsigned long flags; spin_lock_irqsave(&task_list_lock, &flags); struct task *t = task_list_get(&task_list, pid); spin_unlock_irqrestore(&task_list_lock, flags); return t; } struct task *current_task(void) { struct thread *thr = current_thread(); return thr ? thr->tr_parent : NULL; }