#pragma once #include "list.h" #include "memory.h" #include extern struct task *current_task; enum status { ZOMBIE, THREAD, RUN, WAIT, SLEEP, STOPPED, FORKED }; enum owner { OWNER_KERNEL, OWNER_USER }; #define STACK_SIZE PAGE_SIZE * 4 struct task { uint8_t *esp; uint8_t *esp0; uint32_t *cr3; // physical uint32_t *heap; // virtual uint32_t *eip; uint16_t pid; uint8_t status; uint8_t uid; struct task *daddy; struct task *child; struct list **signals; struct task *next; struct task *prev; }; void scheduler(void); void switch_to_task(struct task *next_task); struct task *create_task(uint8_t uid); int8_t create_kernel_task(void); void remove_task(struct task *task); struct task *copy_task(const struct task *task); void kfork(struct task *daddy); void zombify_task(struct task *task); // utils void exec_fn(void (*fn)(void)); uint16_t fork(void); uint16_t wait(void);