File:  [Research Unix] / researchv9 / jtools / src / demo / asteroids / event.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:59 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv9-SUN3_old, researchv9-SUN3, HEAD
researchv9-SUN3(old)

#include "event.h"
Event	*event, *efree;
#define	NEVENT	32
Event	eventpool[NEVENT];	/* for allocation */

/*
 * Advance the clock
 */
tick()
{
	register Event *e=event;
	if(e==0)
		return;
	--e->dt;
	while(e->dt==0){
		event=e->next;
		if((*e->fn)(e->type))
			(void)addevent(e, e->time, e->fn, e->type);	/* it's gotta work! */
		else{
			e->next=efree;
			efree=e;
		}
		e=event;
	}
}
/*
 * Add an event at time t from now
 */
addevent(e, t, fn, type)
	register Event *e;
	register t;
	int	 (*fn)();
{
	register Event *ep, *last=0;
	if(e==0)
		return 0;
	e->fn=fn;
	e->next=0;
	e->type=type;
	e->time=t;
	for(ep=event; ep; ep=ep->next){
		if(ep->dt < t)
			t -= ep->dt;
		else{	/* gotta insert it here */
			if(last)
				last->next = e;
			ep->dt-=t;
			e->next=ep;
			break;
		}
		last=ep;
	}
	if(last==0)
		event=e;
	else if(last->next==0)
		last->next=e;
	e->dt=t;
	return 1;
}
/*
 * Initially link all the events together
 */
initevent()
{
	register Event *e;
	for(e=eventpool; e<&eventpool[NEVENT-1]; e++)
		e->next=e+1;
	e->next=0;
	efree=eventpool;
	event=0;
}
/*
 * Allocate a new guy out of the array
 */
Event *
newevent()
{
	register Event *e;
	if(e=efree)	/* assignment = */
		efree=efree->next;
	return e;
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.