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

📄 clock.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include	"all.h"#include	"mem.h"#include	"io.h"#include	"ureg.h"Alarm*	alarmtab;Talarm	talarm;/* * Insert new into list after where */static voidinsert(Alarm **head, Alarm *where, Alarm *new){	if(where == 0){		new->next = *head;		*head = new;	}else{		new->next = where->next;		where->next = new;	}		}/* * Delete old from list.  where->next is known to be old. */static voiddelete(Alarm **head, Alarm *where, Alarm *old){	if(where == 0){		*head = old->next;		return;	}	where->next = old->next;}Alarm*alarm(int ms, void (*f)(Alarm*, void*), void *arg){	Alarm *a, *w, *pw;	ulong s;	if(ms < 0)		ms = 0;	a = newalarm();	a->dt = MS2TK(ms);	a->f = f;	a->arg = arg;	s = splhi();	lock(&m->alarmlock);	pw = 0;	for(w=m->alarm; w; pw=w, w=w->next){		if(w->dt <= a->dt){			a->dt -= w->dt;			continue;		}		w->dt -= a->dt;		break;	}	insert(&m->alarm, pw, a);	unlock(&m->alarmlock);	splx(s);	return a;}voidcancel(Alarm *a){	a->f = 0;}Alarm*newalarm(void){	int i;	Alarm *a;	for(i=0,a=alarmtab; i<conf.nalarm; i++,a++)		if(a->busy==0 && a->f==0 && canlock(a)){			if(a->busy){				unlock(a);				continue;			}			a->f = 0;			a->arg = 0;			a->busy = 1;			unlock(a);			return a;		}	panic("newalarm");	return 0;}voidalarminit(void){	extern char etext[];	cons.minpc = KTZERO;	cons.maxpc = (ulong)etext;	cons.nprofbuf = (cons.maxpc-cons.minpc) >> LRES;	cons.profbuf = ialloc(cons.nprofbuf*sizeof(cons.profbuf[0]), 0);	alarmtab = ialloc(conf.nalarm*sizeof(Alarm), 0);}staticstruct{	int	nfilter;	Filter*	filters[1000];	int	time;	int	index;	int	cons;} f;voiddofilter(Filter *ft, int c1, int c2, int c3){	int i;	i = f.nfilter;	if(i >= nelem(f.filters)) {		print("dofilter: too many filters\n");		return;	}	ft->c1 = c1;	ft->c2 = c2;	ft->c3 = c3;	f.filters[i] = ft;	f.nfilter = i+1;}voidcheckalarms(void){	User *p;	Timet now;	if(talarm.list == 0 || canlock(&talarm) == 0)		return;	now = MACHP(0)->ticks;	for(;;) {		p = talarm.list;		if(p == 0)			break;		if(p->twhen == 0) {			talarm.list = p->tlink;			p->trend = 0;			continue;		}		if(now < p->twhen)			break;		wakeup(p->trend);		talarm.list = p->tlink;		p->trend = 0;	}	unlock(&talarm);}voidprocessfilt(int n){	int i;	Filter *ft;	ulong c0, c1;	n += f.index;	if(n > f.nfilter)		n = f.nfilter;	for(i=f.index; i<n; i++) {		ft = f.filters[i];		c0 = ft->count;		c1 = c0 - ft->oldcount;		ft->oldcount = c0;		if(ft->c2)			ft->filter = famd(ft->filter, c1, ft->c1, ft->c2);	}	f.index = n;}voidclock(Timet n, ulong pc){	int i;	Alarm *a;	void (*fn)(Alarm*, void*);	User *p;	clockreload(n);	m->ticks++;	if(cons.profile) {		cons.profbuf[0] += TK2MS(1);		if(cons.minpc<=pc && pc<cons.maxpc){			pc -= cons.minpc;			pc >>= LRES;			cons.profbuf[pc] += TK2MS(1);		} else			cons.profbuf[1] += TK2MS(1);	}	lights(Lreal, (m->ticks>>6)&1);	if(m->machno == 0){		if(f.cons >= 0) {			(*consputc)(f.cons);			f.cons = -1;		}		p = m->proc;		if(p == 0)			p = m->intrp;		if(p) {			p->time[0].count += TK2MS(1);			p->time[1].count += TK2MS(1);			p->time[2].count += TK2MS(1);		}		for(i=1; i<conf.nmach; i++){			if(active.machs & (1<<i)){				p = MACHP(i)->proc;				if(p && p != m->intrp) {					p->time[0].count += TK2MS(1);					p->time[1].count += TK2MS(1);					p->time[2].count += TK2MS(1);				}			}		}		m->intrp = 0;		f.time += TK2MS(1);		processfilt(TK2SEC(f.nfilter));		while(f.time >= 1000) {			f.time -= 1000;			processfilt(f.nfilter-f.index);			f.index = 0;		}	}	if(active.exiting && active.machs&(1<<m->machno)){		print("someone's exiting\n");		exit();	}	checkalarms();	if(canlock(&m->alarmlock)){		if(m->alarm){			a = m->alarm;			a->dt--;			while(a && a->dt<=0){				fn = a->f;	/* avoid race with cancel */				if(fn)					(*fn)(a, a->arg);				delete(&m->alarm, 0, a);				a->busy = 0;				a = m->alarm;			}		}		unlock(&m->alarmlock);	}}voidconsstart(int c){	f.cons = c;}

⌨️ 快捷键说明

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