diff options
Diffstat (limited to '')
-rw-r--r-- | lib/dns/timer.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/dns/timer.c b/lib/dns/timer.c new file mode 100644 index 0000000..ef2895d --- /dev/null +++ b/lib/dns/timer.c @@ -0,0 +1,54 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * SPDX-License-Identifier: MPL-2.0 + * + * 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 https://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +/*! \file */ + +#include <stdbool.h> + +#include <isc/result.h> +#include <isc/time.h> +#include <isc/timer.h> + +#include <dns/timer.h> +#include <dns/types.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); +} |