quinn-os/schedule.h
2021-12-23 21:41:16 +10:00

119 lines
3.0 KiB
C

#ifndef __SCHEDULE_H
#define __SCHEDULE_H
#include "vfs.h"
#include "interrupts.h"
#define TASK_RUNNING 1
#define TASK_NOTRUNNING 2
#define TASK_FINISHED 3
#define TASK_WAITING 4
#define TASK_SLEEPING 5
#define TASK_SEM_WAIT 6
#define TASK_ZOMBIE 7
#define SLEEP_USER 1
#define SLEEP_TCP_ACCEPT 2
#define SLEEP_TCP_READ 3
#define SLEEP_YIELD 4
#ifndef KRNL_STACK_SIZE
# define KRNL_STACK_SIZE 0x4000
#endif
#ifndef USER_STACK_SIZE
# define USER_STACK_SIZE 0x16000
#endif
struct semaphore_t {
unsigned int id;
unsigned char state;
unsigned int timeout;
};
struct mailbox_t {
unsigned int id;
char *data;
unsigned int size;
};
struct task_t {
unsigned int esp;
unsigned int ss;
unsigned int kstack;
unsigned int ustack;
unsigned int cr3;
unsigned int pid;
unsigned int parent;
int timetorun;
unsigned char state;
struct task_t *next_task;
struct task_t *parent_task;
char name[32];
unsigned int stack_pages[KRNL_STACK_SIZE / 0x1000];
struct vfs_file_handle_t filehandles[256];
unsigned int user_pages_at;
unsigned int user_pages_cnt;
unsigned int *user_pages;
unsigned int *user_pages_virt;
unsigned int user_stack_pages[USER_STACK_SIZE / 0x1000];
unsigned int user_env_pages[64];
unsigned int priority;
struct vfs_device_t *selected_device;
char *cwd;
struct window_t **window_list;
unsigned int window_count;
unsigned char fpu_enabled;
unsigned char fpu_data[512];
char *mail;
int mail_len;
struct socket_t *waiting_sockets[25];
struct ptr_vector sockets;
int waiting_socket_count;
unsigned int exit_status;
int sleep_reason;
char zombie_ttl;
struct semaphore_t **semaphores;
unsigned int sem_count;
};
struct tss_t {
unsigned short backlink, __blh;
unsigned int esp0;
unsigned short ss0, __ss0h;
unsigned int esp1;
unsigned short ss1, __ss1h;
unsigned int esp2;
unsigned short ss2, __ss2h;
unsigned int cr3;
unsigned int eip;
unsigned int eflags;
unsigned inteax, ecx, edx, ebx;
unsigned int esp, ebp, esi, edi;
unsigned short es, __esh;
unsigned short cs, __csh;
unsigned short ss, __ssh;
unsigned short ds, __dsh;
unsigned short fs, __fsh;
unsigned short gs, __gsh;
unsigned short ldt, __ldth;
unsigned short trace, bitmap;
};
extern void init_scheduler(void);
extern void wait(struct regs *r);
extern void yield(struct regs *r);
extern struct task_t *sched_new_task();
extern void schedule(struct regs *r);
extern unsigned int sched_sem_new(unsigned char state);
extern void sched_sem_free(unsigned int id);
extern void sched_sem_signal(unsigned int id, unsigned char state);
extern void sched_sem_wait(struct regs *r, unsigned int id, int timeout);
extern int sched_proc_info(unsigned char *buffer, int len, int last_pid);
extern int sched_kill_pid(unsigned int pid);
extern void sched_remove_socket(struct socket_t *s);
extern void sched_remove_socket_from_all_tasks(struct socket_t *s);
extern void sched_tcp_read_wakeup(struct socket_t *s);
#endif