shutdown_test.c revision ca41b452ede6feaa9d8739ec3cae19389a7b0d03
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley/*
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley * Copyright (C) 1998, 1999, 2000 Internet Software Consortium.
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley *
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley * Permission to use, copy, modify, and distribute this software for any
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley * purpose with or without fee is hereby granted, provided that the above
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley * copyright notice and this permission notice appear in all copies.
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley *
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley * SOFTWARE.
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley */
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley#include <config.h>
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley#include <stdio.h>
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley#include <stdlib.h>
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley#include <string.h>
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley#include <unistd.h>
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley#include <isc/assertions.h>
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley#include <isc/error.h>
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley#include <isc/mem.h>
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley#include <isc/task.h>
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley#include <isc/thread.h>
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley#include <isc/result.h>
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley#include <isc/timer.h>
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley#include <isc/mutex.h>
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley#include <isc/condition.h>
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley#include <isc/event.h>
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley#include <isc/eventclass.h>
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley#include <isc/app.h>
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halleytypedef struct {
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_mem_t * mctx;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_task_t * task;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_timer_t * timer;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley unsigned int ticks;
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley char name[16];
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley isc_boolean_t exiting;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_task_t * peer;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley} t_info;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley#define MAX_TASKS 3
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley#define T2_SHUTDOWNOK (ISC_EVENTCLASS(1024) + 0)
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley#define T2_SHUTDOWNDONE (ISC_EVENTCLASS(1024) + 1)
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley#define FOO_EVENT (ISC_EVENTCLASS(1024) + 2)
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halleystatic t_info tasks[MAX_TASKS];
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halleystatic unsigned int task_count;
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halleystatic isc_taskmgr_t * task_manager;
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halleystatic isc_timermgr_t * timer_manager;
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halleystatic void
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halleyt1_shutdown(isc_task_t *task, isc_event_t *event) {
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley t_info *info = event->arg;
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley printf("task %s (%p) t1_shutdown\n", info->name, task);
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley isc_task_detach(&info->task);
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley isc_event_free(&event);
df6699ac61e8cf5d576561210f58d3425680edd7Andreas Gustafsson}
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halleystatic void
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halleyt2_shutdown(isc_task_t *task, isc_event_t *event) {
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley t_info *info = event->arg;
800b03baba638ddb3f67cc0d2ad2e70042fe8525Mark Andrews
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley printf("task %s (%p) t2_shutdown\n", info->name, task);
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley info->exiting = ISC_TRUE;
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley isc_event_free(&event);
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley}
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halleystatic void
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halleyshutdown_action(isc_task_t *task, isc_event_t *event) {
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley t_info *info = event->arg;
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley isc_event_t *nevent;
800b03baba638ddb3f67cc0d2ad2e70042fe8525Mark Andrews
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley INSIST(event->type == ISC_TASKEVENT_SHUTDOWN);
726290e9d5b720b736fa39d9f7d92c2efb7d1f24Bob Halley
2504b0a58600c1156a6b829c816d13c58a069453Bob Halley printf("task %s (%p) shutdown\n", info->name, task);
38980568375a6505452550b5677104ab44291b66Bob Halley if (strcmp(info->name, "0") == 0) {
00e7d7a0e8529998c78b73371dc90fbf680b57efBob Halley isc_timer_detach(&info->timer);
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley nevent = isc_event_allocate(info->mctx, info, T2_SHUTDOWNOK,
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley t2_shutdown, &tasks[1],
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley sizeof *event);
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley RUNTIME_CHECK(nevent != NULL);
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley info->exiting = ISC_TRUE;
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley isc_task_sendanddetach(&info->peer, &nevent);
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley }
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley isc_event_free(&event);
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley}
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halleystatic void
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halleyfoo_event(isc_task_t *task, isc_event_t *event) {
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley printf("task(%p) foo\n", task);
6f44af1c8320e84d6b0c0c42bacadfe3020d9a91Mark Andrews isc_event_free(&event);
6f44af1c8320e84d6b0c0c42bacadfe3020d9a91Mark Andrews}
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halleystatic void
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halleytick(isc_task_t *task, isc_event_t *event)
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley{
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley t_info *info = event->arg;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_event_t *nevent;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley INSIST(event->type == ISC_TIMEREVENT_TICK);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley printf("task %s (%p) tick\n", info->name, task);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley info->ticks++;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley if (strcmp(info->name, "1") == 0) {
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley if (info->ticks == 10) {
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley RUNTIME_CHECK(isc_app_shutdown() == ISC_R_SUCCESS);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley } else if (info->ticks >= 15 && info->exiting) {
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_timer_detach(&info->timer);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_task_detach(&info->task);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley nevent = isc_event_allocate(info->mctx, info,
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley T2_SHUTDOWNDONE,
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley t1_shutdown, &tasks[0],
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley sizeof *event);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley RUNTIME_CHECK(nevent != NULL);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_task_send(info->peer, &nevent);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_task_detach(&info->peer);
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley }
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley } else if (strcmp(info->name, "foo") == 0) {
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley isc_timer_detach(&info->timer);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley nevent = isc_event_allocate(info->mctx, info,
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley FOO_EVENT,
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley foo_event, task,
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley sizeof *event);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley RUNTIME_CHECK(nevent != NULL);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_task_sendanddetach(&task, &nevent);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley }
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_event_free(&event);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley}
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halleystatic t_info *
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halleynew_task(isc_mem_t *mctx, char *name) {
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley t_info *ti;
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley isc_time_t expires;
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley isc_interval_t interval;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley RUNTIME_CHECK(task_count < MAX_TASKS);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley ti = &tasks[task_count];
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley ti->mctx = mctx;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley ti->task = NULL;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley ti->timer = NULL;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley ti->ticks = 0;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley if (name != NULL) {
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley INSIST(strlen(name) < sizeof ti->name);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley strcpy(ti->name, name);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley } else
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley sprintf(ti->name, "%d", task_count);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley RUNTIME_CHECK(isc_task_create(task_manager, mctx, 0, &ti->task) ==
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley ISC_R_SUCCESS);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley RUNTIME_CHECK(isc_task_onshutdown(ti->task, shutdown_action, ti) ==
f94f59d746daffc38356d0a019b64eb01d2341c0Bob Halley ISC_R_SUCCESS);
38980568375a6505452550b5677104ab44291b66Bob Halley
e3027d397f237ff018174fd17bf377a4a1890c6bBob Halley isc_time_settoepoch(&expires);
e3027d397f237ff018174fd17bf377a4a1890c6bBob Halley isc_interval_set(&interval, 1, 0);
e3027d397f237ff018174fd17bf377a4a1890c6bBob Halley RUNTIME_CHECK(isc_timer_create(timer_manager, isc_timertype_ticker,
e3027d397f237ff018174fd17bf377a4a1890c6bBob Halley &expires, &interval, ti->task,
38980568375a6505452550b5677104ab44291b66Bob Halley tick, ti, &ti->timer) ==
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley ISC_R_SUCCESS);
726290e9d5b720b736fa39d9f7d92c2efb7d1f24Bob Halley
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley task_count++;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley return (ti);
38980568375a6505452550b5677104ab44291b66Bob Halley}
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
38980568375a6505452550b5677104ab44291b66Bob Halleyint
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halleymain(int argc, char *argv[]) {
38980568375a6505452550b5677104ab44291b66Bob Halley unsigned int workers;
e3027d397f237ff018174fd17bf377a4a1890c6bBob Halley t_info *t1, *t2, *t3;
38980568375a6505452550b5677104ab44291b66Bob Halley isc_task_t *task;
38980568375a6505452550b5677104ab44291b66Bob Halley isc_mem_t *mctx, *mctx2;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
38980568375a6505452550b5677104ab44291b66Bob Halley RUNTIME_CHECK(isc_app_start() == ISC_R_SUCCESS);
38980568375a6505452550b5677104ab44291b66Bob Halley
38980568375a6505452550b5677104ab44291b66Bob Halley if (argc > 1)
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley workers = atoi(argv[1]);
19f08273e2592fa48608ec1ac5e021b4b3489030Bob Halley else
19f08273e2592fa48608ec1ac5e021b4b3489030Bob Halley workers = 2;
19f08273e2592fa48608ec1ac5e021b4b3489030Bob Halley printf("%d workers\n", workers);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley mctx = NULL;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley mctx2 = NULL;
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley RUNTIME_CHECK(isc_mem_create(0, 0, &mctx2) == ISC_R_SUCCESS);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley RUNTIME_CHECK(isc_taskmgr_create(mctx, workers, 0, &task_manager) ==
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley ISC_R_SUCCESS);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley RUNTIME_CHECK(isc_timermgr_create(mctx, &timer_manager) ==
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley ISC_R_SUCCESS);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
726290e9d5b720b736fa39d9f7d92c2efb7d1f24Bob Halley t1 = new_task(mctx, NULL);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley t2 = new_task(mctx2, NULL);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_task_attach(t2->task, &t1->peer);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_task_attach(t1->task, &t2->peer);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley /*
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley * Test run-triggered shutdown.
726290e9d5b720b736fa39d9f7d92c2efb7d1f24Bob Halley */
726290e9d5b720b736fa39d9f7d92c2efb7d1f24Bob Halley t3 = new_task(mctx2, "foo");
726290e9d5b720b736fa39d9f7d92c2efb7d1f24Bob Halley
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley /*
19f08273e2592fa48608ec1ac5e021b4b3489030Bob Halley * Test implicit shutdown.
38980568375a6505452550b5677104ab44291b66Bob Halley */
38980568375a6505452550b5677104ab44291b66Bob Halley task = NULL;
38980568375a6505452550b5677104ab44291b66Bob Halley RUNTIME_CHECK(isc_task_create(task_manager, mctx, 0, &task) ==
38980568375a6505452550b5677104ab44291b66Bob Halley ISC_R_SUCCESS);
38980568375a6505452550b5677104ab44291b66Bob Halley isc_task_detach(&task);
38980568375a6505452550b5677104ab44291b66Bob Halley
38980568375a6505452550b5677104ab44291b66Bob Halley /*
38980568375a6505452550b5677104ab44291b66Bob Halley * Test anti-zombie code.
38980568375a6505452550b5677104ab44291b66Bob Halley */
38980568375a6505452550b5677104ab44291b66Bob Halley RUNTIME_CHECK(isc_task_create(task_manager, mctx, 0, &task) ==
38980568375a6505452550b5677104ab44291b66Bob Halley ISC_R_SUCCESS);
38980568375a6505452550b5677104ab44291b66Bob Halley isc_task_detach(&task);
38980568375a6505452550b5677104ab44291b66Bob Halley
38980568375a6505452550b5677104ab44291b66Bob Halley RUNTIME_CHECK(isc_app_run() == ISC_R_SUCCESS);
38980568375a6505452550b5677104ab44291b66Bob Halley
38980568375a6505452550b5677104ab44291b66Bob Halley isc_taskmgr_destroy(&task_manager);
38980568375a6505452550b5677104ab44291b66Bob Halley isc_timermgr_destroy(&timer_manager);
19f08273e2592fa48608ec1ac5e021b4b3489030Bob Halley
800b03baba638ddb3f67cc0d2ad2e70042fe8525Mark Andrews printf("Statistics for mctx:\n");
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_mem_stats(mctx, stdout);
800b03baba638ddb3f67cc0d2ad2e70042fe8525Mark Andrews isc_mem_destroy(&mctx);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley printf("Statistics for mctx2:\n");
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_mem_stats(mctx2, stdout);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_mem_destroy(&mctx2);
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley
c56c5586b49ccddbaf7e2b5c6c06adee1c509253Bob Halley isc_app_finish();
800b03baba638ddb3f67cc0d2ad2e70042fe8525Mark Andrews
800b03baba638ddb3f67cc0d2ad2e70042fe8525Mark Andrews return (0);
19f08273e2592fa48608ec1ac5e021b4b3489030Bob Halley}
19f08273e2592fa48608ec1ac5e021b4b3489030Bob Halley