keydelete
gssapi_krb
t_tasks
-t_timers
makejournal
LIBS = @LIBS@
-SUBDIR = db dst names \
- rbt resolver tasks timers system @PKCS11_TOOLS@ optional
+SUBDIR = db dst names rbt resolver tasks system \
+ @PKCS11_TOOLS@ optional
TESTDIRS = system
+++ /dev/null
-# 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.
-
-srcdir = @srcdir@
-VPATH = @srcdir@
-top_srcdir = @top_srcdir@
-
-@BIND9_MAKE_INCLUDES@
-
-CINCLUDES = ${TEST_INCLUDES} ${ISC_INCLUDES}
-
-CDEFINES =
-CWARNINGS =
-
-ISCLIBS = ../../../lib/isc/libisc.@A@ @ISC_OPENSSL_LIBS@
-
-ISCDEPLIBS = ../../../lib/isc/libisc.@A@
-
-DEPLIBS = ${ISCDEPLIBS}
-
-LIBS = ${ISCLIBS} @LIBS@
-
-TLIB = ../../../lib/tests/libt_api.@A@
-
-TARGETS = t_timers@EXEEXT@
-
-SRCS = t_timers.c
-
-@BIND9_MAKE_RULES@
-
-t_timers@EXEEXT@: t_timers.@O@ ${DEPLIBS} ${TLIB}
- ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ t_timers.@O@ ${TLIB} ${LIBS}
-
-test: t_timers@EXEEXT@
- -@./t_timers@EXEEXT@ -c @top_srcdir@/t_config -b @srcdir@ -q 60 -a
-
-testhelp:
- @./t_timers@EXEEXT@ -h
-
-clean distclean::
- rm -f ${TARGETS}
+++ /dev/null
-/*
- * 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.
- */
-
-/* $Id: t_timers.c,v 1.33 2011/03/14 14:13:10 fdupont Exp $ */
-
-#include <config.h>
-
-#include <stdlib.h>
-
-#include <isc/condition.h>
-#include <isc/mem.h>
-#include <isc/platform.h>
-#include <isc/task.h>
-#include <isc/time.h>
-#include <isc/timer.h>
-#include <isc/util.h>
-
-#include <tests/t_api.h>
-
-#ifdef ISC_PLATFORM_USETHREADS
-isc_boolean_t threaded = ISC_TRUE;
-#else
-isc_boolean_t threaded = ISC_FALSE;
-#endif
-
-#define Tx_FUDGE_SECONDS 0 /* in absence of clock_getres() */
-#define Tx_FUDGE_NANOSECONDS 500000000 /* in absence of clock_getres() */
-
-static isc_time_t Tx_endtime;
-static isc_time_t Tx_lasttime;
-static int Tx_eventcnt;
-static int Tx_nevents;
-static isc_mutex_t Tx_mx;
-static isc_condition_t Tx_cv;
-static int Tx_nfails;
-static int Tx_nprobs;
-static isc_timer_t *Tx_timer;
-static int Tx_seconds;
-static int Tx_nanoseconds;
-
-static void
-require_threads(void) {
- t_info("This test requires threads\n");
- t_result(T_THREADONLY);
- return;
-}
-
-static void
-tx_sde(isc_task_t *task, isc_event_t *event) {
- isc_result_t isc_result;
-
- UNUSED(task);
- UNUSED(event);
-
- /*
- * Signal shutdown processing complete.
- */
- isc_result = isc_mutex_lock(&Tx_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mutex_lock failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
-
- isc_result = isc_condition_signal(&Tx_cv);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_condition_signal failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
-
- isc_result = isc_mutex_unlock(&Tx_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mutex_unlock failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
-
- isc_event_free(&event);
-}
-
-static void
-tx_te(isc_task_t *task, isc_event_t *event) {
- isc_result_t isc_result;
- isc_time_t now;
- isc_time_t base;
- isc_time_t ulim;
- isc_time_t llim;
- isc_interval_t interval;
- isc_eventtype_t expected_event_type;
-
- ++Tx_eventcnt;
-
- t_info("tick %d\n", Tx_eventcnt);
-
- expected_event_type = ISC_TIMEREVENT_LIFE;
- if ((isc_timertype_t) event->ev_arg == isc_timertype_ticker)
- expected_event_type = ISC_TIMEREVENT_TICK;
-
- if (event->ev_type != expected_event_type) {
- t_info("expected event type %d, got %d\n",
- expected_event_type, (int) event->ev_type);
- ++Tx_nfails;
- }
-
- isc_result = isc_time_now(&now);
- if (isc_result == ISC_R_SUCCESS) {
- isc_interval_set(&interval, Tx_seconds, Tx_nanoseconds);
- isc_result = isc_time_add(&Tx_lasttime, &interval, &base);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_time_add failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
- } else {
- t_info("isc_time_now failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
-
- if (isc_result == ISC_R_SUCCESS) {
- isc_interval_set(&interval,
- Tx_FUDGE_SECONDS, Tx_FUDGE_NANOSECONDS);
- isc_result = isc_time_add(&base, &interval, &ulim);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_time_add failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
- }
-
- if (isc_result == ISC_R_SUCCESS) {
- isc_result = isc_time_subtract(&base, &interval, &llim);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_time_subtract failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
- }
-
- if (isc_result == ISC_R_SUCCESS) {
- if (isc_time_compare(&llim, &now) > 0) {
- t_info("timer range error: early by "
- "%lu microseconds\n",
- (unsigned long)isc_time_microdiff(&base, &now));
- ++Tx_nfails;
- } else if (isc_time_compare(&ulim, &now) < 0) {
- t_info("timer range error: late by "
- "%lu microseconds\n",
- (unsigned long)isc_time_microdiff(&now, &base));
- ++Tx_nfails;
- }
- Tx_lasttime = now;
- }
-
- if (Tx_eventcnt == Tx_nevents) {
- isc_result = isc_time_now(&Tx_endtime);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_time_now failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
- isc_timer_detach(&Tx_timer);
- isc_task_shutdown(task);
- }
-
- isc_event_free(&event);
-}
-
-static void
-t_timers_x(isc_timertype_t timertype, isc_time_t *expires,
- isc_interval_t *interval,
- void (*action)(isc_task_t *, isc_event_t *))
-{
- char *p;
- isc_mem_t *mctx;
- isc_taskmgr_t *tmgr;
- isc_task_t *task;
- unsigned int workers;
- isc_result_t isc_result;
- isc_timermgr_t *timermgr;
-
- Tx_eventcnt = 0;
- isc_time_settoepoch(&Tx_endtime);
-
- workers = 2;
- p = t_getenv("ISC_TASK_WORKERS");
- if (p != NULL)
- workers = atoi(p);
-
- mctx = NULL;
- isc_result = isc_mem_create(0, 0, &mctx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mem_create failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- return;
- }
-
- isc_result = isc_mutex_init(&Tx_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mutex_init failed %s\n",
- isc_result_totext(isc_result));
- isc_mem_destroy(&mctx);
- ++Tx_nprobs;
- return;
- }
-
- isc_result = isc_condition_init(&Tx_cv);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_condition_init failed %s\n",
- isc_result_totext(isc_result));
- DESTROYLOCK(&Tx_mx);
- isc_mem_destroy(&mctx);
- ++Tx_nprobs;
- return;
- }
-
- tmgr = NULL;
- isc_result = isc_taskmgr_create(mctx, workers, 0, &tmgr);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_taskmgr_create failed %s\n",
- isc_result_totext(isc_result));
- DESTROYLOCK(&Tx_mx);
- (void) isc_condition_destroy(&Tx_cv);
- isc_mem_destroy(&mctx);
- ++Tx_nprobs;
- return;
- }
-
- timermgr = NULL;
- isc_result = isc_timermgr_create(mctx, &timermgr);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_timermgr_create failed %s\n",
- isc_result_totext(isc_result));
- isc_taskmgr_destroy(&tmgr);
- DESTROYLOCK(&Tx_mx);
- (void) isc_condition_destroy(&Tx_cv);
- isc_mem_destroy(&mctx);
- ++Tx_nprobs;
- return;
- }
-
- isc_result = isc_mutex_lock(&Tx_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mutex_lock failed %s\n",
- isc_result_totext(isc_result));
- isc_timermgr_destroy(&timermgr);
- isc_taskmgr_destroy(&tmgr);
- DESTROYLOCK(&Tx_mx);
- (void) isc_condition_destroy(&Tx_cv);
- isc_mem_destroy(&mctx);
- ++Tx_nprobs;
- return;
- }
-
- task = NULL;
- isc_result = isc_task_create(tmgr, 0, &task);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_task_create failed %s\n",
- isc_result_totext(isc_result));
- isc_timermgr_destroy(&timermgr);
- isc_taskmgr_destroy(&tmgr);
- DESTROYLOCK(&Tx_mx);
- (void) isc_condition_destroy(&Tx_cv);
- isc_mem_destroy(&mctx);
- ++Tx_nprobs;
- return;
- }
-
- isc_result = isc_task_onshutdown(task, tx_sde, NULL);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_task_onshutdown failed %s\n",
- isc_result_totext(isc_result));
- isc_timermgr_destroy(&timermgr);
- isc_task_destroy(&task);
- isc_taskmgr_destroy(&tmgr);
- DESTROYLOCK(&Tx_mx);
- (void) isc_condition_destroy(&Tx_cv);
- isc_mem_destroy(&mctx);
- ++Tx_nprobs;
- return;
- }
-
- isc_result = isc_time_now(&Tx_lasttime);
- if (isc_result != ISC_R_SUCCESS) {
- isc_timermgr_destroy(&timermgr);
- isc_task_destroy(&task);
- isc_taskmgr_destroy(&tmgr);
- DESTROYLOCK(&Tx_mx);
- (void) isc_condition_destroy(&Tx_cv);
- isc_mem_destroy(&mctx);
- ++Tx_nprobs;
- return;
- }
-
- Tx_timer = NULL;
- isc_result = isc_timer_create(timermgr, timertype, expires, interval,
- task, action, (void *)timertype,
- &Tx_timer);
-
- if (isc_result != ISC_R_SUCCESS) {
- isc_timermgr_destroy(&timermgr);
- isc_task_destroy(&task);
- isc_taskmgr_destroy(&tmgr);
- DESTROYLOCK(&Tx_mx);
- (void) isc_condition_destroy(&Tx_cv);
- isc_mem_destroy(&mctx);
- ++Tx_nprobs;
- return;
- }
-
- /*
- * Wait for shutdown processing to complete.
- */
- while (Tx_eventcnt != Tx_nevents) {
- isc_result = isc_condition_wait(&Tx_cv, &Tx_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_condition_waituntil failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
- }
-
- isc_result = isc_mutex_unlock(&Tx_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mutex_unlock failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
-
- isc_task_detach(&task);
- isc_taskmgr_destroy(&tmgr);
- isc_timermgr_destroy(&timermgr);
- DESTROYLOCK(&Tx_mx);
- (void) isc_condition_destroy(&Tx_cv);
- isc_mem_destroy(&mctx);
-
-}
-
-#define T1_SECONDS 2
-#define T1_NANOSECONDS 500000000
-
-static const char *a1 =
- "When type is isc_timertype_ticker, a call to isc_timer_create() "
- "creates a timer that posts an ISC_TIMEREVENT_TICK event to the "
- "specified task every 'interval' seconds and returns ISC_R_SUCCESS.";
-
-static void
-t1(void) {
- int result;
- isc_time_t expires;
- isc_interval_t interval;
-
- t_assert("isc_timer_create", 1, T_REQUIRED, "%s", a1);
-
- if (threaded) {
- Tx_nfails = 0;
- Tx_nprobs = 0;
- Tx_nevents = 12;
- Tx_seconds = T1_SECONDS;
- Tx_nanoseconds = T1_NANOSECONDS;
- isc_interval_set(&interval, Tx_seconds, Tx_nanoseconds);
- isc_time_settoepoch(&expires);
-
- t_timers_x(isc_timertype_ticker, &expires, &interval, tx_te);
-
- result = T_UNRESOLVED;
-
- if ((Tx_nfails == 0) && (Tx_nprobs == 0))
- result = T_PASS;
- else if (Tx_nfails)
- result = T_FAIL;
-
- t_result(result);
- } else
- require_threads();
-}
-
-#define T2_SECONDS 5
-#define T2_NANOSECONDS 300000000;
-
-static const char *a2 =
- "When type is isc_timertype_once, a call to isc_timer_create() "
- "creates a timer that posts an ISC_TIMEEVENT_LIFE event to the "
- "specified task when the current time reaches or exceeds the time "
- "specified by 'expires'.";
-
-static void
-t2(void) {
- int result;
- int isc_result;
- isc_time_t expires;
- isc_interval_t interval;
-
- t_assert("isc_timer_create", 2, T_REQUIRED, "%s", a2);
-
- if (threaded) {
- Tx_nfails = 0;
- Tx_nprobs = 0;
- Tx_nevents = 1;
- Tx_seconds = T2_SECONDS;
- Tx_nanoseconds = T2_NANOSECONDS;
- isc_interval_set(&interval, Tx_seconds, Tx_nanoseconds);
-
- isc_result = isc_time_nowplusinterval(&expires, &interval);
- if (isc_result == ISC_R_SUCCESS) {
-
- isc_interval_set(&interval, 0, 0);
- t_timers_x(isc_timertype_once, &expires, &interval,
- tx_te);
-
- } else {
- t_info("isc_time_nowplusinterval failed %s\n",
- isc_result_totext(isc_result));
- }
-
- result = T_UNRESOLVED;
-
- if ((Tx_nfails == 0) && (Tx_nprobs == 0))
- result = T_PASS;
- else if (Tx_nfails)
- result = T_FAIL;
-
- t_result(result);
- } else
- require_threads();
-}
-
-static void
-t3_te(isc_task_t *task, isc_event_t *event) {
- isc_result_t isc_result;
- isc_time_t now;
- isc_time_t base;
- isc_time_t ulim;
- isc_time_t llim;
- isc_interval_t interval;
-
- ++Tx_eventcnt;
-
- t_info("tick %d\n", Tx_eventcnt);
-
- isc_result = isc_time_now(&now);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_time_now failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
-
- if (isc_result == ISC_R_SUCCESS) {
- isc_interval_set(&interval, Tx_seconds, Tx_nanoseconds);
- isc_result = isc_time_add(&Tx_lasttime, &interval, &base);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_time_add failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
- }
-
- if (isc_result == ISC_R_SUCCESS) {
- isc_interval_set(&interval,
- Tx_FUDGE_SECONDS, Tx_FUDGE_NANOSECONDS);
- isc_result = isc_time_add(&base, &interval, &ulim);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_time_add failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
- }
-
- if (isc_result == ISC_R_SUCCESS) {
- isc_result = isc_time_subtract(&base, &interval, &llim);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_time_subtract failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
- }
-
- if (isc_result == ISC_R_SUCCESS) {
- if (isc_time_compare(&llim, &now) > 0) {
- t_info("timer range error: early by "
- "%lu microseconds\n",
- (unsigned long)isc_time_microdiff(&base, &now));
- ++Tx_nfails;
- } else if (isc_time_compare(&ulim, &now) < 0) {
- t_info("timer range error: late by "
- "%lu microseconds\n",
- (unsigned long)isc_time_microdiff(&now, &base));
- ++Tx_nfails;
- }
- Tx_lasttime = now;
- }
-
- if (event->ev_type != ISC_TIMEREVENT_IDLE) {
- t_info("received event type %d, expected type %d\n",
- event->ev_type, ISC_TIMEREVENT_IDLE);
- ++Tx_nfails;
- }
-
- isc_timer_detach(&Tx_timer);
- isc_task_shutdown(task);
- isc_event_free(&event);
-}
-
-#define T3_SECONDS 4
-#define T3_NANOSECONDS 400000000
-
-static const char *a3 =
- "When type is isc_timertype_once, a call to isc_timer_create() "
- "creates a timer that posts an ISC_TIMEEVENT_IDLE event to the "
- "specified task when the timer has been idle for 'interval' seconds.";
-
-static void
-t3(void) {
- int result;
- int isc_result;
- isc_time_t expires;
- isc_interval_t interval;
-
- t_assert("isc_timer_create", 3, T_REQUIRED, "%s", a3);
-
- if (threaded) {
- Tx_nfails = 0;
- Tx_nprobs = 0;
- Tx_nevents = 1;
- Tx_seconds = T3_SECONDS;
- Tx_nanoseconds = T3_NANOSECONDS;
-
- isc_interval_set(&interval, Tx_seconds + 1, Tx_nanoseconds);
-
- isc_result = isc_time_nowplusinterval(&expires, &interval);
- if (isc_result == ISC_R_SUCCESS) {
- isc_interval_set(&interval, Tx_seconds,
- Tx_nanoseconds);
- t_timers_x(isc_timertype_once, &expires, &interval,
- t3_te);
- } else {
- t_info("isc_time_nowplusinterval failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
-
- result = T_UNRESOLVED;
-
- if ((Tx_nfails == 0) && (Tx_nprobs == 0))
- result = T_PASS;
- else if (Tx_nfails)
- result = T_FAIL;
-
- t_result(result);
- } else
- require_threads();
-}
-
-#define T4_SECONDS 2
-#define T4_NANOSECONDS 500000000
-
-static void
-t4_te(isc_task_t *task, isc_event_t *event) {
-
- isc_result_t isc_result;
- isc_time_t now;
- isc_time_t base;
- isc_time_t ulim;
- isc_time_t llim;
- isc_time_t expires;
- isc_interval_t interval;
-
- ++Tx_eventcnt;
-
- t_info("tick %d\n", Tx_eventcnt);
-
- /*
- * Check expired time.
- */
-
- isc_result = isc_time_now(&now);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_time_now failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
-
- if (isc_result == ISC_R_SUCCESS) {
- isc_interval_set(&interval, Tx_seconds, Tx_nanoseconds);
- isc_result = isc_time_add(&Tx_lasttime, &interval, &base);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_time_add failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
- }
-
- if (isc_result == ISC_R_SUCCESS) {
- isc_interval_set(&interval,
- Tx_FUDGE_SECONDS, Tx_FUDGE_NANOSECONDS);
- isc_result = isc_time_add(&base, &interval, &ulim);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_time_add failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
- }
-
- if (isc_result == ISC_R_SUCCESS) {
- isc_result = isc_time_subtract(&base, &interval, &llim);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_time_subtract failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
- }
-
- if (isc_result == ISC_R_SUCCESS) {
- if (isc_time_compare(&llim, &now) > 0) {
- t_info("timer range error: early by "
- "%lu microseconds\n",
- (unsigned long)isc_time_microdiff(&base, &now));
- ++Tx_nfails;
- } else if (isc_time_compare(&ulim, &now) < 0) {
- t_info("timer range error: late by "
- "%lu microseconds\n",
- (unsigned long)isc_time_microdiff(&now, &base));
- ++Tx_nfails;
- }
- Tx_lasttime = now;
- }
-
- if (Tx_eventcnt < 3) {
- if (event->ev_type != ISC_TIMEREVENT_TICK) {
- t_info("received event type %d, expected type %d\n",
- event->ev_type, ISC_TIMEREVENT_IDLE);
- ++Tx_nfails;
- }
- if (Tx_eventcnt == 2) {
- isc_interval_set(&interval, T4_SECONDS,
- T4_NANOSECONDS);
- isc_result = isc_time_nowplusinterval(&expires,
- &interval);
- if (isc_result == ISC_R_SUCCESS) {
- isc_interval_set(&interval, 0, 0);
- isc_result =
- isc_timer_reset(Tx_timer,
- isc_timertype_once,
- &expires, &interval,
- ISC_FALSE);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_timer_reset failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nfails;
- }
- } else {
- t_info("isc_time_nowplusinterval failed %s\n",
- isc_result_totext(isc_result));
- ++Tx_nprobs;
- }
- }
- } else {
- if (event->ev_type != ISC_TIMEREVENT_LIFE) {
- t_info("received event type %d, expected type %d\n",
- event->ev_type, ISC_TIMEREVENT_IDLE);
- ++Tx_nfails;
- }
-
- isc_timer_detach(&Tx_timer);
- isc_task_shutdown(task);
- }
-
- isc_event_free(&event);
-}
-
-static const char *a4 =
- "A call to isc_timer_reset() changes the timer's type, expires and "
- "interval values to the given values.";
-
-static void
-t4(void) {
- int result;
- isc_time_t expires;
- isc_interval_t interval;
-
- t_assert("isc_timer_reset", 4, T_REQUIRED, "%s", a4);
-
- if (threaded) {
- Tx_nfails = 0;
- Tx_nprobs = 0;
- Tx_nevents = 3;
- Tx_seconds = T4_SECONDS;
- Tx_nanoseconds = T4_NANOSECONDS;
-
- isc_interval_set(&interval, T4_SECONDS, T4_NANOSECONDS);
- isc_time_settoepoch(&expires);
- t_timers_x(isc_timertype_ticker, &expires, &interval, t4_te);
-
- result = T_UNRESOLVED;
-
- if ((Tx_nfails == 0) && (Tx_nprobs == 0))
- result = T_PASS;
- else if (Tx_nfails)
- result = T_FAIL;
-
- t_result(result);
- } else
- require_threads();
-}
-
-#define T5_NTICKS 4
-#define T5_SECONDS 3
-
-static int T5_startflag;
-static int T5_shutdownflag;
-static int T5_eventcnt;
-static isc_mutex_t T5_mx;
-static isc_condition_t T5_cv;
-static int T5_nfails;
-static int T5_nprobs;
-static isc_timer_t *T5_tickertimer;
-static isc_timer_t *T5_oncetimer;
-static isc_task_t *T5_task1;
-static isc_task_t *T5_task2;
-
-/*
- * T5_task1 blocks on T5_mx while events accumulate
- * in it's queue, until signaled by T5_task2.
- */
-
-static void
-t5_start_event(isc_task_t *task, isc_event_t *event) {
- isc_result_t isc_result;
-
- UNUSED(task);
-
- t_info("t5_start_event\n");
-
- isc_result = isc_mutex_lock(&T5_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mutex_lock failed %s\n",
- isc_result_totext(isc_result));
- ++T5_nprobs;
- }
-
- while (! T5_startflag) {
- (void) isc_condition_wait(&T5_cv, &T5_mx);
- }
-
- isc_result = isc_mutex_unlock(&T5_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mutex_unlock failed %s\n",
- isc_result_totext(isc_result));
- ++T5_nprobs;
- }
- isc_event_free(&event);
-}
-
-static void
-t5_tick_event(isc_task_t *task, isc_event_t *event) {
- isc_result_t isc_result;
- isc_time_t expires;
- isc_interval_t interval;
-
- UNUSED(task);
-
- ++T5_eventcnt;
- t_info("t5_tick_event %d\n", T5_eventcnt);
-
- /*
- * On the first tick, purge all remaining tick events
- * and then shut down the task.
- */
- if (T5_eventcnt == 1) {
- isc_time_settoepoch(&expires);
- isc_interval_set(&interval, T5_SECONDS, 0);
- isc_result = isc_timer_reset(T5_tickertimer,
- isc_timertype_ticker, &expires,
- &interval, ISC_TRUE);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_timer_reset failed %s\n",
- isc_result_totext(isc_result));
- ++T5_nfails;
- }
- isc_task_shutdown(task);
- }
- isc_event_free(&event);
-}
-
-static void
-t5_once_event(isc_task_t *task, isc_event_t *event) {
-
- isc_result_t isc_result;
-
- t_info("t5_once_event\n");
-
- /*
- * Allow task1 to start processing events.
- */
- isc_result = isc_mutex_lock(&T5_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mutex_lock failed %s\n",
- isc_result_totext(isc_result));
- ++T5_nprobs;
- }
-
- T5_startflag = 1;
-
- isc_result = isc_condition_broadcast(&T5_cv);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_condition_broadcast failed %s\n",
- isc_result_totext(isc_result));
- ++T5_nprobs;
- }
-
- isc_result = isc_mutex_unlock(&T5_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mutex_unlock failed %s\n",
- isc_result_totext(isc_result));
- ++T5_nprobs;
- }
-
- isc_event_free(&event);
- isc_task_shutdown(task);
-}
-
-static void
-t5_shutdown_event(isc_task_t *task, isc_event_t *event) {
-
- isc_result_t isc_result;
-
- UNUSED(task);
- UNUSED(event);
-
- t_info("t5_shutdown_event\n");
-
- /*
- * Signal shutdown processing complete.
- */
- isc_result = isc_mutex_lock(&T5_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mutex_lock failed %s\n",
- isc_result_totext(isc_result));
- ++T5_nprobs;
- }
-
- T5_shutdownflag = 1;
-
- isc_result = isc_condition_signal(&T5_cv);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_condition_signal failed %s\n",
- isc_result_totext(isc_result));
- ++T5_nprobs;
- }
-
- isc_result = isc_mutex_unlock(&T5_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mutex_unlock failed %s\n",
- isc_result_totext(isc_result));
- ++T5_nprobs;
- }
- isc_event_free(&event);
-}
-
-static int
-t_timers5(void) {
- char *p;
- int result;
- isc_mem_t *mctx;
- isc_taskmgr_t *tmgr;
- unsigned int workers;
- isc_result_t isc_result;
- isc_timermgr_t *timermgr;
- isc_event_t *event;
- isc_time_t expires;
- isc_interval_t interval;
-
- T5_startflag = 0;
- T5_shutdownflag = 0;
- T5_eventcnt = 0;
-
- workers = 2;
- p = t_getenv("ISC_TASK_WORKERS");
- if (p != NULL)
- workers = atoi(p);
-
- mctx = NULL;
- isc_result = isc_mem_create(0, 0, &mctx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mem_create failed %s\n",
- isc_result_totext(isc_result));
- return(T_UNRESOLVED);
- }
-
- isc_result = isc_mutex_init(&T5_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mutex_init failed %s\n",
- isc_result_totext(isc_result));
- isc_mem_destroy(&mctx);
- return(T_UNRESOLVED);
- }
-
- isc_result = isc_condition_init(&T5_cv);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_condition_init failed %s\n",
- isc_result_totext(isc_result));
- DESTROYLOCK(&T5_mx);
- isc_mem_destroy(&mctx);
- return(T_UNRESOLVED);
- }
-
- tmgr = NULL;
- isc_result = isc_taskmgr_create(mctx, workers, 0, &tmgr);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_taskmgr_create failed %s\n",
- isc_result_totext(isc_result));
- DESTROYLOCK(&T5_mx);
- (void) isc_condition_destroy(&T5_cv);
- isc_mem_destroy(&mctx);
- return(T_UNRESOLVED);
- }
-
- timermgr = NULL;
- isc_result = isc_timermgr_create(mctx, &timermgr);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_timermgr_create failed %s\n",
- isc_result_totext(isc_result));
- isc_taskmgr_destroy(&tmgr);
- DESTROYLOCK(&T5_mx);
- (void) isc_condition_destroy(&T5_cv);
- isc_mem_destroy(&mctx);
- return(T_UNRESOLVED);
- }
-
- T5_task1 = NULL;
- isc_result = isc_task_create(tmgr, 0, &T5_task1);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_task_create failed %s\n",
- isc_result_totext(isc_result));
- isc_timermgr_destroy(&timermgr);
- isc_taskmgr_destroy(&tmgr);
- DESTROYLOCK(&T5_mx);
- (void) isc_condition_destroy(&T5_cv);
- isc_mem_destroy(&mctx);
- return(T_UNRESOLVED);
- }
-
- isc_result = isc_task_onshutdown(T5_task1, t5_shutdown_event, NULL);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_task_onshutdown failed %s\n",
- isc_result_totext(isc_result));
- isc_timermgr_destroy(&timermgr);
- isc_task_destroy(&T5_task1);
- isc_taskmgr_destroy(&tmgr);
- DESTROYLOCK(&T5_mx);
- (void) isc_condition_destroy(&T5_cv);
- isc_mem_destroy(&mctx);
- return(T_UNRESOLVED);
- }
-
- T5_task2 = NULL;
- isc_result = isc_task_create(tmgr, 0, &T5_task2);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_task_create failed %s\n",
- isc_result_totext(isc_result));
- isc_timermgr_destroy(&timermgr);
- isc_task_destroy(&T5_task1);
- isc_taskmgr_destroy(&tmgr);
- DESTROYLOCK(&T5_mx);
- (void) isc_condition_destroy(&T5_cv);
- isc_mem_destroy(&mctx);
- return(T_UNRESOLVED);
- }
-
- isc_result = isc_mutex_lock(&T5_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mutex_lock failed %s\n",
- isc_result_totext(isc_result));
- isc_timermgr_destroy(&timermgr);
- isc_taskmgr_destroy(&tmgr);
- DESTROYLOCK(&T5_mx);
- (void) isc_condition_destroy(&T5_cv);
- isc_mem_destroy(&mctx);
- return(T_UNRESOLVED);
- }
-
- event = isc_event_allocate(mctx, (void *)1 , (isc_eventtype_t)1,
- t5_start_event, NULL, sizeof(*event));
- isc_task_send(T5_task1, &event);
-
- isc_time_settoepoch(&expires);
- isc_interval_set(&interval, T5_SECONDS, 0);
-
- T5_tickertimer = NULL;
- isc_result = isc_timer_create(timermgr, isc_timertype_ticker,
- &expires, &interval, T5_task1,
- t5_tick_event, NULL, &T5_tickertimer);
-
- if (isc_result != ISC_R_SUCCESS) {
- isc_timermgr_destroy(&timermgr);
- (void) isc_condition_signal(&T5_cv);
- (void) isc_mutex_unlock(&T5_mx);
- isc_task_destroy(&T5_task1);
- isc_task_destroy(&T5_task2);
- isc_taskmgr_destroy(&tmgr);
- DESTROYLOCK(&T5_mx);
- (void) isc_condition_destroy(&T5_cv);
- isc_mem_destroy(&mctx);
- return(T_UNRESOLVED);
- }
-
- T5_oncetimer = NULL;
- isc_interval_set(&interval, (T5_SECONDS * T5_NTICKS) + 2, 0);
- isc_result = isc_time_nowplusinterval(&expires, &interval);
- if (isc_result != ISC_R_SUCCESS) {
- isc_timer_detach(&T5_tickertimer);
- isc_timermgr_destroy(&timermgr);
- (void)isc_condition_signal(&T5_cv);
- (void)isc_mutex_unlock(&T5_mx);
- isc_task_destroy(&T5_task1);
- isc_task_destroy(&T5_task2);
- isc_taskmgr_destroy(&tmgr);
- DESTROYLOCK(&T5_mx);
- (void) isc_condition_destroy(&T5_cv);
- isc_mem_destroy(&mctx);
- return(T_UNRESOLVED);
- }
-
- isc_interval_set(&interval, 0, 0);
- isc_result = isc_timer_create(timermgr, isc_timertype_once,
- &expires, &interval, T5_task2,
- t5_once_event, NULL, &T5_oncetimer);
-
- if (isc_result != ISC_R_SUCCESS) {
- isc_timer_detach(&T5_tickertimer);
- isc_timermgr_destroy(&timermgr);
- (void) isc_condition_signal(&T5_cv);
- (void) isc_mutex_unlock(&T5_mx);
- isc_task_destroy(&T5_task1);
- isc_task_destroy(&T5_task2);
- isc_taskmgr_destroy(&tmgr);
- DESTROYLOCK(&T5_mx);
- (void) isc_condition_destroy(&T5_cv);
- isc_mem_destroy(&mctx);
- ++T5_nprobs;
- return(T_UNRESOLVED);
- }
-
- /*
- * Wait for shutdown processing to complete.
- */
- while (! T5_shutdownflag) {
- isc_result = isc_condition_wait(&T5_cv, &T5_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_condition_waituntil failed %s\n",
- isc_result_totext(isc_result));
- ++T5_nprobs;
- }
- }
-
- isc_result = isc_mutex_unlock(&T5_mx);
- if (isc_result != ISC_R_SUCCESS) {
- t_info("isc_mutex_unlock failed %s\n",
- isc_result_totext(isc_result));
- ++T5_nprobs;
- }
-
- if (T5_eventcnt != 1) {
- t_info("processed %d events\n", T5_eventcnt);
- ++T5_nfails;
- }
-
- isc_timer_detach(&T5_tickertimer);
- isc_timer_detach(&T5_oncetimer);
- isc_timermgr_destroy(&timermgr);
- isc_task_destroy(&T5_task1);
- isc_task_destroy(&T5_task2);
- isc_taskmgr_destroy(&tmgr);
- DESTROYLOCK(&T5_mx);
- (void) isc_condition_destroy(&T5_cv);
- isc_mem_destroy(&mctx);
-
- result = T_UNRESOLVED;
-
- if ((T5_nfails == 0) && (T5_nprobs == 0))
- result = T_PASS;
- else if (T5_nfails)
- result = T_FAIL;
-
- return (result);
-}
-
-static const char *a5 =
- "When 'purge' is TRUE, a call to isc_timer_reset() purges any pending "
- "events from 'timer' from the task's event queue.";
-
-static void
-t5(void) {
- t_assert("isc_timer_reset", 5, T_REQUIRED, "%s", a5);
-
- if (threaded)
- t_result(t_timers5());
- else
- require_threads();
-}
-
-testspec_t T_testlist[] = {
- { (PFV) t1, "timer_create" },
- { (PFV) t2, "timer_create" },
- { (PFV) t3, "timer_create" },
- { (PFV) t4, "timer_reset" },
- { (PFV) t5, "timer_reset" },
- { (PFV) NULL, NULL }
-};
-
-#ifdef WIN32
-int
-main(int argc, char **argv) {
- t_settests(T_testlist);
- return (t_main(argc, argv));
-}
-#endif
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="Source Files">
- <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
- <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
- </Filter>
- <Filter Include="Header Files">
- <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
- <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
- </Filter>
- <Filter Include="Resource Files">
- <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
- <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="..\t_timers.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- </ItemGroup>
-</Project>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|@PLATFORM@">
- <Configuration>Debug</Configuration>
- <Platform>@PLATFORM@</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|@PLATFORM@">
- <Configuration>Release</Configuration>
- <Platform>@PLATFORM@</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{4E6F5A7C-89AA-4259-99DB-F89DAE418B3F}</ProjectGuid>
- <Keyword>Win32Proj</Keyword>
- <RootNamespace>t_timers</RootNamespace>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|@PLATFORM@'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <CharacterSet>MultiByte</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|@PLATFORM@'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>false</UseDebugLibraries>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <CharacterSet>MultiByte</CharacterSet>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|@PLATFORM@'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|@PLATFORM@'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|@PLATFORM@'">
- <LinkIncremental>true</LinkIncremental>
- <OutDir>..\..\..\..\Build\$(Configuration)\</OutDir>
- <IntDir>.\$(Configuration)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|@PLATFORM@'">
- <LinkIncremental>false</LinkIncremental>
- <OutDir>..\..\..\..\Build\$(Configuration)\</OutDir>
- <IntDir>.\$(Configuration)\</IntDir>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|@PLATFORM@'">
- <ClCompile>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <Optimization>Disabled</Optimization>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <PrecompiledHeaderOutputFile>.\$(Configuration)\$(TargetName).pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\$(Configuration)\</AssemblerListingLocation>
- <ObjectFileName>.\$(Configuration)\</ObjectFileName>
- <ProgramDataBaseFileName>$(OutDir)$(TargetName).pdb</ProgramDataBaseFileName>
- <BrowseInformation>true</BrowseInformation>
- <AdditionalIncludeDirectories>.\;..\..\..\..\;@LIBXML2_INC@..\..\..\..\lib\isc\win32;..\..\..\..\lib\isc\win32\include;..\..\..\..\lib\isc\include;..\..\..\..\lib\tests\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <CompileAs>CompileAsC</CompileAs>
- </ClCompile>
- <Link>
- <SubSystem>Console</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <OutputFile>..\..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt)</OutputFile>
- <AdditionalLibraryDirectories>..\..\..\..\lib\isc\win32\$(Configuration);..\..\..\..\lib\tests\win32\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <AdditionalDependencies>@LIBXML2_LIB@libisc.lib;libtests.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|@PLATFORM@'">
- <ClCompile>
- <WarningLevel>Level3</WarningLevel>
- <PrecompiledHeader>
- </PrecompiledHeader>
- <Optimization>MaxSpeed</Optimization>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <IntrinsicFunctions>@INTRINSIC@</IntrinsicFunctions>
- <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
- <WholeProgramOptimization>false</WholeProgramOptimization>
- <StringPooling>true</StringPooling>
- <PrecompiledHeaderOutputFile>.\$(Configuration)\$(TargetName).pch</PrecompiledHeaderOutputFile>
- <AssemblerListingLocation>.\$(Configuration)\</AssemblerListingLocation>
- <ObjectFileName>.\$(Configuration)\</ObjectFileName>
- <ProgramDataBaseFileName>$(OutDir)$(TargetName).pdb</ProgramDataBaseFileName>
- <AdditionalIncludeDirectories>.\;..\..\..\..\;@LIBXML2_INC@..\..\..\..\lib\isc\win32;..\..\..\..\lib\isc\win32\include;..\..\..\..\lib\isc\include;..\..\..\..\lib\tests\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <CompileAs>CompileAsC</CompileAs>
- </ClCompile>
- <Link>
- <SubSystem>Console</SubSystem>
- <GenerateDebugInformation>false</GenerateDebugInformation>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- <OutputFile>..\..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt)</OutputFile>
- <LinkTimeCodeGeneration>Default</LinkTimeCodeGeneration>
- <AdditionalLibraryDirectories>..\..\..\..\lib\isc\win32\$(Configuration);..\..\..\..\lib\tests\win32\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- <AdditionalDependencies>@LIBXML2_LIB@libisc.lib;libtests.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="..\t_timers.c" />
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
-</Project>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>\r
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
-</Project>
\ No newline at end of file
# elsewhere if there's a good reason for doing so.
#
-ac_config_files="$ac_config_files make/Makefile make/mkdep Makefile bin/Makefile bin/check/Makefile bin/confgen/Makefile bin/confgen/unix/Makefile bin/delv/Makefile bin/dig/Makefile bin/dnssec/Makefile bin/named/Makefile bin/named/unix/Makefile bin/nsupdate/Makefile bin/pkcs11/Makefile bin/python/Makefile bin/python/isc/Makefile bin/python/isc/utils.py bin/python/isc/tests/Makefile bin/python/dnssec-checkds.py bin/python/dnssec-coverage.py bin/python/dnssec-keymgr.py bin/python/isc/__init__.py bin/python/isc/checkds.py bin/python/isc/coverage.py bin/python/isc/dnskey.py bin/python/isc/eventlist.py bin/python/isc/keydict.py bin/python/isc/keyevent.py bin/python/isc/keymgr.py bin/python/isc/keyseries.py bin/python/isc/keyzone.py bin/python/isc/policy.py bin/python/isc/rndc.py bin/python/isc/tests/dnskey_test.py bin/python/isc/tests/policy_test.py bin/rndc/Makefile bin/tests/Makefile bin/tests/db/Makefile bin/tests/dst/Makefile bin/tests/dst/Kdh.+002+18602.key bin/tests/dst/Kdh.+002+18602.private bin/tests/dst/Kdh.+002+48957.key bin/tests/dst/Kdh.+002+48957.private bin/tests/dst/Ktest.+001+00002.key bin/tests/dst/Ktest.+001+54622.key bin/tests/dst/Ktest.+001+54622.private bin/tests/dst/Ktest.+003+23616.key bin/tests/dst/Ktest.+003+23616.private bin/tests/dst/Ktest.+003+49667.key bin/tests/dst/dst_2_data bin/tests/dst/t2_data_1 bin/tests/dst/t2_data_2 bin/tests/dst/t2_dsasig bin/tests/dst/t2_rsasig bin/tests/headerdep_test.sh bin/tests/names/Makefile bin/tests/optional/Makefile bin/tests/pkcs11/Makefile bin/tests/pkcs11/benchmarks/Makefile bin/tests/rbt/Makefile bin/tests/resolver/Makefile bin/tests/system/Makefile bin/tests/system/conf.sh bin/tests/system/dlz/prereq.sh bin/tests/system/dlzexternal/Makefile bin/tests/system/dlzexternal/ns1/dlzs.conf bin/tests/system/dyndb/Makefile bin/tests/system/dyndb/driver/Makefile bin/tests/system/inline/checkdsa.sh bin/tests/system/pipelined/Makefile bin/tests/system/rndc/Makefile bin/tests/system/rpz/Makefile bin/tests/system/rsabigexponent/Makefile bin/tests/system/tkey/Makefile bin/tests/tasks/Makefile bin/tests/timers/Makefile bin/tests/virtual-time/Makefile bin/tests/virtual-time/conf.sh bin/tools/Makefile contrib/scripts/check-secure-delegation.pl contrib/scripts/zone-edit.sh doc/Makefile doc/arm/Makefile doc/arm/noteversion.xml doc/arm/pkgversion.xml doc/arm/releaseinfo.xml doc/doxygen/Doxyfile doc/doxygen/Makefile doc/doxygen/doxygen-input-filter doc/misc/Makefile doc/tex/Makefile doc/tex/armstyle.sty doc/xsl/Makefile doc/xsl/isc-docbook-chunk.xsl doc/xsl/isc-docbook-html.xsl doc/xsl/isc-manpage.xsl doc/xsl/isc-notes-html.xsl isc-config.sh lib/Makefile lib/bind9/Makefile lib/bind9/include/Makefile lib/bind9/include/bind9/Makefile lib/dns/Makefile lib/dns/include/Makefile lib/dns/include/dns/Makefile lib/dns/include/dst/Makefile lib/dns/tests/Makefile lib/irs/Makefile lib/irs/include/Makefile lib/irs/include/irs/Makefile lib/irs/include/irs/netdb.h lib/irs/include/irs/platform.h lib/irs/tests/Makefile lib/isc/$arch/Makefile lib/isc/$arch/include/Makefile lib/isc/$arch/include/isc/Makefile lib/isc/$thread_dir/Makefile lib/isc/$thread_dir/include/Makefile lib/isc/$thread_dir/include/isc/Makefile lib/isc/Makefile lib/isc/include/Makefile lib/isc/include/isc/Makefile lib/isc/include/isc/platform.h lib/isc/include/pk11/Makefile lib/isc/include/pkcs11/Makefile lib/isc/tests/Makefile lib/isc/nls/Makefile lib/isc/unix/Makefile lib/isc/unix/include/Makefile lib/isc/unix/include/isc/Makefile lib/isc/unix/include/pkcs11/Makefile lib/isccc/Makefile lib/isccc/include/Makefile lib/isccc/include/isccc/Makefile lib/isccfg/Makefile lib/isccfg/include/Makefile lib/isccfg/include/isccfg/Makefile lib/isccfg/tests/Makefile lib/ns/Makefile lib/ns/include/Makefile lib/ns/include/ns/Makefile lib/ns/tests/Makefile lib/tests/Makefile lib/tests/include/Makefile lib/tests/include/tests/Makefile lib/samples/Makefile lib/samples/Makefile-postinstall unit/Makefile unit/unittest.sh"
+ac_config_files="$ac_config_files make/Makefile make/mkdep Makefile bin/Makefile bin/check/Makefile bin/confgen/Makefile bin/confgen/unix/Makefile bin/delv/Makefile bin/dig/Makefile bin/dnssec/Makefile bin/named/Makefile bin/named/unix/Makefile bin/nsupdate/Makefile bin/pkcs11/Makefile bin/python/Makefile bin/python/isc/Makefile bin/python/isc/utils.py bin/python/isc/tests/Makefile bin/python/dnssec-checkds.py bin/python/dnssec-coverage.py bin/python/dnssec-keymgr.py bin/python/isc/__init__.py bin/python/isc/checkds.py bin/python/isc/coverage.py bin/python/isc/dnskey.py bin/python/isc/eventlist.py bin/python/isc/keydict.py bin/python/isc/keyevent.py bin/python/isc/keymgr.py bin/python/isc/keyseries.py bin/python/isc/keyzone.py bin/python/isc/policy.py bin/python/isc/rndc.py bin/python/isc/tests/dnskey_test.py bin/python/isc/tests/policy_test.py bin/rndc/Makefile bin/tests/Makefile bin/tests/db/Makefile bin/tests/dst/Makefile bin/tests/dst/Kdh.+002+18602.key bin/tests/dst/Kdh.+002+18602.private bin/tests/dst/Kdh.+002+48957.key bin/tests/dst/Kdh.+002+48957.private bin/tests/dst/Ktest.+001+00002.key bin/tests/dst/Ktest.+001+54622.key bin/tests/dst/Ktest.+001+54622.private bin/tests/dst/Ktest.+003+23616.key bin/tests/dst/Ktest.+003+23616.private bin/tests/dst/Ktest.+003+49667.key bin/tests/dst/dst_2_data bin/tests/dst/t2_data_1 bin/tests/dst/t2_data_2 bin/tests/dst/t2_dsasig bin/tests/dst/t2_rsasig bin/tests/headerdep_test.sh bin/tests/names/Makefile bin/tests/optional/Makefile bin/tests/pkcs11/Makefile bin/tests/pkcs11/benchmarks/Makefile bin/tests/rbt/Makefile bin/tests/resolver/Makefile bin/tests/system/Makefile bin/tests/system/conf.sh bin/tests/system/dlz/prereq.sh bin/tests/system/dlzexternal/Makefile bin/tests/system/dlzexternal/ns1/dlzs.conf bin/tests/system/dyndb/Makefile bin/tests/system/dyndb/driver/Makefile bin/tests/system/inline/checkdsa.sh bin/tests/system/pipelined/Makefile bin/tests/system/rndc/Makefile bin/tests/system/rpz/Makefile bin/tests/system/rsabigexponent/Makefile bin/tests/system/tkey/Makefile bin/tests/tasks/Makefile bin/tests/virtual-time/Makefile bin/tests/virtual-time/conf.sh bin/tools/Makefile contrib/scripts/check-secure-delegation.pl contrib/scripts/zone-edit.sh doc/Makefile doc/arm/Makefile doc/arm/noteversion.xml doc/arm/pkgversion.xml doc/arm/releaseinfo.xml doc/doxygen/Doxyfile doc/doxygen/Makefile doc/doxygen/doxygen-input-filter doc/misc/Makefile doc/tex/Makefile doc/tex/armstyle.sty doc/xsl/Makefile doc/xsl/isc-docbook-chunk.xsl doc/xsl/isc-docbook-html.xsl doc/xsl/isc-manpage.xsl doc/xsl/isc-notes-html.xsl isc-config.sh lib/Makefile lib/bind9/Makefile lib/bind9/include/Makefile lib/bind9/include/bind9/Makefile lib/dns/Makefile lib/dns/include/Makefile lib/dns/include/dns/Makefile lib/dns/include/dst/Makefile lib/dns/tests/Makefile lib/irs/Makefile lib/irs/include/Makefile lib/irs/include/irs/Makefile lib/irs/include/irs/netdb.h lib/irs/include/irs/platform.h lib/irs/tests/Makefile lib/isc/$arch/Makefile lib/isc/$arch/include/Makefile lib/isc/$arch/include/isc/Makefile lib/isc/$thread_dir/Makefile lib/isc/$thread_dir/include/Makefile lib/isc/$thread_dir/include/isc/Makefile lib/isc/Makefile lib/isc/include/Makefile lib/isc/include/isc/Makefile lib/isc/include/isc/platform.h lib/isc/include/pk11/Makefile lib/isc/include/pkcs11/Makefile lib/isc/tests/Makefile lib/isc/nls/Makefile lib/isc/unix/Makefile lib/isc/unix/include/Makefile lib/isc/unix/include/isc/Makefile lib/isc/unix/include/pkcs11/Makefile lib/isccc/Makefile lib/isccc/include/Makefile lib/isccc/include/isccc/Makefile lib/isccfg/Makefile lib/isccfg/include/Makefile lib/isccfg/include/isccfg/Makefile lib/isccfg/tests/Makefile lib/ns/Makefile lib/ns/include/Makefile lib/ns/include/ns/Makefile lib/ns/tests/Makefile lib/tests/Makefile lib/tests/include/Makefile lib/tests/include/tests/Makefile lib/samples/Makefile lib/samples/Makefile-postinstall unit/Makefile unit/unittest.sh"
#
"bin/tests/system/rsabigexponent/Makefile") CONFIG_FILES="$CONFIG_FILES bin/tests/system/rsabigexponent/Makefile" ;;
"bin/tests/system/tkey/Makefile") CONFIG_FILES="$CONFIG_FILES bin/tests/system/tkey/Makefile" ;;
"bin/tests/tasks/Makefile") CONFIG_FILES="$CONFIG_FILES bin/tests/tasks/Makefile" ;;
- "bin/tests/timers/Makefile") CONFIG_FILES="$CONFIG_FILES bin/tests/timers/Makefile" ;;
"bin/tests/virtual-time/Makefile") CONFIG_FILES="$CONFIG_FILES bin/tests/virtual-time/Makefile" ;;
"bin/tests/virtual-time/conf.sh") CONFIG_FILES="$CONFIG_FILES bin/tests/virtual-time/conf.sh" ;;
"bin/tools/Makefile") CONFIG_FILES="$CONFIG_FILES bin/tools/Makefile" ;;
bin/tests/system/rsabigexponent/Makefile
bin/tests/system/tkey/Makefile
bin/tests/tasks/Makefile
- bin/tests/timers/Makefile
bin/tests/virtual-time/Makefile
bin/tests/virtual-time/conf.sh
bin/tools/Makefile
tp: symtab_test
tp: task_test
tp: taskpool_test
+tp: timer_test
tp: time_test
print_test.c queue_test.c radix_test.c random_test.c \
regex_test.c result_test.c safe_test.c sockaddr_test.c \
socket_test.c socket_test.c symtab_test.c task_test.c \
- taskpool_test.c time_test.c
+ taskpool_test.c time_test.c timer_test.c
SUBDIRS =
TARGETS = aes_test@EXEEXT@ atomic_test@EXEEXT@ buffer_test@EXEEXT@ \
random_test@EXEEXT@ regex_test@EXEEXT@ result_test@EXEEXT@ \
safe_test@EXEEXT@ sockaddr_test@EXEEXT@ socket_test@EXEEXT@ \
socket_test@EXEEXT@ symtab_test@EXEEXT@ task_test@EXEEXT@ \
- taskpool_test@EXEEXT@ time_test@EXEEXT@
+ taskpool_test@EXEEXT@ time_test@EXEEXT@ timer_test@EXEEXT@
@BIND9_MAKE_RULES@
${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
time_test.@O@ ${ISCLIBS} ${LIBS}
+timer_test@EXEEXT@: timer_test.@O@ isctest.@O@ ${ISCDEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ timer_test.@O@ isctest.@O@ ${ISCLIBS} ${LIBS}
+
unit::
sh ${top_builddir}/unit/unittest.sh
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
memset(counters, 0, sizeof(counters));
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
memset(counters, 0, sizeof(counters));
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
memset(counters, 0, sizeof(counters));
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
memset(counters, 0, sizeof(counters));
isc_result_t result;
isc_buffer_t *b;
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
b = NULL;
isc_result_t result;
isc_buffer_t *b;
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
b = NULL;
size_t last_length = 10;
int i;
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
b = NULL;
isc_buffer_t *b, sb;
char buf[8];
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
/*
isc_counter_t *counter = NULL;
int i;
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_counter_create(mctx, 0, &counter);
* information regarding copyright ownership.
*/
-/* $Id$ */
-
/*! \file */
#include <config.h>
+#include <stdlib.h>
#include <time.h>
#include <isc/app.h>
}
static isc_result_t
-create_managers(void) {
+create_managers(unsigned int workers) {
isc_result_t result;
+ char *p;
+
+ if (workers == 0) {
#ifdef ISC_PLATFORM_USETHREADS
- ncpus = isc_os_ncpus();
+ workers = isc_os_ncpus();
#else
- ncpus = 1;
+ workers = 1;
#endif
+ }
+
+ p = getenv("ISC_TASK_WORKERS");
+ if (p != NULL) {
+ workers = atoi(p);
+ }
- CHECK(isc_taskmgr_create(mctx, ncpus, 0, &taskmgr));
+ CHECK(isc_taskmgr_create(mctx, workers, 0, &taskmgr));
CHECK(isc_task_create(taskmgr, 0, &maintask));
isc_taskmgr_setexcltask(taskmgr, maintask);
}
isc_result_t
-isc_test_begin(FILE *logfile, isc_boolean_t start_managers) {
+isc_test_begin(FILE *logfile, isc_boolean_t start_managers,
+ unsigned int workers)
+{
isc_result_t result;
isc_mem_debugging |= ISC_MEM_DEBUGRECORD;
ncpus = 1;
#endif
- if (start_managers)
- CHECK(create_managers());
+ if (start_managers) {
+ CHECK(create_managers(workers));
+ }
return (ISC_R_SUCCESS);
* information regarding copyright ownership.
*/
-/* $Id$ */
-
/*! \file */
#include <config.h>
extern int ncpus;
isc_result_t
-isc_test_begin(FILE *logfile, isc_boolean_t start_managers);
+isc_test_begin(FILE *logfile, isc_boolean_t start_managers,
+ unsigned int workers);
+/*%<
+ * Begin test, logging to 'logfile' or default if not specified.
+ *
+ * If 'start_managers' is set, start a task manager, timer manager,
+ * and socket manager.
+ *
+ * If 'workers' is zero, use the number of CPUs on the system as a default;
+ * otherwise, set up the task manager with the specified number of worker
+ * threads. The environment variable ISC_TASK_WORKERS overrides this value.
+ */
void
isc_test_end(void);
unsigned int i, j;
int rval;
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_mem_create(0, 0, &localmctx);
ssize_t diff;
int i;
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
/* Local alloc, free */
ssize_t diff;
void *ptr;
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
mctx2 = NULL;
result = isc_stdio_open("mem.output", "w", &f);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_mem_createx2(0, 0, default_memalloc, default_memfree,
result = isc_stdio_open("mem.output", "w", &f);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
- result = isc_test_begin(NULL, ISC_FALSE);
+ result = isc_test_begin(NULL, ISC_FALSE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_mem_createx2(0, 0, default_memalloc, default_memfree,
f = freopen("mem.output", "w", stderr);
ATF_REQUIRE(f != NULL);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_mem_createx2(0, 0, default_memalloc, default_memfree,
* information regarding copyright ownership.
*/
-/* $Id$ */
-
/*! \file */
#include <config.h>
isc_uint32_t output;
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_parse_uint32(&output, "1234567890", 10);
* information regarding copyright ownership.
*/
-/* $Id$ */
-
/*! \file */
#include <config.h>
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_pool_create(mctx, 8, poolfree, poolinit, taskmgr, &pool);
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_pool_create(mctx, 10, poolfree, poolinit, taskmgr, &pool1);
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_pool_create(mctx, 2, poolfree, poolinit, taskmgr, &pool);
* information regarding copyright ownership.
*/
-/* $Id$ */
-
/*! \file */
#include <config.h>
item_init(&four, 4);
item_init(&five, 5);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
ATF_CHECK(ISC_QUEUE_EMPTY(queue));
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_radix_create(mctx, &radix, 32);
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
in.s_addr = inet_addr("127.0.0.1");
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
in.s_addr = inet_addr("127.0.0.1");
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
in.s_addr = inet_addr("127.0.0.1");
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
in.s_addr = inet_addr("127.0.0.1");
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
n = inet_pton(AF_INET6, "::1", &in6.s6_addr);
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
in.s_addr = inet_addr("127.0.0.1");
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
n = inet_pton(AF_INET6, "::1", &in6.s6_addr);
* information regarding copyright ownership.
*/
-/* $Id$ */
-
/*! \file */
#include <config.h>
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_symtab_create(mctx, 3, undefine, NULL, ISC_FALSE, &st);
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_task_create(taskmgr, 0, &task);
result = isc_mutex_init(&set_lock);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_task_create(taskmgr, 0, &task);
result = isc_mutex_init(&set_lock);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
#ifdef ISC_PLATFORM_USETHREADS
result = isc_mutex_init(&set_lock);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
#ifdef ISC_PLATFORM_USETHREADS
* information regarding copyright ownership.
*/
-/* $Id$ */
-
/*! \file */
#include <config.h>
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_taskpool_create(taskmgr, mctx, 8, 2, &pool);
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_taskpool_create(taskmgr, mctx, 10, 2, &pool1);
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_taskpool_create(taskmgr, mctx, 2, 2, &pool);
UNUSED(tc);
- result = isc_test_begin(NULL, ISC_TRUE);
+ result = isc_test_begin(NULL, ISC_TRUE, 0);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = isc_taskpool_create(taskmgr, mctx, 2, 2, &pool);
--- /dev/null
+/*
+ * 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 <atf-c.h>
+
+#include <unistd.h>
+
+#include <isc/condition.h>
+#include <isc/mem.h>
+#include <isc/platform.h>
+#include <isc/task.h>
+#include <isc/time.h>
+#include <isc/timer.h>
+#include <isc/util.h>
+#include <isc/util.h>
+
+#include "isctest.h"
+
+/*
+ * Helper functions
+ */
+#define FUDGE_SECONDS 0 /* in absence of clock_getres() */
+#define FUDGE_NANOSECONDS 500000000 /* in absence of clock_getres() */
+
+static isc_timer_t *timer = NULL;
+static isc_condition_t cv;
+static isc_mutex_t mx;
+static isc_time_t endtime;
+static isc_time_t lasttime;
+static int seconds;
+static int nanoseconds;
+static int eventcnt;
+static int nevents;
+
+static void
+shutdown(isc_task_t *task, isc_event_t *event) {
+ isc_result_t result;
+
+ UNUSED(task);
+
+ /*
+ * Signal shutdown processing complete.
+ */
+ result = isc_mutex_lock(&mx);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ result = isc_condition_signal(&cv);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ result = isc_mutex_unlock(&mx);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ isc_event_free(&event);
+}
+
+static void
+setup_test(isc_timertype_t timertype, isc_time_t *expires,
+ isc_interval_t *interval,
+ void (*action)(isc_task_t *, isc_event_t *))
+{
+ isc_result_t result;
+ isc_task_t *task = NULL;
+ isc_time_settoepoch(&endtime);
+ eventcnt = 0;
+
+ result = isc_mutex_init(&mx);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ result = isc_condition_init(&cv);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ LOCK(&mx);
+
+ result = isc_task_create(taskmgr, 0, &task);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ result = isc_task_onshutdown(task, shutdown, NULL);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ result = isc_time_now(&lasttime);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ result = isc_timer_create(timermgr, timertype, expires, interval,
+ task, action, (void *)timertype,
+ &timer);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ /*
+ * Wait for shutdown processing to complete.
+ */
+ while (eventcnt != nevents) {
+ result = isc_condition_wait(&cv, &mx);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+ }
+
+ UNLOCK(&mx);
+
+ isc_task_detach(&task);
+ DESTROYLOCK(&mx);
+ (void) isc_condition_destroy(&cv);
+}
+
+static void
+ticktock(isc_task_t *task, isc_event_t *event) {
+ isc_result_t result;
+ isc_time_t now;
+ isc_time_t base;
+ isc_time_t ulim;
+ isc_time_t llim;
+ isc_interval_t interval;
+ isc_eventtype_t expected_event_type;
+
+ ++eventcnt;
+
+ printf("tick %d\n", eventcnt);
+
+ expected_event_type = ISC_TIMEREVENT_LIFE;
+ if ((isc_timertype_t) event->ev_arg == isc_timertype_ticker) {
+ expected_event_type = ISC_TIMEREVENT_TICK;
+ }
+
+ if (event->ev_type != expected_event_type) {
+ printf("expected event type %d, got %d\n",
+ expected_event_type, (int) event->ev_type);
+ }
+
+ result = isc_time_now(&now);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ isc_interval_set(&interval, seconds, nanoseconds);
+ result = isc_time_add(&lasttime, &interval, &base);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ isc_interval_set(&interval, FUDGE_SECONDS, FUDGE_NANOSECONDS);
+ result = isc_time_add(&base, &interval, &ulim);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ result = isc_time_subtract(&base, &interval, &llim);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ ATF_CHECK(isc_time_compare(&llim, &now) <= 0);
+ ATF_CHECK(isc_time_compare(&ulim, &now) >= 0);
+ lasttime = now;
+
+ if (eventcnt == nevents) {
+ result = isc_time_now(&endtime);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+ isc_timer_detach(&timer);
+ isc_task_shutdown(task);
+ }
+
+ isc_event_free(&event);
+}
+
+/*
+ * Individual unit tests
+ */
+
+ATF_TC(ticker);
+ATF_TC_HEAD(ticker, tc) {
+ atf_tc_set_md_var(tc, "descr", "timer type ticker");
+}
+ATF_TC_BODY(ticker, tc) {
+ isc_result_t result;
+ isc_time_t expires;
+ isc_interval_t interval;
+
+ UNUSED(tc);
+
+ nevents = 12;
+ seconds = 0;
+ nanoseconds = 500000000;
+
+ result = isc_test_begin(NULL, ISC_TRUE, 2);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ isc_interval_set(&interval, seconds, nanoseconds);
+ isc_time_settoepoch(&expires);
+
+ setup_test(isc_timertype_ticker, &expires, &interval, ticktock);
+
+ isc_test_end();
+}
+
+ATF_TC(once_life);
+ATF_TC_HEAD(once_life, tc) {
+ atf_tc_set_md_var(tc, "descr", "timer type once reaches lifetime");
+}
+ATF_TC_BODY(once_life, tc) {
+ isc_result_t result;
+ isc_time_t expires;
+ isc_interval_t interval;
+
+ UNUSED(tc);
+
+ nevents = 1;
+ seconds = 1;
+ nanoseconds = 100000000;
+
+ result = isc_test_begin(NULL, ISC_TRUE, 2);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ isc_interval_set(&interval, seconds, nanoseconds);
+ result = isc_time_nowplusinterval(&expires, &interval);
+ ATF_CHECK_EQ(result, ISC_R_SUCCESS);
+
+ isc_interval_set(&interval, 0, 0);
+
+ setup_test(isc_timertype_once, &expires, &interval, ticktock);
+
+ isc_test_end();
+}
+
+
+static void
+test_idle(isc_task_t *task, isc_event_t *event) {
+ isc_result_t result;
+ isc_time_t now;
+ isc_time_t base;
+ isc_time_t ulim;
+ isc_time_t llim;
+ isc_interval_t interval;
+
+ ++eventcnt;
+
+ printf("tick %d\n", eventcnt);
+
+ result = isc_time_now(&now);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ isc_interval_set(&interval, seconds, nanoseconds);
+ result = isc_time_add(&lasttime, &interval, &base);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ isc_interval_set(&interval, FUDGE_SECONDS, FUDGE_NANOSECONDS);
+ result = isc_time_add(&base, &interval, &ulim);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ result = isc_time_subtract(&base, &interval, &llim);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ ATF_CHECK(isc_time_compare(&llim, &now) <= 0);
+ ATF_CHECK(isc_time_compare(&ulim, &now) >= 0);
+ lasttime = now;
+
+ ATF_CHECK_EQ(event->ev_type, ISC_TIMEREVENT_IDLE);
+
+ isc_timer_detach(&timer);
+ isc_task_shutdown(task);
+ isc_event_free(&event);
+}
+
+ATF_TC(once_idle);
+ATF_TC_HEAD(once_idle, tc) {
+ atf_tc_set_md_var(tc, "descr", "timer type once idles out");
+}
+ATF_TC_BODY(once_idle, tc) {
+ isc_result_t result;
+ isc_time_t expires;
+ isc_interval_t interval;
+
+ UNUSED(tc);
+
+ nevents = 1;
+ seconds = 1;
+ nanoseconds = 200000000;
+
+ result = isc_test_begin(NULL, ISC_TRUE, 2);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ isc_interval_set(&interval, seconds + 1, nanoseconds);
+ result = isc_time_nowplusinterval(&expires, &interval);
+ ATF_CHECK_EQ(result, ISC_R_SUCCESS);
+
+ isc_interval_set(&interval, seconds, nanoseconds);
+
+ setup_test(isc_timertype_once, &expires, &interval, test_idle);
+
+ isc_test_end();
+}
+
+static void
+test_reset(isc_task_t *task, isc_event_t *event) {
+ isc_result_t result;
+ isc_time_t now;
+ isc_time_t base;
+ isc_time_t ulim;
+ isc_time_t llim;
+ isc_time_t expires;
+ isc_interval_t interval;
+
+ ++eventcnt;
+
+ printf("tick %d\n", eventcnt);
+
+ /*
+ * Check expired time.
+ */
+
+ result = isc_time_now(&now);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ isc_interval_set(&interval, seconds, nanoseconds);
+ result = isc_time_add(&lasttime, &interval, &base);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ isc_interval_set(&interval, FUDGE_SECONDS, FUDGE_NANOSECONDS);
+ result = isc_time_add(&base, &interval, &ulim);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ result = isc_time_subtract(&base, &interval, &llim);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ ATF_CHECK(isc_time_compare(&llim, &now) <= 0);
+ ATF_CHECK(isc_time_compare(&ulim, &now) >= 0);
+ lasttime = now;
+
+ if (eventcnt < 3) {
+ ATF_CHECK_EQ(event->ev_type, ISC_TIMEREVENT_TICK);
+
+ if (eventcnt == 2) {
+ isc_interval_set(&interval, seconds, nanoseconds);
+ result = isc_time_nowplusinterval(&expires, &interval);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ isc_interval_set(&interval, 0, 0);
+ result = isc_timer_reset(timer, isc_timertype_once,
+ &expires, &interval,
+ ISC_FALSE);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+ }
+ } else {
+ ATF_CHECK_EQ(event->ev_type, ISC_TIMEREVENT_LIFE);
+
+ isc_timer_detach(&timer);
+ isc_task_shutdown(task);
+ }
+
+ isc_event_free(&event);
+}
+
+ATF_TC(reset);
+ATF_TC_HEAD(reset, tc) {
+ atf_tc_set_md_var(tc, "descr", "timer reset");
+}
+ATF_TC_BODY(reset, tc) {
+ isc_result_t result;
+ isc_time_t expires;
+ isc_interval_t interval;
+
+ UNUSED(tc);
+
+ result = isc_test_begin(NULL, ISC_TRUE, 2);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ nevents = 3;
+ seconds = 0;
+ nanoseconds = 750000000;
+
+ isc_interval_set(&interval, seconds, nanoseconds);
+ isc_time_settoepoch(&expires);
+
+ setup_test(isc_timertype_ticker, &expires, &interval, test_reset);
+
+ isc_test_end();
+}
+
+static int startflag;
+static int shutdownflag;
+static isc_timer_t *tickertimer = NULL;
+static isc_timer_t *oncetimer = NULL;
+static isc_task_t *task1 = NULL;
+static isc_task_t *task2 = NULL;
+
+/*
+ * task1 blocks on mx while events accumulate
+ * in its queue, until signaled by task2.
+ */
+
+static void
+start_event(isc_task_t *task, isc_event_t *event) {
+ UNUSED(task);
+
+ printf("start_event\n");
+
+ LOCK(&mx);
+ while (! startflag) {
+ (void) isc_condition_wait(&cv, &mx);
+ }
+ UNLOCK(&mx);
+
+ isc_event_free(&event);
+}
+
+static void
+tick_event(isc_task_t *task, isc_event_t *event) {
+ isc_result_t result;
+ isc_time_t expires;
+ isc_interval_t interval;
+
+ UNUSED(task);
+
+ ++eventcnt;
+ printf("tick_event %d\n", eventcnt);
+
+ /*
+ * On the first tick, purge all remaining tick events
+ * and then shut down the task.
+ */
+ if (eventcnt == 1) {
+ isc_time_settoepoch(&expires);
+ isc_interval_set(&interval, seconds, 0);
+ result = isc_timer_reset(tickertimer, isc_timertype_ticker,
+ &expires, &interval, ISC_TRUE);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ isc_task_shutdown(task);
+ }
+
+ isc_event_free(&event);
+}
+
+static void
+once_event(isc_task_t *task, isc_event_t *event) {
+ isc_result_t result;
+
+ printf("once_event\n");
+
+ /*
+ * Allow task1 to start processing events.
+ */
+ LOCK(&mx);
+ startflag = 1;
+
+ result = isc_condition_broadcast(&cv);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+ UNLOCK(&mx);
+
+ isc_event_free(&event);
+ isc_task_shutdown(task);
+}
+
+static void
+shutdown_purge(isc_task_t *task, isc_event_t *event) {
+ isc_result_t result;
+
+ UNUSED(task);
+ UNUSED(event);
+
+ printf("shutdown_event\n");
+
+ /*
+ * Signal shutdown processing complete.
+ */
+ LOCK(&mx);
+ shutdownflag = 1;
+
+ result = isc_condition_signal(&cv);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+ UNLOCK(&mx);
+
+ isc_event_free(&event);
+}
+
+ATF_TC(purge);
+ATF_TC_HEAD(purge, tc) {
+ atf_tc_set_md_var(tc, "descr", "timer events purged");
+}
+ATF_TC_BODY(purge, tc) {
+ isc_result_t result;
+ isc_event_t *event = NULL;
+ isc_time_t expires;
+ isc_interval_t interval;
+
+ UNUSED(tc);
+
+ result = isc_test_begin(NULL, ISC_TRUE, 2);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ startflag = 0;
+ shutdownflag = 0;
+ eventcnt = 0;
+ seconds = 1;
+ nanoseconds = 0;
+
+ result = isc_mutex_init(&mx);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ result = isc_condition_init(&cv);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ result = isc_task_create(taskmgr, 0, &task1);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ result = isc_task_onshutdown(task1, shutdown_purge, NULL);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ result = isc_task_create(taskmgr, 0, &task2);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ LOCK(&mx);
+
+ event = isc_event_allocate(mctx, (void *)1 , (isc_eventtype_t)1,
+ start_event, NULL, sizeof(*event));
+ ATF_REQUIRE(event != NULL);
+ isc_task_send(task1, &event);
+
+ isc_time_settoepoch(&expires);
+ isc_interval_set(&interval, seconds, 0);
+
+ tickertimer = NULL;
+ result = isc_timer_create(timermgr, isc_timertype_ticker,
+ &expires, &interval, task1,
+ tick_event, NULL, &tickertimer);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ oncetimer = NULL;
+
+ isc_interval_set(&interval, (seconds * 2) + 1, 0);
+ result = isc_time_nowplusinterval(&expires, &interval);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ isc_interval_set(&interval, 0, 0);
+ result = isc_timer_create(timermgr, isc_timertype_once,
+ &expires, &interval, task2,
+ once_event, NULL, &oncetimer);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+
+ /*
+ * Wait for shutdown processing to complete.
+ */
+ while (! shutdownflag) {
+ result = isc_condition_wait(&cv, &mx);
+ ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+ }
+
+ UNLOCK(&mx);
+
+ ATF_CHECK_EQ(eventcnt, 1);
+
+ isc_timer_detach(&tickertimer);
+ isc_timer_detach(&oncetimer);
+ isc_task_destroy(&task1);
+ isc_task_destroy(&task2);
+ DESTROYLOCK(&mx);
+
+ isc_test_end();
+}
+
+/*
+ * Main
+ */
+ATF_TP_ADD_TCS(tp) {
+#ifdef ISC_PLATFORM_USETHREADS
+ ATF_TP_ADD_TC(tp, ticker);
+ ATF_TP_ADD_TC(tp, once_life);
+ ATF_TP_ADD_TC(tp, once_idle);
+ ATF_TP_ADD_TC(tp, reset);
+ ATF_TP_ADD_TC(tp, purge);
+#endif
+
+ return (atf_no_error());
+}
./bin/tests/tasks/win32/t_tasks.vcxproj.in X 2013,2015,2016,2017,2018
./bin/tests/tasks/win32/t_tasks.vcxproj.user X 2013,2015,2018
./bin/tests/timer_test.c C 1998,1999,2000,2001,2004,2007,2013,2014,2015,2016,2018
-./bin/tests/timers/Makefile.in MAKE 1999,2000,2001,2002,2004,2007,2009,2012,2014,2016,2017,2018
-./bin/tests/timers/t_timers.c C 1999,2000,2001,2004,2007,2008,2009,2011,2013,2016,2018
-./bin/tests/timers/win32/t_timers.vcxproj.filters.in X 2013,2015,2018
-./bin/tests/timers/win32/t_timers.vcxproj.in X 2013,2015,2016,2017,2018
-./bin/tests/timers/win32/t_timers.vcxproj.user X 2013,2018
./bin/tests/virtual-time/Makefile.in MAKE 2010,2012,2016,2018
./bin/tests/virtual-time/README TXT.BRIEF 2010,2016,2018
./bin/tests/virtual-time/autosign-ksk/clean.sh SH 2010,2012,2015,2016,2018
"..\\bin\\tests\\system\\win32\\pipequeries.vcxproj.filters",
"..\\bin\\tests\\tasks\\win32\\t_tasks.vcxproj",
"..\\bin\\tests\\tasks\\win32\\t_tasks.vcxproj.filters",
- "..\\bin\\tests\\timers\\win32\\t_timers.vcxproj",
- "..\\bin\\tests\\timers\\win32\\t_timers.vcxproj.filters",
"..\\bin\\tests\\win32\\backtrace_test.vcxproj",
"..\\bin\\tests\\win32\\backtrace_test.vcxproj.filters",
"..\\bin\\tests\\win32\\inter_test.vcxproj",
{F6F08940-7597-4FEE-9CE0-E09A009C45A3} = {F6F08940-7597-4FEE-9CE0-E09A009C45A3}
EndProjectSection
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t_timers", "..\bin\tests\timers\win32\t_timers.vcxproj", "{4E6F5A7C-89AA-4259-99DB-F89DAE418B3F}"
- ProjectSection(ProjectDependencies) = postProject
- {3840E563-D180-4761-AA9C-E6155F02EAFF} = {3840E563-D180-4761-AA9C-E6155F02EAFF}
- {F6F08940-7597-4FEE-9CE0-E09A009C45A3} = {F6F08940-7597-4FEE-9CE0-E09A009C45A3}
- EndProjectSection
-EndProject
@END TESTS
@IF XTESTS
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "backtrace_test", "..\bin\tests\win32\backtrace_test.vcxproj", "{14751171-C40E-40EE-A2F0-37FFC3CCD4A2}"