timer.c revision ec5347e2c775f027573ce5648b910361aa926c01
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer/*
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * Copyright (C) 2000, 2001 Internet Software Consortium.
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Permission to use, copy, modify, and/or distribute this software for any
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * purpose with or without fee is hereby granted, provided that the above
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * copyright notice and this permission notice appear in all copies.
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer *
70e5a7403f0e0a3bd292b8287c5fed5772c15270Automatic Updater * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * PERFORMANCE OF THIS SOFTWARE.
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer */
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer/* $Id: timer.c,v 1.6 2007/06/18 23:47:41 tbox Exp $ */
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer/*! \file */
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer#include <config.h>
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer#include <isc/result.h>
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer#include <isc/time.h>
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer#include <isc/timer.h>
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer#include <dns/types.h>
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer#include <dns/timer.h>
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer#define CHECK(op) \
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer do { result = (op); \
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer if (result != ISC_R_SUCCESS) goto failure; \
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer } while (0)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerisc_result_t
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerdns_timer_setidle(isc_timer_t *timer, unsigned int maxtime,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer unsigned int idletime, isc_boolean_t purge)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer{
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer isc_result_t result;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer isc_interval_t maxinterval, idleinterval;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer isc_time_t expires;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer /* Compute the time of expiry. */
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer isc_interval_set(&maxinterval, maxtime, 0);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer CHECK(isc_time_nowplusinterval(&expires, &maxinterval));
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer /*
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * Compute the idle interval, and add a spare nanosecond to
945f7311ca5ae0005676e3c4e02c712d6f8e7eafAndreas Gustafsson * work around the silly limitation of the ISC timer interface
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * that you cannot specify an idle interval of zero.
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer */
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer isc_interval_set(&idleinterval, idletime, 1);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer CHECK(isc_timer_reset(timer, isc_timertype_once,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer &expires, &idleinterval,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer purge));
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer failure:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (result);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer}
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer