V8/usr/include/CC/task.h

Compare this file to the similar file:
Show the results in this format:

printf(char* ...);

#define SIZE		750
#define MODE		DEDICATED

#define UNTOUCHED	052525

class object;
class sched;
class task;
class qhead;
class qtail;

extern sched* run_chain;		/* list of ready to run scheds */
extern task* task_chain;		/* list of all tasks */

extern int task_error(int, object*);
extern void print_error(int);

#define E_OLINK		1
#define E_ONEXT		2
#define E_GETEMPTY	3
#define E_PUTOBJ	4
#define E_PUTFULL	5
#define E_BACKOBJ	6
#define E_BACKFULL	7
#define E_SETCLOCK	8
#define E_CLOCKIDLE	9
#define E_RESTERM	10
#define E_RESRUN	11
#define E_NEGTIME	12
#define E_RESOBJ	13
#define E_HISTO		14
#define E_STACK 	15
#define E_STORE		16
#define E_TASKMODE	17
#define E_TASKDEL	18
#define E_TASKPRE	19
#define E_TIMERDEL	20
#define E_SCHTIME	21
#define E_SCHOBJ	22
#define E_QDEL		23
#define E_RESULT	24
#define E_WAIT		25
#define MAXERR	E_WAIT

extern char _hwm;
#define hwm()	(_hwm=1)

class olink
/*	the building block for chains of task pointers */
{
friend object;
	olink*	l_next;
	task*	l_task;
		olink(task* t, olink* l) { l_task=t; l_next=l; };
};

class oqueue
{
friend qhead;
friend qtail;
	int	q_max;
	int	q_count;
	object*	q_ptr;
	qhead*	q_head;
	qtail*	q_tail;

		oqueue(int m)	{ q_max=m; q_count=0; q_head=0; q_tail=0; };
		~oqueue()	{ (q_count)?task_error(E_QDEL,0):0; };
	void	print(int);
};

	/*	header file for the task system		*/

#define TIMER		1
#define TASK		2
#define QHEAD		4
#define QTAIL		5

#define IDLE		1
#define RUNNING		2
#define TERMINATED	4

#define DEDICATED	1
#define SHARED		2

#define CHAIN		1
#define VERBOSE		2
#define STACK		4

extern task* clock_task;
extern task* thistask;
extern long clock;


typedef int (*PFIO)(int,object*);
typedef void (*PFV)();

extern PFIO error_fct;
extern PFV exit_fct;

#define EMODE		1
#define WMODE		2
#define ZMODE		3

class object
{
	olink*	o_link;
public:
	object*	o_next;
	int	o_type;

		object(int t = 0)		{ o_type=t; o_link=0; o_next=0; }
		~object();
	void	remember(task* t)	{ o_link = new olink(t,o_link); }
	void	forget(task*);
	void	alert();

	void	print(int);
};

class sched : public object
{
friend timer;
friend task;
friend object;
	void	schedule();
	void	insert(int, object*);
	void	remove();

	long	s_time;		/* holds result after cancel() */
	int	s_state;
public:
	void	print(int);

	long	rdtime()	{ return s_time; };
	int	rdstate()	{ return s_state; };

	void	cancel(int);
	int	result();
};

struct timer : public sched
{
		timer(int);
		~timer();
	void	reset(int);
	void	print(int);
};

class task : public sched
{
friend sched;
		task(char* =0, int =0, int =0);
		~task();

	void	save();
	void	restore();
	int	curr_hwm();

	int*	t_framep;	/* WARNING: t_framep
				   is manipulated as an offset
				   by restore()
				*/
	int*	t_basep;
	int	t_size;		/* holds hwm after cancel() */
	int*	t_savearea;
	int	t_trap;
	class team*	t_team;

	int	t_mode;
	int	t_stacksize;

	object*	t_alert;
public:
	task*	t_next;
	char*	t_name;

	int	waitvec(object**);
	int	waitlist(object* ...);
	void	wait(object* ob)	{ (void) waitlist(ob,0); };

	void	delay(int);
	int	preempt();
	void	sleep();
	void	resultis(int);
	void	cancel(int);

	void	print(int);
};



class qhead : public object
{
friend qtail;
		qhead(int = WMODE, int = 10000);
		~qhead();

	int	qh_mode;
	oqueue*	qh_queue;
public:
	object*	get();
	int	putback(object*);

	int	rdcount()	{ return qh_queue->q_count; }
	int	rdmax()		{ return qh_queue->q_max; }
	int	rdmode()	{ return qh_mode; }
	qtail*	tail();

	qhead*	cut();
	void	splice(qtail*);

	void	setmode(int m)	{ qh_mode = m; };
	void	setmax(int m)	{ qh_queue->q_max = m; };

	void	print(int);
};

class qtail : public object
{
friend qhead;
		qtail(int = WMODE, int = 10000);
		~qtail();

	int	qt_mode;
	oqueue*	qt_queue;
public:
	int	put(object*);

	int	rdspace()	{ return qt_queue->q_max - qt_queue->q_count; };
	int	rdmax()		{ return qt_queue->q_max; };
	int	rdmode()	{ return qt_mode; };

	qtail*	cut();
	void 	splice(qhead*);

	qhead*	head();

	void	setmode(int m)	{ qt_mode = m; };
	void	setmax(int m)	{ qt_queue->q_max = m; };

	void	print(int);
};

struct histogram
/*
	"nbin" bins covering the range [l:r[ uniformly
	nbin*binsize == r-l
*/
{
	int	l, r;
	int	binsize;
	int	nbin;
	int*	h;
	long	sum;
	long	sqsum;
		histogram(int=16, int=0, int=16);

	void	add(int);
	void	print();
};

/*	the result of randint() is always >= 0	*/

#define DRAW (randx = randx*1103515245 + 12345)
#define ABS(x)	(x&0x7fffffff)

#ifdef pdp11
#define MASK(x)	((x>>16)&077777)
#define MAX 32768.0
#endif

#ifdef vax
#define MASK(x) ABS(x)
#define MAX 2147483648.0
#endif

class randint
/*	uniform distribution in the interval [0,MAX] */
{
	long	randx;
public:
		randint(long s = 0)	{ randx=s; }
	void	seed(long s)	{ randx=s; }
	int	draw()		{ return MASK(DRAW); }
	float	fdraw()		{ return ABS(DRAW)/MAX; };
};

class urand : public randint
/*	uniform distribution in the interval [low,high]	*/
{
public:
	int	low, high;
		urand(int l, int h)	{ low=l; high=h; }
	int	draw() { return int(low + (high-low) * (0+randint::draw()/MAX)); }
};

extern double log(double);

class erand : public randint
/*	exponential distribution random number generator */
{
public:
	int	mean;
		erand(int m) { mean=m; };
	int	draw() { return int( (-mean * log( (double) (MAX-randint::draw())/MAX) + .5)); };
};