task_test.c revision 0ab04d76c8b47210c91cb960854a17b28e2daa35
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson/*
7d32c065c7bb56f281651ae3dd2888f32ce4f1d9Bob Halley * Copyright (C) 1998 Internet Software Consortium.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson * Permission to use, copy, modify, and distribute this software for any
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson * purpose with or without fee is hereby granted, provided that the above
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson * copyright notice and this permission notice appear in all copies.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
15a44745412679c30a6d022733925af70a38b715David Lawrence * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
15a44745412679c30a6d022733925af70a38b715David Lawrence * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
15a44745412679c30a6d022733925af70a38b715David Lawrence * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
15a44745412679c30a6d022733925af70a38b715David Lawrence * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
15a44745412679c30a6d022733925af70a38b715David Lawrence * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15a44745412679c30a6d022733925af70a38b715David Lawrence * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
15a44745412679c30a6d022733925af70a38b715David Lawrence * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
15a44745412679c30a6d022733925af70a38b715David Lawrence * SOFTWARE.
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson */
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson
ea419adc4eca4c3e44f2c282035b5dce6b795fe2Andreas Gustafsson#include <config.h>
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson#include <stdio.h>
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson#include <stdlib.h>
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson#include <unistd.h>
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence
364a82f7c25b62967678027043425201a5e5171aBob Halley#include <isc/assertions.h>
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson#include <isc/mem.h>
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson#include <isc/task.h>
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson#include <isc/thread.h>
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson#include <isc/result.h>
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#include <isc/timer.h>
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafssonisc_memctx_t *mctx = NULL;
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrencestatic void
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrencemy_callback(isc_task_t *task, isc_event_t *event)
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence{
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson int i, j;
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson char *name = event->arg;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson j = 0;
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson for (i = 0; i < 1000000; i++)
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson j += 100;
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson printf("task %s (%p): %d\n", name, task, j);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson isc_event_free(&event);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson}
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafssonstatic void
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafssonmy_shutdown(isc_task_t *task, isc_event_t *event) {
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence char *name = event->arg;
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence printf("shutdown %s (%p)\n", name, task);
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence isc_event_free(&event);
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence}
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafssonstatic void
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafssonmy_tick(isc_task_t *task, isc_event_t *event)
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson{
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson char *name = event->arg;
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson printf("task %p tick %s\n", task, name);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson isc_event_free(&event);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson}
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafssonvoid
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafssonmain(int argc, char *argv[]) {
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson isc_taskmgr_t *manager = NULL;
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson isc_task_t *t1 = NULL, *t2 = NULL;
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson isc_task_t *t3 = NULL, *t4 = NULL;
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson isc_event_t *event;
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson unsigned int workers;
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson isc_timermgr_t *timgr;
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence isc_timer_t *ti1, *ti2;
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson struct isc_time absolute;
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson struct isc_interval interval;
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson if (argc > 1)
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson workers = atoi(argv[1]);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson else
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson workers = 2;
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson printf("%d workers\n", workers);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson INSIST(isc_memctx_create(0, 0, &mctx) == ISC_R_SUCCESS);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson INSIST(isc_taskmgr_create(mctx, workers, 0, &manager) ==
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson ISC_R_SUCCESS);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson INSIST(isc_task_create(manager, 0, &t1) == ISC_R_SUCCESS);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson INSIST(isc_task_create(manager, 0, &t2) == ISC_R_SUCCESS);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson INSIST(isc_task_create(manager, 0, &t3) == ISC_R_SUCCESS);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson INSIST(isc_task_create(manager, 0, &t4) == ISC_R_SUCCESS);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson INSIST(isc_task_onshutdown(t1, my_shutdown, "1") == ISC_R_SUCCESS);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson INSIST(isc_task_onshutdown(t2, my_shutdown, "2") == ISC_R_SUCCESS);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson INSIST(isc_task_onshutdown(t3, my_shutdown, "3") == ISC_R_SUCCESS);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson INSIST(isc_task_onshutdown(t4, my_shutdown, "4") == ISC_R_SUCCESS);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson timgr = NULL;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence INSIST(isc_timermgr_create(mctx, &timgr) == ISC_R_SUCCESS);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson ti1 = NULL;
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson isc_time_settoepoch(&absolute);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence isc_interval_set(&interval, 1, 0);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson INSIST(isc_timer_create(timgr, isc_timertype_ticker,
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence &absolute, &interval,
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson t1, my_tick, "foo", &ti1) == ISC_R_SUCCESS);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson ti2 = NULL;
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson isc_time_settoepoch(&absolute);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson isc_interval_set(&interval, 1, 0);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson INSIST(isc_timer_create(timgr, isc_timertype_ticker,
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson &absolute, &interval,
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson t2, my_tick, "bar", &ti2) == ISC_R_SUCCESS);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson printf("task 1 = %p\n", t1);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson printf("task 2 = %p\n", t2);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson sleep(2);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson event = isc_event_allocate(mctx, (void *)main, 1, my_callback, "1",
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson sizeof *event);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson isc_task_send(t1, &event);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson event = isc_event_allocate(mctx, (void *)main, 1, my_callback, "1",
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson sizeof *event);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson isc_task_send(t1, &event);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson event = isc_event_allocate(mctx, (void *)main, 1, my_callback, "1",
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson sizeof *event);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson isc_task_send(t1, &event);
7693d4de8fca501dfe6989a7f30d8d3c86fe096aAndreas Gustafsson event = isc_event_allocate(mctx, (void *)main, 1, my_callback, "1",
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson sizeof *event);
fd0bc40a2580299d20ae212d89bda13862d78b3aAndreas Gustafsson isc_task_send(t1, &event);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson event = isc_event_allocate(mctx, (void *)main, 1, my_callback, "1",
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson sizeof *event);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson isc_task_send(t1, &event);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson event = isc_event_allocate(mctx, (void *)main, 1, my_callback, "1",
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson sizeof *event);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_task_send(t1, &event);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson event = isc_event_allocate(mctx, (void *)main, 1, my_callback, "1",
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson sizeof *event);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_task_send(t1, &event);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson event = isc_event_allocate(mctx, (void *)main, 1, my_callback, "1",
d8d0c5b1bc97ac0f07e35a31b58ced80ce613c55David Lawrence sizeof *event);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_task_send(t1, &event);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence event = isc_event_allocate(mctx, (void *)main, 1, my_callback, "1",
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson sizeof *event);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_task_send(t1, &event);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson event = isc_event_allocate(mctx, (void *)main, 1, my_callback, "2",
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence sizeof *event);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_task_send(t2, &event);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson event = isc_event_allocate(mctx, (void *)main, 1, my_callback, "3",
fd0bc40a2580299d20ae212d89bda13862d78b3aAndreas Gustafsson sizeof *event);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence isc_task_send(t3, &event);
fd0bc40a2580299d20ae212d89bda13862d78b3aAndreas Gustafsson event = isc_event_allocate(mctx, (void *)main, 1, my_callback, "4",
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson sizeof *event);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_task_send(t4, &event);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence event = isc_event_allocate(mctx, (void *)main, 1, my_callback, "2",
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson sizeof *event);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_task_send(t2, &event);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson event = isc_event_allocate(mctx, (void *)main, 1, my_callback, "3",
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson sizeof *event);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_task_send(t3, &event);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence event = isc_event_allocate(mctx, (void *)main, 1, my_callback, "4",
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson sizeof *event);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson isc_task_send(t4, &event);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson isc_task_purge(t3, NULL, 0);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson isc_task_detach(&t1);
a1747570262ed336c213aaf6bd31bc91993a46deAndreas Gustafsson isc_task_detach(&t2);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_task_detach(&t3);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_task_detach(&t4);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson sleep(10);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson printf("destroy\n");
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_timer_detach(&ti1);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence isc_timer_detach(&ti2);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_timermgr_destroy(&timgr);
d8d0c5b1bc97ac0f07e35a31b58ced80ce613c55David Lawrence isc_taskmgr_destroy(&manager);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson printf("destroyed\n");
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_mem_stats(mctx, stdout);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson isc_memctx_destroy(&mctx);
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson}
6017f424ee3c02d7f22132c77576ea38542fa949Andreas Gustafsson