BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / blob / d3f787c50eda2dadb77ae216aef1f0bd0a686ae3 / include / nucleus / task.h

// Related

Nucleus

Barry Virtual Memory Regions and namespace 381dc7b (3 years, 2 months ago)
#ifndef _NUCLEUS_TASK_H
#define _NUCLEUS_TASK_H

#include <stdint.h>
#include <sys/types.h>
#include <nucleus/cpu.h>
#include <nucleus/object.h>
#include <nucleus/memory.h>
#include <nucleus/vfs.h>

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(&current->inCriticalSection, 1, __ATOMIC_RELAXED);
}
/* Exit a critical section */
static inline void
exit_critical_section(void)
{
	__atomic_sub_fetch(&current->inCriticalSection, 1, __ATOMIC_RELAXED);
}

void init_tasking(void);
void schedule(void);
pid_t clone(int flags);

#endif