11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*	$NetBSD: ev_timers.c,v 1.2 2004/05/20 19:52:31 christos Exp $	*/
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1995-1999 by Internet Software Consortium
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies.
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* ev_timers.c - implement timers for the eventlib
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * vix 09sep95 [initial]
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h>
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if !defined(LINT) && !defined(CODECENTER) && !defined(lint)
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef notdef
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char rcsid[] = "Id: ev_timers.c,v 1.2.2.1.4.5 2004/03/17 02:39:13 marka Exp";
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__RCSID("$NetBSD: ev_timers.c,v 1.2 2004/05/20 19:52:31 christos Exp $");
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Import. */
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <errno.h>
3650ace4fec5e8cb5afcbc656a4556fa528adfd760David 'Digit' Turner#include <time.h>
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <isc/assertions.h>
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <isc/eventlib.h>
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "eventlib_p.h"
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Constants. */
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define	MILLION 1000000
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define BILLION 1000000000
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Forward. */
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _LIBC
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int due_sooner(void *, void *);
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void set_index(void *, int);
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void free_timer(void *, void *);
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void print_timer(void *, void *);
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void idle_timeout(evContext, void *, struct timespec, struct timespec);
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Private type. */
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef struct {
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evTimerFunc	func;
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	void *		uap;
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct timespec	lastTouched;
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct timespec	max_idle;
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evTimer *	timer;
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} idle_timer;
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Public. */
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct timespec
701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevConsTime(time_t sec, long nsec) {
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct timespec x;
721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	x.tv_sec = sec;
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	x.tv_nsec = nsec;
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (x);
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct timespec
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevAddTime(struct timespec addend1, struct timespec addend2) {
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct timespec x;
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	x.tv_sec = addend1.tv_sec + addend2.tv_sec;
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	x.tv_nsec = addend1.tv_nsec + addend2.tv_nsec;
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (x.tv_nsec >= BILLION) {
851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		x.tv_sec++;
861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		x.tv_nsec -= BILLION;
871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (x);
891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct timespec
921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevSubTime(struct timespec minuend, struct timespec subtrahend) {
931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct timespec x;
941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	x.tv_sec = minuend.tv_sec - subtrahend.tv_sec;
961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (minuend.tv_nsec >= subtrahend.tv_nsec)
971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		x.tv_nsec = minuend.tv_nsec - subtrahend.tv_nsec;
981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	else {
991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		x.tv_nsec = BILLION - subtrahend.tv_nsec + minuend.tv_nsec;
1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		x.tv_sec--;
1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (x);
1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevCmpTime(struct timespec a, struct timespec b) {
1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	long x = a.tv_sec - b.tv_sec;
1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (x == 0L)
1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		x = a.tv_nsec - b.tv_nsec;
1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (x < 0L ? (-1) : x > 0L ? (1) : (0));
1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct timespec
1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevNowTime() {
1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct timeval now;
1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef CLOCK_REALTIME
1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct timespec tsnow;
1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int m = CLOCK_REALTIME;
1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef CLOCK_MONOTONIC
1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (__evOptMonoTime)
1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		m = CLOCK_MONOTONIC;
1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (clock_gettime(m, &tsnow) == 0)
1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (tsnow);
1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (gettimeofday(&now, NULL) < 0)
1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (evConsTime(0L, 0L));
1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (evTimeSpec(now));
1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct timespec
1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevUTCTime(void) {
1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct timeval now;
1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef CLOCK_REALTIME
1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct timespec tsnow;
1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (clock_gettime(CLOCK_REALTIME, &tsnow) == 0)
1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (tsnow);
1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (gettimeofday(&now, NULL) < 0)
1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (evConsTime(0L, 0L));
1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (evTimeSpec(now));
1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _LIBC
1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct timespec
1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevLastEventTime(evContext opaqueCtx) {
1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evContext_p *ctx = opaqueCtx.opaque;
1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (ctx->lastEventTime);
1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct timespec
1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevTimeSpec(struct timeval tv) {
1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct timespec ts;
1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	ts.tv_sec = tv.tv_sec;
1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	ts.tv_nsec = tv.tv_usec * 1000;
1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (ts);
1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct timeval
1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevTimeVal(struct timespec ts) {
1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct timeval tv;
1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	tv.tv_sec = ts.tv_sec;
1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	tv.tv_usec = ts.tv_nsec / 1000;
1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (tv);
1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _LIBC
1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevSetTimer(evContext opaqueCtx,
1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	   evTimerFunc func,
1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	   void *uap,
1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	   struct timespec due,
1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	   struct timespec inter,
1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	   evTimerID *opaqueID
1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project) {
1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evContext_p *ctx = opaqueCtx.opaque;
1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evTimer *id;
1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	printf("evSetTimer(ctx %p, func %p, uap %p, due %ld.%09ld, inter %ld.%09ld)\n",
1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 ctx, func, uap,
1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 (long)due.tv_sec, due.tv_nsec,
1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 (long)inter.tv_sec, inter.tv_nsec);
1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef __hpux
1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * tv_sec and tv_nsec are unsigned.
1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (due.tv_nsec >= BILLION)
1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		EV_ERR(EINVAL);
1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (inter.tv_nsec >= BILLION)
1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		EV_ERR(EINVAL);
1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else
2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (due.tv_sec < 0 || due.tv_nsec < 0 || due.tv_nsec >= BILLION)
2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		EV_ERR(EINVAL);
2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (inter.tv_sec < 0 || inter.tv_nsec < 0 || inter.tv_nsec >= BILLION)
2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		EV_ERR(EINVAL);
2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* due={0,0} is a magic cookie meaning "now." */
2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (due.tv_sec == (time_t)0 && due.tv_nsec == 0L)
2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		due = evNowTime();
2101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* Allocate and fill. */
2121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	OKNEW(id);
2131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	id->func = func;
2141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	id->uap = uap;
2151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	id->due = due;
2161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	id->inter = inter;
2171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (heap_insert(ctx->timers, id) < 0)
2191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (-1);
2201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* Remember the ID if the caller provided us a place for it. */
2221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (opaqueID)
2231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		opaqueID->opaque = id;
2241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (ctx->debug > 7) {
2261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		printf("timers after evSetTimer:\n");
2271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		(void) heap_for_each(ctx->timers, print_timer, (void *)ctx);
2281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
2291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
2311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
2321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
2341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevClearTimer(evContext opaqueCtx, evTimerID id) {
2351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evContext_p *ctx = opaqueCtx.opaque;
2361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evTimer *del = id.opaque;
2371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (ctx->cur != NULL &&
2391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    ctx->cur->type == Timer &&
2401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    ctx->cur->u.timer.this == del) {
2411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		printf("deferring delete of timer (executing)\n");
2421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/*
2431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * Setting the interval to zero ensures that evDrop() will
2441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * clean up the timer.
2451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 */
2461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		del->inter = evConsTime(0, 0);
2471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (0);
2481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
2491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (heap_element(ctx->timers, del->index) != del)
2511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		EV_ERR(ENOENT);
2521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (heap_delete(ctx->timers, del->index) < 0)
2541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (-1);
2551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	FREE(del);
2561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (ctx->debug > 7) {
2581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		printf("timers after evClearTimer:\n");
2591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		(void) heap_for_each(ctx->timers, print_timer, (void *)ctx);
2601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
2611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
2631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
2641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
2661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevConfigTimer(evContext opaqueCtx,
2671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	     evTimerID id,
2681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	     const char *param,
2691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	     int value
2701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project) {
2711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evContext_p *ctx = opaqueCtx.opaque;
2721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evTimer *timer = id.opaque;
2731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int result=0;
2741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	UNUSED(value);
2761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (heap_element(ctx->timers, timer->index) != timer)
2781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		EV_ERR(ENOENT);
2791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (strcmp(param, "rate") == 0)
2811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		timer->mode |= EV_TMR_RATE;
2821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	else if (strcmp(param, "interval") == 0)
2831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		timer->mode &= ~EV_TMR_RATE;
2841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	else
2851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		EV_ERR(EINVAL);
2861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (result);
2881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
2891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
2901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
2911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevResetTimer(evContext opaqueCtx,
2921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	     evTimerID id,
2931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	     evTimerFunc func,
2941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	     void *uap,
2951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	     struct timespec due,
2961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	     struct timespec inter
2971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project) {
2981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evContext_p *ctx = opaqueCtx.opaque;
2991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evTimer *timer = id.opaque;
3001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct timespec old_due;
3011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int result=0;
3021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (heap_element(ctx->timers, timer->index) != timer)
3041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		EV_ERR(ENOENT);
3051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef __hpux
3071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
3081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * tv_sec and tv_nsec are unsigned.
3091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
3101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (due.tv_nsec >= BILLION)
3111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		EV_ERR(EINVAL);
3121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (inter.tv_nsec >= BILLION)
3141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		EV_ERR(EINVAL);
3151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else
3161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (due.tv_sec < 0 || due.tv_nsec < 0 || due.tv_nsec >= BILLION)
3171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		EV_ERR(EINVAL);
3181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (inter.tv_sec < 0 || inter.tv_nsec < 0 || inter.tv_nsec >= BILLION)
3201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		EV_ERR(EINVAL);
3211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
3221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	old_due = timer->due;
3241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	timer->func = func;
3261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	timer->uap = uap;
3271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	timer->due = due;
3281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	timer->inter = inter;
3291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	switch (evCmpTime(due, old_due)) {
3311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case -1:
3321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		result = heap_increased(ctx->timers, timer->index);
3331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
3341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case 0:
3351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		result = 0;
3361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
3371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	case 1:
3381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		result = heap_decreased(ctx->timers, timer->index);
3391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		break;
3401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
3411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (ctx->debug > 7) {
3431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		printf("timers after evResetTimer:\n");
3441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		(void) heap_for_each(ctx->timers, print_timer, (void *)ctx);
3451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
3461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (result);
3481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
3491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
3511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevSetIdleTimer(evContext opaqueCtx,
3521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		evTimerFunc func,
3531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		void *uap,
3541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		struct timespec max_idle,
3551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		evTimerID *opaqueID
3561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project) {
3571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evContext_p *ctx = opaqueCtx.opaque;
3581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	idle_timer *tt;
3591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/* Allocate and fill. */
3611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	OKNEW(tt);
3621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	tt->func = func;
3631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	tt->uap = uap;
3641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	tt->lastTouched = ctx->lastEventTime;
3651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	tt->max_idle = max_idle;
3661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (evSetTimer(opaqueCtx, idle_timeout, tt,
3681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		       evAddTime(ctx->lastEventTime, max_idle),
3691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		       max_idle, opaqueID) < 0) {
3701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		FREE(tt);
3711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return (-1);
3721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
3731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	tt->timer = opaqueID->opaque;
3751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
3771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
3781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
3801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevClearIdleTimer(evContext opaqueCtx, evTimerID id) {
3811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evTimer *del = id.opaque;
3821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	idle_timer *tt = del->uap;
3831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	FREE(tt);
3851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (evClearTimer(opaqueCtx, id));
3861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
3871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
3891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevResetIdleTimer(evContext opaqueCtx,
3901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 evTimerID opaqueID,
3911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 evTimerFunc func,
3921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 void *uap,
3931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 struct timespec max_idle
3941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project) {
3951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evContext_p *ctx = opaqueCtx.opaque;
3961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evTimer *timer = opaqueID.opaque;
3971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	idle_timer *tt = timer->uap;
3981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	tt->func = func;
4001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	tt->uap = uap;
4011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	tt->lastTouched = ctx->lastEventTime;
4021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	tt->max_idle = max_idle;
4031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (evResetTimer(opaqueCtx, opaqueID, idle_timeout, tt,
4051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			     evAddTime(ctx->lastEventTime, max_idle),
4061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			     max_idle));
4071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
4081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint
4101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevTouchIdleTimer(evContext opaqueCtx, evTimerID id) {
4111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evContext_p *ctx = opaqueCtx.opaque;
4121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evTimer *t = id.opaque;
4131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	idle_timer *tt = t->uap;
4141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	tt->lastTouched = ctx->lastEventTime;
4161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (0);
4181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
4191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Public to the rest of eventlib. */
4211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectheap_context
4231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevCreateTimers(const evContext_p *ctx) {
4241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	UNUSED(ctx);
4261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (heap_new(due_sooner, set_index, 2048));
4281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
4291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid
4311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectevDestroyTimers(const evContext_p *ctx) {
4321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	(void) heap_for_each(ctx->timers, free_timer, NULL);
4331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	(void) heap_free(ctx->timers);
4341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
4351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Private. */
4371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic int
4391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdue_sooner(void *a, void *b) {
4401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evTimer *a_timer, *b_timer;
4411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	a_timer = a;
4431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	b_timer = b;
4441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return (evCmpTime(a_timer->due, b_timer->due) < 0);
4451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
4461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void
4481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectset_index(void *what, int idx) {
4491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evTimer *timer;
4501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	timer = what;
4521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	timer->index = idx;
4531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
4541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void
4561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfree_timer(void *what, void *uap) {
4571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evTimer *t = what;
4581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	UNUSED(uap);
4601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	FREE(t);
4621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
4631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void
4651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectprint_timer(void *what, void *uap) {
4661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evTimer *cur = what;
4671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evContext_p *ctx = uap;
4681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	cur = what;
4701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evPrintf(ctx, 7,
4711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    "  func %p, uap %p, due %ld.%09ld, inter %ld.%09ld\n",
4721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 cur->func, cur->uap,
4731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 (long)cur->due.tv_sec, cur->due.tv_nsec,
4741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 (long)cur->inter.tv_sec, cur->inter.tv_nsec);
4751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
4761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void
4781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectidle_timeout(evContext opaqueCtx,
4791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	     void *uap,
4801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	     struct timespec due,
4811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	     struct timespec inter
4821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project) {
4831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	evContext_p *ctx = opaqueCtx.opaque;
4841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	idle_timer *this = uap;
4851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	struct timespec idle;
4861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	UNUSED(due);
4881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	UNUSED(inter);
4891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	idle = evSubTime(ctx->lastEventTime, this->lastTouched);
4911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if (evCmpTime(idle, this->max_idle) >= 0) {
4921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		(this->func)(opaqueCtx, this->uap, this->timer->due,
4931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project			     this->max_idle);
4941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/*
4951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * Setting the interval to zero will cause the timer to
4961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 * be cleaned up in evDrop().
4971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		 */
4981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		this->timer->inter = evConsTime(0L, 0L);
4991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		FREE(this);
5001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else {
5011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		/* evDrop() will reschedule the timer. */
5021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		this->timer->inter = evSubTime(this->max_idle, idle);
5031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
5041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
5051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
506