diff options
Diffstat (limited to 'lib/dns/timer.c')
-rw-r--r-- | lib/dns/timer.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/lib/dns/timer.c b/lib/dns/timer.c new file mode 100644 index 0000000..8c5a328 --- /dev/null +++ b/lib/dns/timer.c @@ -0,0 +1,55 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + + +/*! \file */ + +#include <config.h> + +#include <stdbool.h> + +#include <isc/result.h> +#include <isc/time.h> +#include <isc/timer.h> + +#include <dns/types.h> +#include <dns/timer.h> + +#define CHECK(op) \ + do { result = (op); \ + if (result != ISC_R_SUCCESS) goto failure; \ + } while (0) + +isc_result_t +dns_timer_setidle(isc_timer_t *timer, unsigned int maxtime, + unsigned int idletime, bool purge) +{ + isc_result_t result; + isc_interval_t maxinterval, idleinterval; + isc_time_t expires; + + /* Compute the time of expiry. */ + isc_interval_set(&maxinterval, maxtime, 0); + CHECK(isc_time_nowplusinterval(&expires, &maxinterval)); + + /* + * Compute the idle interval, and add a spare nanosecond to + * work around the silly limitation of the ISC timer interface + * that you cannot specify an idle interval of zero. + */ + isc_interval_set(&idleinterval, idletime, 1); + + CHECK(isc_timer_reset(timer, isc_timertype_once, + &expires, &idleinterval, + purge)); + failure: + return (result); +} |