Orion
Barry Moving signal handlers into separate namespace 7ae31b0 (2 years, 4 months ago)#ifndef KERNEL_TASK_H #define KERNEL_TASK_H #include <stdint.h> #include <sys/ipc.h> #include <sys/times.h> #include <time.h> #include <signal.h> #include "signal.h" #include "../mem/paging.h" #include "../mem/vm.h" #include "../proc/proc.h" #include "../vfs/vfs.h" #include "../spinlock.h" typedef struct Task Task; typedef struct TaskQueue TaskQueue; /* Process priorities */ enum Priority { NONE, LOWEST, LOW, NORMAL, HIGH, HIGHEST, }; /* Task states */ enum States { RUNNING, READY, TERMINATED, WAITING_FOR_CHILD, WAITING_FOR_IO, SLEEP, }; /* Structure for a Task Queue */ struct TaskQueue { Task *start, *end; Spinlock lock; }; /* Structure of a Task */ struct Task { pid_t tid, tgid; uid_t uid, euid, suid; gid_t gid, egid, sgid; uint8_t priority; char *name; uint32_t usertime, systime; int state; uint64_t sleepExpiry; int status; uintptr_t esp, ebp, eip; Task *next, *tnext, *parent; pid_t ppid; page_dir_t pageDir; Spinlock lock; uint8_t inSyscall; File *executable; VMRegion *stack, *tls; TaskQueue waiting; sigset_t sigset; sigset_t blockedSignals; /* Messages */ Message *msgQueue; /* Namespaces */ FileSystem *fs; Files *files; VirtualMemory *vm; SigHandlers *signals; // Messages *ipc; }; extern Task *currentTask[]; #define current currentTask[CPUID] /* Check if a routine is running as a syscall */ static inline uint8_t in_syscall(void) { if (!current) return 0; return (current->inSyscall); } /* Check if super-user */ static inline int super_user(void) { return (current->euid == 0); } void init_tasking(void); void syscall_handler(InterruptFrame *frame); Task *find_task(pid_t tid); void add_to_queue(TaskQueue *queue, Task *task); void remove_from_queue(TaskQueue *queue, Task *task); Task *pop_from_queue(TaskQueue *queue); void timer_handler(InterruptFrame *frame); void block_task(int reason); void unblock_task(Task *task); void schedule(void); pid_t fork(void); pid_t clone(int flags); void terminate(void); void exit(int status); pid_t waitpid(pid_t pid, int *wstatus, int options); pid_t getpid(void); uid_t getuid(void); int setuid(uid_t uid); uid_t geteuid(void); int seteuid(uid_t euid); gid_t getgid(void); int setgid(gid_t gid); gid_t getegid(void); int setegid(gid_t egid); int isatty(int fd); int execve(const char *file, char *argv[], char *envp[]); void send_sig(Task *target, int sig); int tgkill(pid_t tgid, pid_t tid, int sig); int kill(pid_t pid, int sig); #endif