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