//Deian Stefan - PS7
#ifndef __SCHED__H__
#define __SCHED__H__
#include <signal.h>
#include "heap.h"

#define SCHED_NPROC    1024
#define SCHED_READY	0x1
#define SCHED_RUNNING	0x2
#define SCHED_SLEEPING 	0x4
#define SCHED_ZOMBIE 	0x8
#define SCHED_TICKS	 1000 

#define STACK_SIZE    16384

#define THRESH(a,b,c) ((a<=b)?b:(a>=c)?c:a)
#define MAX(a,b) ((a>=b)?a:b)
#define MIN(a,b) ((a<=b)?a:b)
#define STATE(p) (((p)->state==SCHED_READY)?"ready   ":\
		((p)->state==SCHED_RUNNING)?"running ":\
		((p)->state==SCHED_SLEEPING)?"sleeping":\
		((p)->state==SCHED_ZOMBIE)?"zombie  ":"unknown ")

struct sched_proc;
typedef struct sched_proc sched_proc_t;

//generic doubly linked list
//of procs
struct  proc_list {
	sched_proc_t *proc;
	struct proc_list  *next;
	struct proc_list *prev;
};
typedef struct proc_list proc_list_t;
typedef proc_list_t sched_waitq_t;
//--------


sched_proc_t *current,*init,*swapper;

//runq
pheap_t _active;
pheap_t _expired;
pheap_t active;
pheap_t expired;
short _rqueue; //which runq is active
//--------

//other
sigset_t _mask1; 
sched_waitq_t wait_list;
//--------
unsigned long pid_bitmap[SCHED_NPROC/32];
unsigned long long g_ticks;
//--------



int sched_init(void (*init_fn)());
int sched_fork();
int sched_exit(int code);
int sched_wait(int *code);
int sched_sleep(sched_waitq_t *waitq);
int sched_wakeup(sched_waitq_t *waitq);
int sched_nice(int niceval);
int sched_getpid();
int sched_getppid();
unsigned long long sched_gettick();
int sched_ps();
int sched_switch();
int sched_tick();
int sched_waitq_init(sched_waitq_t *wq);

// util methods
int __assign_time_slice(sched_proc_t *proc);
int __effective_prio(sched_proc_t *proc);
int __assign_pid(sched_proc_t *proc);
int __free_pid(sched_proc_t *proc);
int __swap_rqueue();
int __bonus(sched_proc_t *proc);
int __proc_list_init(proc_list_t *l);
proc_list_t *__proc_list_add(proc_list_t *l,sched_proc_t *proc,int flag);
sched_proc_t *__proc_list_del(proc_list_t *l);
int __remove_proc(sched_proc_t *proc,int *code);
int __idle();
int __ps(sched_proc_t *proc);
int __ps_all(sched_proc_t *proc);


#endif

