#include #include #include #include static object_type_t task_type = { .ob_name = "task", .ob_size = sizeof(task_t), }; static task_t *kernel_task; static spin_lock_t task_list_lock; static btree_t task_list; BTREE_DEFINE_SIMPLE_GET(task_t, unsigned int, t_tasklist, t_id, task_list_get) BTREE_DEFINE_SIMPLE_INSERT(task_t, t_tasklist, t_id, task_list_insert) 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"); thread_t *kernel_thread = thread_alloc(); kernel_thread->tr_id = 0; kernel_thread->tr_prio = PRIO_NORMAL; kernel_thread->tr_state = THREAD_READY; 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); } task_t *task_alloc(void) { object_t *task_obj = object_create(&task_type); if (!task_obj) { return NULL; } task_t *t = object_data(task_obj); memset(t, 0x00, sizeof *t); return t; } task_t *task_from_pid(unsigned int pid) { unsigned long flags; spin_lock_irqsave(&task_list_lock, &flags); task_t *t = task_list_get(&task_list, pid); spin_unlock_irqrestore(&task_list_lock, flags); return t; }