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

📄 time.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <draw.h>#include <thread.h>#include <cursor.h>#include <mouse.h>#include <keyboard.h>#include <frame.h>#include <fcall.h>#include <plumb.h>#include "dat.h"#include "fns.h"static Channel*	ctimer;	/* chan(Timer*)[100] */static Timer *timer;staticuintmsec(void){	return nsec()/1000000;}voidtimerstop(Timer *t){	t->next = timer;	timer = t;}voidtimercancel(Timer *t){	t->cancel = TRUE;}staticvoidtimerproc(void*){	int i, nt, na, dt, del;	Timer **t, *x;	uint old, new;	threadsetname("timerproc");	rfork(RFFDG);	t = nil;	na = 0;	nt = 0;	old = msec();	for(;;){		sleep(1);	/* will sleep minimum incr */		new = msec();		dt = new-old;		old = new;		if(dt < 0)	/* timer wrapped; go around, losing a tick */			continue;		for(i=0; i<nt; i++){			x = t[i];			x->dt -= dt;			del = FALSE;			if(x->cancel){				timerstop(x);				del = TRUE;			}else if(x->dt <= 0){				/*				 * avoid possible deadlock if client is				 * now sending on ctimer				 */				if(nbsendul(x->c, 0) > 0)					del = TRUE;			}			if(del){				memmove(&t[i], &t[i+1], (nt-i-1)*sizeof t[0]);				--nt;				--i;			}		}		if(nt == 0){			x = recvp(ctimer);	gotit:			if(nt == na){				na += 10;				t = realloc(t, na*sizeof(Timer*));				if(t == nil)					error("timer realloc failed");			}			t[nt++] = x;			old = msec();		}		if(nbrecv(ctimer, &x) > 0)			goto gotit;	}}voidtimerinit(void){	ctimer = chancreate(sizeof(Timer*), 100);	proccreate(timerproc, nil, STACK);}Timer*timerstart(int dt){	Timer *t;	t = timer;	if(t)		timer = timer->next;	else{		t = emalloc(sizeof(Timer));		t->c = chancreate(sizeof(int), 0);	}	t->next = nil;	t->dt = dt;	t->cancel = FALSE;	sendp(ctimer, t);	return t;}

⌨️ 快捷键说明

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