#ifndef _SYS_USCHED_H_
#define _SYS_USCHED_H_
#if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
#ifndef _SYS_TYPES_H_
#include <sys/types.h>
#endif
#ifndef _SYS_CPUMASK_H_
#include <sys/cpumask.h>
#endif
#ifndef _SYS_QUEUE_H_
#include <sys/queue.h>
#endif
#ifndef _SYS_SYSTIMER_H_
#include <sys/systimer.h>
#endif
#define NAME_LENGTH 32
struct lwp;
struct proc;
struct globaldata;
struct usched {
TAILQ_ENTRY(usched) entry;
const char *name;
const char *desc;
void (*usched_register)(void);
void (*usched_unregister)(void);
void (*acquire_curproc)(struct lwp *);
void (*release_curproc)(struct lwp *);
void (*setrunqueue)(struct lwp *);
void (*schedulerclock)(struct lwp *, sysclock_t, sysclock_t);
void (*recalculate)(struct lwp *);
void (*resetpriority)(struct lwp *);
void (*heuristic_forking)(struct lwp *, struct lwp *);
void (*heuristic_exiting)(struct lwp *, struct proc *);
void (*uload_update)(struct lwp *);
void (*setcpumask)(struct usched *, cpumask_t);
void (*yield)(struct lwp *);
void (*changedcpu)(struct lwp *);
};
union usched_data {
struct {
short priority;
char unused01;
char rqindex;
int batch;
int estcpu;
u_short rqtype;
u_short unused02;
} bsd4;
struct {
short priority;
char forked;
char rqindex;
short estfast;
short uload;
int estcpu;
u_short rqtype;
u_short qcpu;
u_short rrcount;
u_short unused01;
u_short unused02;
u_short unused03;
} dfly;
int pad[6];
};
#define USCH_ADD 0x00000001
#define USCH_REM 0x00000010
#endif
#define USCHED_SET_SCHEDULER 0
#define USCHED_SET_CPU 1
#define USCHED_ADD_CPU 2
#define USCHED_DEL_CPU 3
#define USCHED_GET_CPU 4
#define USCHED_GET_CPUMASK 5
#define USCHED_SET_CPUMASK 6
#ifdef _KERNEL
extern struct usched usched_bsd4;
extern struct usched usched_dfly;
extern struct usched usched_dummy;
void dfly_acquire_curproc(struct lwp *);
extern cpumask_t usched_mastermask;
extern int sched_ticks;
int usched_ctl(struct usched *, int);
struct usched *usched_init(void);
void usched_schedulerclock(struct lwp *, sysclock_t, sysclock_t);
#endif
#if !defined(_KERNEL) || defined(_KERNEL_VIRTUAL)
int usched_set(pid_t, int, void *, int);
#endif
#endif