plan 9 kernel history: overview | file list | diff list

1990/1106/power/clock.c (diff list | history)

1990/0227/sys/src/9/power/clock.c:17,231990/0614/sys/src/9/power/clock.c:17,23 (short | long)
1990/0227    
	if(ms < 0) 
		ms = 0; 
	a = newalarm(); 
	a->dt = ms/MS2HZ; 
1990/0614    
	a->dt = MS2TK(ms); 
1990/0227    
	a->f = f; 
	a->arg = arg; 
	s = splhi(); 
1990/0614/sys/src/9/power/clock.c:135,1471990/0728/sys/src/9/power/clock.c:135,149 (short | long)
1990/0227    
	m->ticks = 0; 
} 
 
1990/0728    
#define NA 10 
1990/0227    
void 
clock(ulong n) 
{ 
	int i; 
1990/0728    
	int i, na; 
1990/0227    
	Alarm *a; 
	void (*f)(void*); 
	Proc *p; 
1990/0728    
	Alarm *alist[NA]; 
1990/0227    
 
	if(n&INTR2){ 
		i = *CLRTIM0; 
1990/0614/sys/src/9/power/clock.c:170,1851990/0728/sys/src/9/power/clock.c:172,193
1990/0227    
			if(m->alarm){ 
				a = m->alarm; 
				a->dt--; 
				while(a && a->dt<=0){ 
					f = a->f;	/* avoid race with cancel */ 
					if(f) 
						(*f)(a); 
1990/0728    
				for(na = 0; a && a->dt<=0 && na<NA; na++){ 
					alist[na] = a; 
1990/0227    
					delete(&m->alarm, 0, a); 
					a->busy = 0; 
					a = m->alarm; 
				} 
			} 
			unlock(&m->alarmlock); 
1990/0728    
				unlock(&m->alarmlock); 
	 
				/*  execute alarm functions outside the lock */ 
				for(i = 0; i < na; i++){ 
					f = alist[i]->f;	/* avoid race with cancel */ 
					if(f) 
						(*f)(alist[i]); 
					alist[i]->busy = 0; 
				} 
			} else 
				unlock(&m->alarmlock); 
1990/0227    
		} 
		return; 
	} 
1990/0728/sys/src/9/power/clock.c:107,1191990/0731/sys/src/9/power/clock.c:107,129 (short | long)
1990/0227    
		junk3[3]; 
}; 
 
1990/0731    
 
1990/0227    
#define	TIME0	(36*MS2HZ/10) 
#define	TIME1	0xFFFFFFFF	/* later, make this a profiling clock */ 
1990/0731    
#define	TIME1	0xFFFFFFFF	/* profiling disabled */ 
1990/0227    
#define	TIME2	1024 
#define	CTR(x)	((x)<<6)	/* which counter x */ 
#define	SET16	0x30		/* lsbyte then msbyte */ 
#define	MODE2	0x04		/* interval timer */ 
 
1990/0731    
 
#define	PROFILING 
#ifdef PROFILING 
#undef TIME1 
#define	TIME1	211		/* profiling clock; prime; about 10ms per tick */ 
#define	NPROF	50000 
ulong	profcnt[MAXMACH*NPROF]; 
#endif 
 
1990/0227    
void 
clockinit(void) 
{ 
1990/0728/sys/src/9/power/clock.c:135,1431990/0731/sys/src/9/power/clock.c:145,155
1990/0227    
	m->ticks = 0; 
} 
 
1990/0731    
 
 
1990/0728    
#define NA 10 
1990/0227    
void 
clock(ulong n) 
1990/0731    
clock(ulong n, ulong pc) 
1990/0227    
{ 
1990/0728    
	int i, na; 
1990/0227    
	Alarm *a; 
1990/0728/sys/src/9/power/clock.c:192,1981990/0731/sys/src/9/power/clock.c:204,218
1990/0227    
		return; 
	} 
	if(n & INTR4){ 
1990/0731    
		extern ulong start; 
 
1990/0227    
		i = *CLRTIM1; 
1990/0731    
#ifdef	PROFILING 
		pc -= (ulong)&start; 
		pc /= sizeof(ulong); 
		if(pc < NPROF) 
			profcnt[m->machno*NPROF+pc]++; 
#endif 
1990/0227    
		return; 
	} 
} 
1990/0731/sys/src/9/power/clock.c:116,1221990/0802/sys/src/9/power/clock.c:116,122 (short | long)
1990/0227    
#define	MODE2	0x04		/* interval timer */ 
 
1990/0731    
 
#define	PROFILING 
1990/0802    
/* #define	PROFILING /**/ 
1990/0731    
#ifdef PROFILING 
#undef TIME1 
#define	TIME1	211		/* profiling clock; prime; about 10ms per tick */ 
1990/0802/sys/src/9/power/clock.c:181,1981990/1106/sys/src/9/power/clock.c:181,199 (short | long)
1990/0227    
			exit(); 
		} 
		if(canlock(&m->alarmlock)){ 
			if(m->alarm){ 
				a = m->alarm; 
				a->dt--; 
1990/0728    
				for(na = 0; a && a->dt<=0 && na<NA; na++){ 
					alist[na] = a; 
1990/1106    
			a = m->alarm; 
			if(a){ 
				for(n=0; a && a->dt<=0 && n<NA; n++){ 
					alist[n] = a; 
1990/0227    
					delete(&m->alarm, 0, a); 
					a = m->alarm; 
				} 
1990/1106    
				if(a) 
					a->dt--; 
1990/0728    
				unlock(&m->alarmlock); 
	 
				/*  execute alarm functions outside the lock */ 
				for(i = 0; i < na; i++){ 
1990/1106    
				for(i = 0; i < n; i++){ 
1990/0728    
					f = alist[i]->f;	/* avoid race with cancel */ 
					if(f) 
						(*f)(alist[i]); 
1990/1106/sys/src/9/power/clock.c:7,821990/1211/sys/src/9/power/clock.c:7,13 (short | long)
1990/0227    
 
#include	"ureg.h" 
 
Alarm	*alarmtab; 
                 
Alarm* 
alarm(int ms, void (*f)(Alarm*), void *arg) 
{ 
	Alarm *a, *w, *pw; 
	ulong s; 
	if(ms < 0) 
		ms = 0; 
	a = newalarm(); 
1990/0614    
	a->dt = MS2TK(ms); 
1990/0227    
	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; 
} 
                 
void 
cancel(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"); 
} 
                 
void 
alarminit(void) 
{ 
	int i; 
                 
	alarmtab = ialloc(conf.nalarm*sizeof(Alarm), 0); 
	for(i=0; i<conf.nalarm; i++){ 
		lock(&alarmtab[i]);	/* allocate locks, as they are used at interrupt time */ 
		unlock(&alarmtab[i]); 
	} 
} 
                 
void 
delay(int ms) 
{ 
	ulong t, *p; 
1990/1106/sys/src/9/power/clock.c:147,1611990/1211/sys/src/9/power/clock.c:78,88
1990/0227    
 
1990/0731    
 
 
1990/0728    
#define NA 10 
1990/0227    
void 
1990/0731    
clock(ulong n, ulong pc) 
1990/0227    
{ 
1990/0728    
	int i, na; 
1990/0227    
	Alarm *a; 
	void (*f)(void*); 
1990/1211    
	int i; 
1990/0227    
	Proc *p; 
1990/0728    
	Alarm *alist[NA]; 
1990/0227    
 
	if(n&INTR2){ 
		i = *CLRTIM0; 
1990/1106/sys/src/9/power/clock.c:180,2071990/1211/sys/src/9/power/clock.c:107,113
1990/0227    
			print("someone's exiting\n"); 
			exit(); 
		} 
		if(canlock(&m->alarmlock)){ 
1990/1106    
			a = m->alarm; 
			if(a){ 
				for(n=0; a && a->dt<=0 && n<NA; n++){ 
					alist[n] = a; 
1990/0227    
					delete(&m->alarm, 0, a); 
					a = m->alarm; 
				} 
1990/1106    
				if(a) 
					a->dt--; 
1990/0728    
				unlock(&m->alarmlock); 
	                 
				/*  execute alarm functions outside the lock */ 
1990/1106    
				for(i = 0; i < n; i++){ 
1990/0728    
					f = alist[i]->f;	/* avoid race with cancel */ 
					if(f) 
						(*f)(alist[i]); 
					alist[i]->busy = 0; 
				} 
			} else 
				unlock(&m->alarmlock); 
1990/0227    
		} 
1990/1211    
		checkalarms(); 
1990/0227    
		return; 
	} 
	if(n & INTR4){ 
1990/1211/sys/src/9/power/clock.c:72,781990/1214/sys/src/9/power/clock.c:72,80 (short | long)
1990/0227    
	t->cnt0 = TIME0; 
	t->cnt0 = (TIME0>>8)&0xFF; 
	i = *CLRTIM0; 
1990/1214    
	USED(i); 
1990/0227    
	i = *CLRTIM1; 
1990/1214    
	USED(i); 
1990/0227    
	m->ticks = 0; 
} 
 
1990/1211/sys/src/9/power/clock.c:86,911990/1214/sys/src/9/power/clock.c:88,94
1990/0227    
 
	if(n&INTR2){ 
		i = *CLRTIM0; 
1990/1214    
		USED(i); 
1990/0227    
		m->ticks++; 
		if(m->machno == 0){ 
			p = m->proc; 
1990/1211/sys/src/9/power/clock.c:114,1191990/1214/sys/src/9/power/clock.c:117,123
1990/0731    
		extern ulong start; 
 
1990/0227    
		i = *CLRTIM1; 
1990/1214    
		USED(i); 
1990/0731    
#ifdef	PROFILING 
		pc -= (ulong)&start; 
		pc /= sizeof(ulong); 
1990/1214/sys/src/9/power/clock.c:81,1091991/0209/sys/src/9/power/clock.c:81,106 (short | long)
1990/0731    
 
 
1990/0227    
void 
1990/0731    
clock(ulong n, ulong pc) 
1991/0209    
clock(Ureg *ur) 
1990/0227    
{ 
1990/1211    
	int i; 
1990/0227    
	Proc *p; 
 
	if(n&INTR2){ 
1991/0209    
	if(ur->cause & INTR2){ 
1990/0227    
		i = *CLRTIM0; 
1990/1214    
		USED(i); 
1990/0227    
		m->ticks++; 
		if(m->machno == 0){ 
			p = m->proc; 
			if(p == 0) 
				p = m->intrp; 
			if(p) 
				p->time[p->insyscall]++; 
			for(i=1; i<conf.nmach; i++){ 
				if(active.machs & (1<<i)){ 
					p = MACHP(i)->proc; 
					if(p && p!=m->intrp) 
1991/0209    
					if(p) 
1990/0227    
						p->time[p->insyscall]++; 
				} 
			} 
			m->intrp = 0; 
			printslave(); 
		} 
		if(active.exiting && active.machs&(1<<m->machno)){ 
1990/1214/sys/src/9/power/clock.c:111,1191991/0209/sys/src/9/power/clock.c:108,123
1990/0227    
			exit(); 
		} 
1990/1211    
		checkalarms(); 
1991/0209    
		p = m->proc; 
		if((ur->status&IEP) && p && p->state==Running){ 
			if(anyready()) 
				sched(); 
			if(u->nnote && (ur->status&KUP)) 
				notify(ur); 
		} 
1990/0227    
		return; 
	} 
	if(n & INTR4){ 
1991/0209    
	if(ur->cause & INTR4){ 
1990/0731    
		extern ulong start; 
 
1990/0227    
		i = *CLRTIM1; 
1991/0209/sys/src/9/power/clock.c:108,1151991/0215/sys/src/9/power/clock.c:108,114 (short | long)
1990/0227    
			exit(); 
		} 
1990/1211    
		checkalarms(); 
1991/0209    
		p = m->proc; 
		if((ur->status&IEP) && p && p->state==Running){ 
1991/0215    
		if(u && (ur->status&IEP) && u->p && u->p->state==Running){ 
1991/0209    
			if(anyready()) 
				sched(); 
			if(u->nnote && (ur->status&KUP)) 
1991/0215/sys/src/9/power/clock.c:101,1081991/0607/sys/src/9/power/clock.c:101,108 (short | long)
1990/0227    
						p->time[p->insyscall]++; 
				} 
			} 
			printslave(); 
		} 
1991/0607    
		duartslave(); 
1990/0227    
		if(active.exiting && active.machs&(1<<m->machno)){ 
			print("someone's exiting\n"); 
			exit(); 
1991/0607/sys/src/9/power/clock.c:109,1161991/0614/sys/src/9/power/clock.c:109,120 (short | long)
1990/0227    
		} 
1990/1211    
		checkalarms(); 
1991/0215    
		if(u && (ur->status&IEP) && u->p && u->p->state==Running){ 
1991/0209    
			if(anyready()) 
				sched(); 
1991/0614    
			if(anyready()){ 
				if(u->p->hasspin) 
					u->p->hasspin = 0;	/* just in case */ 
				else 
					sched(); 
			} 
1991/0209    
			if(u->nnote && (ur->status&KUP)) 
				notify(ur); 
		} 
1991/0614/sys/src/9/power/clock.c:115,1221991/0710/sys/src/9/power/clock.c:115,125 (short | long)
1991/0614    
				else 
					sched(); 
			} 
1991/0209    
			if(u->nnote && (ur->status&KUP)) 
				notify(ur); 
1991/0710    
			if(ur->status & KUP){ 
				(*(ulong*)(USTKTOP-BY2WD)) += TK2MS(1);	/* profiling clock */ 
				if(u->nnote) 
					notify(ur); 
			} 
1991/0209    
		} 
1990/0227    
		return; 
	} 
1991/0710/sys/src/9/power/clock.c:47,591991/1011/sys/src/9/power/clock.c:47,52 (short | long)
1990/0227    
#define	MODE2	0x04		/* interval timer */ 
 
1990/0731    
 
1990/0802    
/* #define	PROFILING /**/ 
1990/0731    
#ifdef PROFILING 
#undef TIME1 
#define	TIME1	211		/* profiling clock; prime; about 10ms per tick */ 
#define	NPROF	50000 
ulong	profcnt[MAXMACH*NPROF]; 
#endif 
 
1990/0227    
void 
clockinit(void) 
1991/0710/sys/src/9/power/clock.c:108,1131991/1011/sys/src/9/power/clock.c:101,107
1990/0227    
			exit(); 
		} 
1990/1211    
		checkalarms(); 
1991/1011    
		kproftimer(ur->pc); 
1991/0215    
		if(u && (ur->status&IEP) && u->p && u->p->state==Running){ 
1991/0614    
			if(anyready()){ 
				if(u->p->hasspin) 
1991/0710/sys/src/9/power/clock.c:128,1391991/1011/sys/src/9/power/clock.c:122,127
1990/0731    
 
1990/0227    
		i = *CLRTIM1; 
1990/1214    
		USED(i); 
1990/0731    
#ifdef	PROFILING 
		pc -= (ulong)&start; 
		pc /= sizeof(ulong); 
		if(pc < NPROF) 
			profcnt[m->machno*NPROF+pc]++; 
#endif 
1990/0227    
		return; 
	} 
} 
1991/1011/sys/src/9/power/clock.c:111,1181991/1110/sys/src/9/power/clock.c:111,117 (short | long)
1991/0614    
			} 
1991/0710    
			if(ur->status & KUP){ 
				(*(ulong*)(USTKTOP-BY2WD)) += TK2MS(1);	/* profiling clock */ 
				if(u->nnote) 
					notify(ur); 
1991/1110    
				notify(ur); 
1991/0710    
			} 
1991/0209    
		} 
1990/0227    
		return; 
1991/1110/sys/src/9/power/clock.c:76,821991/1112/sys/src/9/power/clock.c:76,82 (short | long)
1990/0227    
void 
1991/0209    
clock(Ureg *ur) 
1990/0227    
{ 
1990/1211    
	int i; 
1991/1112    
	int i, nrun = 0; 
1990/0227    
	Proc *p; 
 
1991/0209    
	if(ur->cause & INTR2){ 
1991/1110/sys/src/9/power/clock.c:85,991991/1112/sys/src/9/power/clock.c:85,105
1990/0227    
		m->ticks++; 
		if(m->machno == 0){ 
			p = m->proc; 
			if(p) 
1991/1112    
			if(p) { 
				nrun++; 
1990/0227    
				p->time[p->insyscall]++; 
1991/1112    
			} 
1990/0227    
			for(i=1; i<conf.nmach; i++){ 
				if(active.machs & (1<<i)){ 
					p = MACHP(i)->proc; 
1991/0209    
					if(p) 
1991/1112    
					if(p) { 
1990/0227    
						p->time[p->insyscall]++; 
1991/1112    
						nrun++; 
					} 
1990/0227    
				} 
			} 
1991/1112    
			nrun = (nrdy+nrun)*1000; 
			m->load = (m->load+nrun)/2; 
1990/0227    
		} 
1991/0607    
		duartslave(); 
1990/0227    
		if(active.exiting && active.machs&(1<<m->machno)){ 
1991/1112/sys/src/9/power/clock.c:99,1051991/1113/sys/src/9/power/clock.c:99,105 (short | long)
1990/0227    
				} 
			} 
1991/1112    
			nrun = (nrdy+nrun)*1000; 
			m->load = (m->load+nrun)/2; 
1991/1113    
			m->load = (m->load*19+nrun)/20; 
1990/0227    
		} 
1991/0607    
		duartslave(); 
1990/0227    
		if(active.exiting && active.machs&(1<<m->machno)){ 
1991/1113/sys/src/9/power/clock.c:115,1241991/1114/sys/src/9/power/clock.c:115,122 (short | long)
1991/0614    
				else 
					sched(); 
			} 
1991/0710    
			if(ur->status & KUP){ 
1991/1114    
			if(ur->status & KUP) 
1991/0710    
				(*(ulong*)(USTKTOP-BY2WD)) += TK2MS(1);	/* profiling clock */ 
1991/1110    
				notify(ur); 
1991/0710    
			} 
1991/0209    
		} 
1990/0227    
		return; 
	} 
1991/1114/sys/src/9/power/clock.c:1,51992/0321/sys/src/9/power/clock.c:1,5 (short | long)
1990/0227    
#include	"u.h" 
#include	"lib.h" 
1992/0321    
#include	"../port/lib.h" 
1990/0227    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
1992/0321/sys/src/9/power/clock.c:83,881992/0509/sys/src/9/power/clock.c:83,93 (short | long)
1990/0227    
		i = *CLRTIM0; 
1990/1214    
		USED(i); 
1990/0227    
		m->ticks++; 
1992/0509    
		if(m->ticks&(1<<4)) 
			LEDON(LEDpulse); 
		else 
			LEDOFF(LEDpulse); 
 
1990/0227    
		if(m->machno == 0){ 
			p = m->proc; 
1991/1112    
			if(p) { 
1992/0509/sys/src/9/power/clock.c:10,161992/0711/sys/src/9/power/clock.c:10,15 (short | long)
1990/0227    
void 
delay(int ms) 
{ 
	ulong t, *p; 
	int i; 
 
	ms *= 7000;	/* experimentally determined */ 
1992/0711/sys/src/9/power/clock.c:86,911992/0805/sys/src/9/power/clock.c:86,93 (short | long)
1992/0509    
			LEDON(LEDpulse); 
		else 
			LEDOFF(LEDpulse); 
1992/0805    
		if(m->proc) 
			m->proc->pc = ur->pc; 
1992/0509    
 
1990/0227    
		if(m->machno == 0){ 
			p = m->proc; 
1992/0805/sys/src/9/power/clock.c:110,1161992/0812/sys/src/9/power/clock.c:110,116 (short | long)
1991/0607    
		duartslave(); 
1990/0227    
		if(active.exiting && active.machs&(1<<m->machno)){ 
			print("someone's exiting\n"); 
			exit(); 
1992/0812    
			exit(0); 
1990/0227    
		} 
1990/1211    
		checkalarms(); 
1991/1011    
		kproftimer(ur->pc); 
1992/0812/sys/src/9/power/clock.c:114,1201992/0816/sys/src/9/power/clock.c:114,120 (short | long)
1990/0227    
		} 
1990/1211    
		checkalarms(); 
1991/1011    
		kproftimer(ur->pc); 
1991/0215    
		if(u && (ur->status&IEP) && u->p && u->p->state==Running){ 
1992/0816    
		if(u && (ur->status&IEP) && u->p->state==Running){ 
1991/0614    
			if(anyready()){ 
				if(u->p->hasspin) 
					u->p->hasspin = 0;	/* just in case */ 
1992/0816/sys/src/9/power/clock.c:115,1281992/0828/sys/src/9/power/clock.c:115,129 (short | long)
1990/1211    
		checkalarms(); 
1991/1011    
		kproftimer(ur->pc); 
1992/0816    
		if(u && (ur->status&IEP) && u->p->state==Running){ 
1991/0614    
			if(anyready()){ 
1992/0828    
			if(anyready()) { 
1991/0614    
				if(u->p->hasspin) 
					u->p->hasspin = 0;	/* just in case */ 
				else 
					sched(); 
			} 
1992/0828    
			/* user profiling clock */ 
1991/1114    
			if(ur->status & KUP) 
1991/0710    
				(*(ulong*)(USTKTOP-BY2WD)) += TK2MS(1);	/* profiling clock */ 
1992/0828    
				(*(ulong*)(USTKTOP-BY2WD)) += TK2MS(1);	 
1991/0209    
		} 
1990/0227    
		return; 
	} 
1992/0828/sys/src/9/power/clock.c:108,1131992/1125/sys/src/9/power/clock.c:108,115 (short | long)
1991/1113    
			m->load = (m->load*19+nrun)/20; 
1990/0227    
		} 
1991/0607    
		duartslave(); 
1992/1125    
		if((active.machs&(1<<m->machno)) == 0) 
			return; 
1990/0227    
		if(active.exiting && active.machs&(1<<m->machno)){ 
			print("someone's exiting\n"); 
1992/0812    
			exit(0); 
Too many diffs (26 > 25). Stopping.


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)