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

📄 tod.c

📁 著名操作系统Plan 9的第三版的部分核心源代码。现在很难找到了。Plan 9是bell实验室开发的Unix后继者。
💻 C
字号:
#include	"u.h"#include	"../port/lib.h"#include	"mem.h"#include	"dat.h"#include	"fns.h"#include	"../port/error.h"// compute nanosecond epoch time from the fastest ticking clock// on the system.  converting the time to nanoseconds requires// the following formula////	t = (((1000000000<<31)/f)*ticks)>>31////  where////	'f'		is the clock frequency//	'ticks'		are clock ticks////  to avoid too much calculation in gettod(), we calculate////	mult = (1000000000<<31)/f////  each time f is set.  f is normally set by a user level//  program writing to /dev/fastclock.// frequency of the tod clock#define TODFREQ	1000000000LLstruct {	Lock;	vlong	multiplier;	// t = off + (multiplier*ticks)>>31	vlong	hz;		// frequency of fast clock	vlong	last;		// last reading of fast clock	vlong	off;		// offset from epoch to last	vlong	lasttime;	// last return value from gettod	vlong	delta;		// add 'delta' each slow clock tick from sstart to send	ulong	sstart;		// ...	ulong	send;		// ...} tod;voidtodinit(void){	fastticks((uvlong*)&tod.hz);	todsetfreq(tod.hz);	addclock0link(todfix);}////  calculate multiplier//voidtodsetfreq(vlong f){	ilock(&tod);	tod.hz = f;	tod.multiplier = (TODFREQ<<31)/f;	iunlock(&tod);}////  Set the time of day struct//voidtodset(vlong t, vlong delta, int n){	ilock(&tod);	if(t >= 0){		tod.off = t;		tod.last = fastticks(nil);		tod.lasttime = 0;		tod.delta = 0;		tod.sstart = tod.send;	} else {		if(n <= 0)			n = 1;		n *= HZ;		if(delta < 0 && n > -delta)			n = -delta;		if(delta > 0 && n > delta)			n = delta;		delta = delta/n;		tod.sstart = MACHP(0)->ticks;		tod.send = tod.sstart + n;		tod.delta = delta;	}	iunlock(&tod);}////  get time of day//vlongtodget(vlong *ticksp){	uvlong x;	vlong ticks, diff;	ulong t;	if(tod.hz == 0)		ticks = fastticks((uvlong*)&tod.hz);	else		ticks = fastticks(nil);	diff = ticks - tod.last;	// convert to epoch	x = (diff * tod.multiplier) >> 31;	x = x + tod.off;	if(m->machno == 0){		ilock(&tod);		// add in correction		if(tod.sstart != tod.send){			t = MACHP(0)->ticks;			if(t >= tod.send)				t = tod.send;			tod.off = tod.off + tod.delta*(t - tod.sstart);			tod.sstart = t;		}		// protect against overflows		if(diff > tod.hz){			tod.last = ticks;			tod.off = x;		}		iunlock(&tod);	}	// time can't go backwards	if(x < tod.lasttime)		x = tod.lasttime;	else		tod.lasttime = x;	if(ticksp != nil)		*ticksp = ticks;	return x;}////  called every clock tick//voidtodfix(void){	static ulong last;	// once a second, make sure we don't overflow	if(MACHP(0)->ticks - last >= HZ){		last = MACHP(0)->ticks;		todget(nil);	}}longseconds(void){	vlong x;	int i;	x = todget(nil);	x = x/TODFREQ;	i = x;	return i;}

⌨️ 快捷键说明

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