⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 task.h

📁 CFront1.0的源代码,第一代C++编译器的思想...
💻 H
字号:
/* @(#) task.h 1.3 1/27/86 17:47:14 *//*ident	"@(#)cfront:incl/task.h	1.3"*//*	HEADER FILE FOR THE TASK SYSTEM		*/#ifdef DEBUG#define DB(a) printf a#else#define DB(a) /**/#endifprintf(char* ...);void exit(int);#define SIZE		750#define MODE		DEDICATEDclass object;class sched;	/* : public object */class task;	/* : public sched  */class qhead;	/* : public object */class qtail;	/* : public object */class team;extern sched* run_chain;   /* list of ready-to-run scheds (ordered by s_time) */extern task* task_chain;   /* list of tasks */extern int task_error(int, object*);extern void print_error(int);/* object.o_type */#define TIMER		1#define TASK		2#define QHEAD		4#define QTAIL		5/* sched.s_state */#define IDLE		1#define RUNNING		2#define TERMINATED	4/* type of stack */#define DEDICATED	1#define SHARED		2/* loc on stack */#define UNTOUCHED	052525extern task* clock_task;extern task* thistask;extern long clock;void setclock(long);/* error codes */#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_WAITtypedef int (*PFIO)(int,object*);typedef void (*PFV)();extern PFIO error_fct;extern PFV exit_fct;/* print flags */#define CHAIN		1#define VERBOSE		2#define STACK		4/* DATA STRUCTURES *//*	object --> olink --> olink ...	   |         |         |	  ...        V         V	   |        task      task	   V	object --> ...*/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 object{	olink*	o_link;public:	object*	o_next;	int	o_type;		/* TASK,TIMER,QHEAD/QTAIL */		object(int t = 0)	{			DB(("x%x->object::object( %d )\n",this,t));			o_type=t; o_link=0; o_next=0;		}		~object();	void	remember(task* t) {	// save for alert			DB(("%x->object::remember( x%x )\n", this, t));			o_link = new olink(t,o_link);		}	void	forget(task*);	/* remove all occurrences of task from chain */	void	alert();	/* prepare IDLE tasks for scheduling */	void	print(int);};class sched : public object{friend timer;friend task;friend object;	void	schedule();	/* sched clock_task or front of run_chain */	void	insert(int,object*); /* sched for d time units, ?t_alert=obj */	void	remove();	/* remove from run_chain & make IDLE */	long	s_time;		/* time to sched; result after cancel() */	int	s_state;	/* IDLE, RUNNING, TERMINATED */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);};extern _hwm;class task : public sched{friend sched;		task(char* n = 0, int m = 0, int s = 0);		~task();	void	save();	void	restore();	/* swap in new task */	int	curr_hwm();	/* "high water mark" */				/*     (how high stack has risen) */	int*	t_framep;	/* WARNING: t_framep				   is manipulated as an offset				   by restore()				*/	void*	th; /* fudge return from swap */	int*	t_ap;	/* this frame's arg pointer */	int*	t_basep;	int	t_size;		/* holds hwm after cancel() */	int*	t_savearea;	/* for saving stack */	int	t_trap;	team*	t_team;		/* stack and info for sharing */	int	t_mode;		/* DEDICATED/SHARED stack */	int	t_stacksize;	object*	t_alert;	/* object that inserted you */public:	task*	t_next;		/* insertion in "task_chain" */	char*	t_name;	int	waitvec(object**);	int	waitlist(object* ...);	void	wait(object* ob) {		DB(("x%x->task::wait( x%x )\n", this, ob));		(void) waitlist(ob,0);	};	void	delay(int);	int	preempt();	void	sleep();	void	resultis(int);	void	cancel(int);	void	print(int);};/* QUEUE MANIPULATION (see queue.c) *//*	qhead <--> oqueue <--> qtail   (qhead, qtail independent)	oqueue ->> circular queue of objects*//* qh_modes */#define EMODE		1#define WMODE		2#define ZMODE		3class oqueue{friend qhead;friend qtail;	int	q_max;	int	q_count;	object*	q_ptr;	qhead*	q_head;	qtail*	q_tail;		oqueue(int m)	{			DB(("x%x->oqueue( %d )\n", this,m));			q_max=m; q_count=0; q_head=0; q_tail=0;		};		~oqueue()	{			DB(("x%x->~oqueue()\n",this));			(q_count)?task_error(E_QDEL,0):0;		};	void	print(int);};class qhead : public object{friend qtail;		qhead(int = WMODE, int = 10000);		~qhead();	int	qh_mode;	/* EMODE,WMODE,ZMODE */	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#else#define MASK(x) ABS(x)#define MAX 2147483648.0#endifclass 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); };};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -