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

1999/0227/port/tod.c (diff list | history)

1999/0225/sys/src/9/port/tod.c:102,1101999/0227/sys/src/9/port/tod.c:102,110 (short | long | prev | next)
1999/0219    
	vlong	last;		// last reading of fast clock 
	vlong	off;		// offset from epoch to last 
	vlong	lasttime;	// last return value from gettod 
	vlong	delta;		// amount to add to bias each slow clock tick 
	int	n;		// number of times to add in delta 
	int	i;		// number of times we've added in delta 
1999/0227    
	vlong	delta;		// add 'delta' each slow clock tick from sstart to send 
	ulong	sstart;		// ... 
	ulong	send;		// ... 
1999/0219    
} tod; 
 
int 
1999/0225/sys/src/9/port/tod.c:159,1651999/0227/sys/src/9/port/tod.c:159,164
1999/0225    
	tod.multiplier = (TODFREQ<<tod.s1)/f; 
	tod.maxdiff = 1LL<<(10 + lf); 
1999/0219    
	iunlock(&tod); 
1999/0225    
//print("hz %lld mult %lld s1 %d s2 %d maxdiff %lld\n", tod.hz, tod.multiplier, tod.s1, tod.s2, tod.maxdiff); 
1999/0219    
} 
 
// 
1999/0225/sys/src/9/port/tod.c:169,1821999/0227/sys/src/9/port/tod.c:168,190
1999/0219    
todset(vlong t, vlong delta, int n) 
{ 
	ilock(&tod); 
	tod.i = tod.n = 0; 
1999/0227    
	tod.sstart = tod.send = 0; 
1999/0219    
	if(t >= 0){ 
		tod.off = t; 
		tod.last = fastticks(nil); 
		tod.lasttime = 0; 
	} else { 
1999/0227    
		if(n <= 0) 
			n = 1; 
		n *= HZ; 
		if(delta < 0 && n > -delta) 
			n = -delta; 
		if(delta > 0 && n > delta) 
			n = delta; 
		delta /= n; 
		tod.sstart = MACHP(0)->ticks; 
		tod.send = tod.sstart + n; 
1999/0219    
		tod.delta = delta; 
		tod.n = n; 
	} 
	iunlock(&tod); 
} 
1999/0225/sys/src/9/port/tod.c:188,1931999/0227/sys/src/9/port/tod.c:196,202
1999/0219    
todget(void) 
{ 
	vlong ticks, x, diff; 
1999/0227    
	ulong t; 
1999/0219    
 
	ilock(&tod); 
 
1999/0225/sys/src/9/port/tod.c:197,2021999/0227/sys/src/9/port/tod.c:206,220
1999/0219    
		ticks = fastticks(nil); 
	diff = ticks - tod.last; 
 
1999/0227    
	// add in correction 
	if(tod.sstart < tod.send){ 
		t = MACHP(0)->ticks; 
		if(t >= tod.send) 
			t = tod.send; 
		tod.off += tod.delta*(t - tod.sstart); 
		tod.sstart = t; 
	} 
 
1999/0219    
	// convert to epoch 
1999/0225    
	x = ((diff>>tod.s2)*tod.multiplier)>>(tod.s1-tod.s2); 
1999/0219    
	x += tod.off; 
1999/0225/sys/src/9/port/tod.c:222,2361999/0227/sys/src/9/port/tod.c:240,245
1999/0219    
void 
todfix(void) 
{ 
	if((MACHP(0)->ticks % HZ) != 0) 
		return; 
1999/0225    
                 
	// once a second apply correction 
1999/0219    
	ilock(&tod); 
	if(tod.n > tod.i++) 
		tod.off += tod.delta; 
	iunlock(&tod); 
1999/0225    
                 
	// once a minute, make sure we don't overflow 
	if((MACHP(0)->ticks % (60*HZ)) == 0) 
		todget(); 


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