Plan 9 from Bell Labs’s /usr/web/sources/contrib/quanstro/root/sys/src/fs/port/clock.c

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


#include	"all.h"
#include	"mem.h"
#include	"io.h"
#include	"ureg.h"

Talarm	talarm;

void
profinit(void)
{
	extern char etext[];

	cons.minpc = KTZERO;
	cons.maxpc = (uintptr)etext;
	cons.nprofbuf = (cons.maxpc-cons.minpc) >> LRES;
	cons.profbuf = ialloc(cons.nprofbuf*sizeof(cons.profbuf[0]), 0);
}

static struct
{
	Lock;
	int	nfilter;
	Filter*	filters[500];
	int	time;
	int	cons;
} f;

void
dofilter(Filter *ft)
{
	int i;

	lock(&f);
	i = f.nfilter;
	if(i >= nelem(f.filters)) {
		print("dofilter: too many filters\n");
		unlock(&f);
		return;
	}
	f.filters[i] = ft;
	f.nfilter = i+1;
	unlock(&f);
}

void
checkalarms(void)
{
	User *p;
	Timet now;

	if(talarm.list == 0 || canlock(&talarm) == 0)
		return;

	now = 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 < 0)
			break;
		wakeup(p->trend);
		talarm.list = p->tlink;
		p->trend = 0;
	}

	unlock(&talarm);
}

void
processfilt(void)
{
	int i;
	Filter *ft;
	ulong c0, c1;

	for(i=0; i<f.nfilter; i++) {
		ft = f.filters[i];
		c0 = ft->count;
		c1 = c0 - ft->oldcount;
		ft->oldcount = c0;
		ft->filter[0] = famd(ft->filter[0], c1, 59, 60);
		ft->filter[1] = famd(ft->filter[1], c1, 599, 600);
		ft->filter[2] = famd(ft->filter[2], c1, 5999, 6000);
	}
}

void
clock(Timet n, ulong pc)
{
	int i;
	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.count += 10*TK2MS(1);
		else
			m->idle.count += 10*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.count += 10*TK2MS(1);
			}
		}
		m->intrp = 0;

		f.time += TK2MS(1);
		while(f.time >= 1000) {
			f.time -= 1000;
			processfilt();
		}
	}

	if(active.exiting && active.machs&(1<<m->machno)){
		print("someone's exiting\n");
		exit();
	}

	checkalarms();
}

void
consstart(int c)
{
	f.cons = c;
}

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.