ftp.nice.ch/pub/next/unix/macintosh/uw.4.2.N.bs.tar.gz#/uw/server/uw_clk.c

This is uw_clk.c in view mode; [Download] [Up]

/*
 *	uw_clk - timer support for UW
 *
 * Copyright 1986 by John D. Bruner.  All rights reserved.  Permission to
 * copy this program is given provided that the copy is not sold and that
 * this copyright notice is included.
 */

#include <sys/types.h>
#include <sys/time.h>
#include <sys/signal.h>
#include <sys/resource.h>

#include "uw_param.h"
#include "uw_clk.h"

static struct timeout *pending;
static struct timeout *freelist;

int timer_rdy;			/* nonzero when some timeout is ready to run */

clk_timeout(secs, fn, arg)
int secs;
void (*fn)();
toarg_t arg;
{
	register struct timeout *to, **tol;
	register time_t curtime;
	extern time_t time();

	to = freelist;
	if (!to) {
		if (!(to = (struct timeout *)malloc(sizeof *to)))
			return(-1);
	} else
		freelist = to->to_next;
	to->to_fn = fn;
	to->to_arg = arg;

	if (secs < 0)
		secs = 0;
	curtime = time((time_t *)0);
	to->to_when = curtime + secs;

	tol = &pending;
	while (*tol && to->to_when > (*tol)->to_when)
		tol = &(*tol)->to_next;
	to->to_next = *tol;
	*tol = to;

	clk_service();
	return(0);
}

clk_service()
{
	register struct timeout *to;
	register time_t curtime;

	curtime = time((time_t *)0);
	while ((to=pending) && to->to_when <= curtime) {
		pending = to->to_next;
		if (to->to_fn) {
			(*to->to_fn)(to->to_arg);
			to->to_next = freelist;
			freelist = to;
		}
	}

	timer_rdy = 0;
	if (pending)
		(void)alarm((unsigned)(pending->to_when - curtime));
}

void
clk_alarm()
{
	/*
	 * A SIGALRM has been received.
	 */
	timer_rdy = 1;
}

clk_init()
{
	timer_rdy = 0;
	(void)signal(SIGALRM, clk_alarm);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.