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

📄 periodic.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "stdinc.h"#include "dat.h"#include "fns.h"#include "error.h"struct Periodic {	VtLock *lk;	int die;	void (*f)(void*);	void *a;	int msec;};static void periodicThread(void *a);Periodic *periodicAlloc(void (*f)(void*), void *a, int msec){	Periodic *p;	p = vtMemAllocZ(sizeof(Periodic));	p->lk = vtLockAlloc();	p->f = f;	p->a = a;	p->msec = msec;	if(p->msec < 10)		p->msec = 10;	vtThread(periodicThread, p);	return p;}voidperiodicKill(Periodic *p){	if(p == nil)		return;	vtLock(p->lk);	p->die = 1;	vtUnlock(p->lk);}static voidperiodicFree(Periodic *p){	vtLockFree(p->lk);	vtMemFree(p);}static voidperiodicThread(void *a){	Periodic *p = a;	double t, ct, ts;	vtThreadSetName("periodic");	ct = nsec()*1e-6;	t = ct + p->msec;	for(;;){		/* skip missed */		while(t <= ct)			t += p->msec;		ts = t - ct;		if(ts > 1000)			ts = 1000;		sleep(ts);		ct = nsec()*1e-6;		vtLock(p->lk);		if(p->die){			vtUnlock(p->lk);			break;		}		if(t <= ct){			p->f(p->a);			t += p->msec;		}		vtUnlock(p->lk);	}	periodicFree(p);}

⌨️ 快捷键说明

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