#ifndef _NUCLEUS_TASK_H #define _NUCLEUS_TASK_H #include #include #include #include #include #include typedef struct Task Task; /* Task priorities */ enum Priority { NONE, LOWEST, LOW, NORMAL, HIGH, HIGHEST, }; /* Task states */ enum State { RUNNING, READY, TERMINATED, }; /* Structure for a Task */ struct Task { Object obj; pid_t tid, tgid; uid_t uid, euid, suid; gid_t gid, egid, sgid; enum Priority priority; enum State state; uint32_t inCriticalSection; uintptr_t esi, edi, ebx; uintptr_t esp, ebp, eip; page_dir_t pageDir; /* Namespaces */ FileSystem *fs; Files *files; VirtualMemory *vm; }; extern ObjectType taskType; extern Task *currentTask[]; #define current currentTask[CPUID] /* Check if super-user */ static inline int super_user(void) { return (current->euid == 0); } /* Enter a critical section */ static inline void enter_critical_section(void) { __atomic_add_fetch(¤t->inCriticalSection, 1, __ATOMIC_RELAXED); } /* Exit a critical section */ static inline void exit_critical_section(void) { __atomic_sub_fetch(¤t->inCriticalSection, 1, __ATOMIC_RELAXED); } void init_tasking(void); void schedule(void); pid_t clone(int flags); #endif