1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington/*
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Copyright (C) 1998-2001, 2004, 2007, 2013-2016 Internet Systems Consortium, Inc. ("ISC")
ec5347e2c775f027573ce5648b910361aa926c01Automatic Updater *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
ec5347e2c775f027573ce5648b910361aa926c01Automatic Updater */
cb3e854e181373807f7f011e5050c1a8013b4841Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington/* $Id: timer_test.c,v 1.40 2007/06/19 23:46:59 tbox Exp $ */
271c4c7ffafeb0bda21278af6cac4535c0193f18Automatic Updater
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington#include <config.h>
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington#include <stdlib.h>
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews#include <string.h>
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews#include <unistd.h>
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews
cb3e854e181373807f7f011e5050c1a8013b4841Brian Wellington#include <isc/mem.h>
cb3e854e181373807f7f011e5050c1a8013b4841Brian Wellington#include <isc/print.h>
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews#include <isc/task.h>
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews#include <isc/time.h>
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington#include <isc/timer.h>
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington#include <isc/util.h>
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellingtonisc_mem_t *mctx1, *mctx2, *mctx3;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellingtonisc_task_t *t1, *t2, *t3;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellingtonisc_timer_t *ti1, *ti2, *ti3;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellingtonint tick_count = 0;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellingtonstatic void
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellingtonshutdown_task(isc_task_t *task, isc_event_t *event) {
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington char *name = event->ev_arg;
3759f10fc543747668b1ca4b4671f35b0dea8445Francis Dupont
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington printf("task %p shutdown %s\n", task, name);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_event_free(&event);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington}
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellingtonstatic void
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellingtontick(isc_task_t *task, isc_event_t *event) {
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington char *name = event->ev_arg;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington INSIST(event->ev_type == ISC_TIMEREVENT_TICK);
4523c3b371e0e8aa6451aefcf2ba593c4d16ea31Evan Hunt
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington printf("task %s (%p) tick\n", name, task);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson tick_count++;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington if (ti3 != NULL && tick_count % 3 == 0)
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_timer_touch(ti3);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington if (ti3 != NULL && tick_count == 7) {
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_time_t expires;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_interval_t interval;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_interval_set(&interval, 5, 0);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington (void)isc_time_nowplusinterval(&expires, &interval);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_interval_set(&interval, 4, 0);
4523c3b371e0e8aa6451aefcf2ba593c4d16ea31Evan Hunt printf("*** resetting ti3 ***\n");
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington RUNTIME_CHECK(isc_timer_reset(ti3, isc_timertype_once,
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington &expires, &interval, ISC_TRUE) ==
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington ISC_R_SUCCESS);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington }
4523c3b371e0e8aa6451aefcf2ba593c4d16ea31Evan Hunt
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_event_free(&event);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington}
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellingtonstatic void
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellingtontimeout(isc_task_t *task, isc_event_t *event) {
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington char *name = event->ev_arg;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington const char *type;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington INSIST(event->ev_type == ISC_TIMEREVENT_IDLE ||
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington event->ev_type == ISC_TIMEREVENT_LIFE);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington if (event->ev_type == ISC_TIMEREVENT_IDLE)
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington type = "idle";
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington else
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington type = "life";
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington printf("task %s (%p) %s timeout\n", name, task, type);
4523c3b371e0e8aa6451aefcf2ba593c4d16ea31Evan Hunt
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington if (strcmp(name, "3") == 0) {
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington printf("*** saving task 3 ***\n");
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_event_free(&event);
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson return;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington }
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_event_free(&event);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_task_shutdown(task);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington}
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellingtonstatic char one[] = "1";
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellingtonstatic char two[] = "2";
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellingtonstatic char three[] = "3";
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellingtonint
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellingtonmain(int argc, char *argv[]) {
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_taskmgr_t *manager = NULL;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_timermgr_t *timgr = NULL;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington unsigned int workers;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_time_t expires, now;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_interval_t interval;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
e851ea826066ac5a5b01c2c23218faa0273a12e8Evan Hunt if (argc > 1) {
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington workers = atoi(argv[1]);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington if (workers < 1)
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington workers = 1;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington if (workers > 8192)
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington workers = 8192;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington } else
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington workers = 2;
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington printf("%d workers\n", workers);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
4523c3b371e0e8aa6451aefcf2ba593c4d16ea31Evan Hunt RUNTIME_CHECK(isc_mem_create(0, 0, &mctx1) == ISC_R_SUCCESS);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington RUNTIME_CHECK(isc_taskmgr_create(mctx1, workers, 0, &manager) ==
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington ISC_R_SUCCESS);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington RUNTIME_CHECK(isc_timermgr_create(mctx1, &timgr) == ISC_R_SUCCESS);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington RUNTIME_CHECK(isc_task_create(manager, 0, &t1) ==
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington ISC_R_SUCCESS);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington RUNTIME_CHECK(isc_task_create(manager, 0, &t2) ==
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington ISC_R_SUCCESS);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington RUNTIME_CHECK(isc_task_create(manager, 0, &t3) ==
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington ISC_R_SUCCESS);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington RUNTIME_CHECK(isc_task_onshutdown(t1, shutdown_task, one) ==
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington ISC_R_SUCCESS);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington RUNTIME_CHECK(isc_task_onshutdown(t2, shutdown_task, two) ==
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington ISC_R_SUCCESS);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington RUNTIME_CHECK(isc_task_onshutdown(t3, shutdown_task, three) ==
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington ISC_R_SUCCESS);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington printf("task 1: %p\n", t1);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington printf("task 2: %p\n", t2);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington printf("task 3: %p\n", t3);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington TIME_NOW(&now);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_interval_set(&interval, 2, 0);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington RUNTIME_CHECK(isc_timer_create(timgr, isc_timertype_once, NULL,
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington &interval, t2, timeout, two, &ti2) ==
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington ISC_R_SUCCESS);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
4523c3b371e0e8aa6451aefcf2ba593c4d16ea31Evan Hunt isc_interval_set(&interval, 1, 0);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington RUNTIME_CHECK(isc_timer_create(timgr, isc_timertype_ticker, NULL,
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington &interval, t1, tick, one, &ti1) ==
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington ISC_R_SUCCESS);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_interval_set(&interval, 10, 0);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington RUNTIME_CHECK(isc_time_add(&now, &interval, &expires) ==
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington ISC_R_SUCCESS);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_interval_set(&interval, 2, 0);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington RUNTIME_CHECK(isc_timer_create(timgr, isc_timertype_once, &expires,
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington &interval, t3, timeout, three, &ti3) ==
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington ISC_R_SUCCESS);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_task_detach(&t1);
4523c3b371e0e8aa6451aefcf2ba593c4d16ea31Evan Hunt isc_task_detach(&t2);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_task_detach(&t3);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington#ifndef WIN32
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington sleep(15);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington#else
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington Sleep(15000);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington#endif
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington printf("destroy\n");
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_timer_detach(&ti1);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_timer_detach(&ti2);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_timer_detach(&ti3);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington#ifndef WIN32
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington sleep(2);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington#else
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington Sleep(2000);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington#endif
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_timermgr_destroy(&timgr);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_taskmgr_destroy(&manager);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington printf("destroyed\n");
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington printf("Statistics for mctx1:\n");
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_mem_stats(mctx1, stdout);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington isc_mem_destroy(&mctx1);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington return (0);
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington}
1d92d8a2456b23842a649b6104c60a9d6ea25333Brian Wellington