diff options
Diffstat (limited to 'pcp/pcpdtimer.c')
| -rw-r--r-- | pcp/pcpdtimer.c | 79 | 
1 files changed, 79 insertions, 0 deletions
| diff --git a/pcp/pcpdtimer.c b/pcp/pcpdtimer.c new file mode 100644 index 0000000..7349b9a --- /dev/null +++ b/pcp/pcpdtimer.c @@ -0,0 +1,79 @@ +/* +** Copyright 2001 Double Precision, Inc.  See COPYING for +** distribution information. +*/ + + +#include "config.h" +#include "pcpdtimer.h" +#include <string.h> +#include <time.h> + +extern struct pcpdtimer *first_timer, *last_timer; + +struct pcpdtimer *first_timer=NULL, *last_timer=NULL; + +void pcpdtimer_install(struct pcpdtimer *p, time_t nseconds) +{ +	struct pcpdtimer *q; + +	if (p->alarm) +	{ +		if (p->prev) +			p->prev->next=p->next; +		else +			first_timer=p->next; + +		if (p->next) +			p->next->prev=p->prev; +		else +			last_timer=p->prev; +	} + +	time(&p->alarm); +	p->alarm += nseconds; + +	for (q=first_timer; q; q=q->next) +	{ +		if (q->alarm > p->alarm) +			break; +	} + +	if (!q) +	{ +		if ((p->prev=last_timer) != 0) +			p->prev->next=p; +		else +			first_timer=p; +		p->next=0; +		last_timer=p; +	} +	else +	{ +		if ((p->prev=q->prev) != 0) +			p->prev->next=p; +		else +			first_timer=p; + +		p->next=q; +		q->prev=p; +	} +} + +void pcpdtimer_triggered(struct pcpdtimer *p) +{ +	if (!p->alarm) +		return; + +	if (p->prev) +		p->prev->next=p->next; +	else +		first_timer=p->next; + +	if (p->next) +		p->next->prev=p->prev; +	else +		last_timer=p->prev; + +	p->alarm=0; +} | 
