1/* 2 * Test program which measures the time it takes to schedule and 3 * remove timers. 4 * 5 * Copyright (C) 2013 by Open Source Routing. 6 * Copyright (C) 2013 by Internet Systems Consortium, Inc. ("ISC") 7 * 8 * This file is part of Quagga 9 * 10 * Quagga is free software; you can redistribute it and/or modify it 11 * under the terms of the GNU General Public License as published by the 12 * Free Software Foundation; either version 2, or (at your option) any 13 * later version. 14 * 15 * Quagga is distributed in the hope that it will be useful, but 16 * WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with Quagga; see the file COPYING. If not, write to the Free 22 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 23 * 02111-1307, USA. 24 */ 25#include <stdio.h> 26#include <unistd.h> 27 28#include <zebra.h> 29 30#include "thread.h" 31#include "pqueue.h" 32#include "prng.h" 33 34#define SCHEDULE_TIMERS 1000000 35#define REMOVE_TIMERS 500000 36 37struct thread_master *master; 38 39static int dummy_func(struct thread *thread) 40{ 41 return 0; 42} 43 44int main(int argc, char **argv) 45{ 46 struct prng *prng; 47 int i; 48 struct thread **timers; 49 struct timeval tv_start, tv_lap, tv_stop; 50 unsigned long t_schedule, t_remove; 51 52 master = thread_master_create(); 53 prng = prng_new(0); 54 timers = calloc(SCHEDULE_TIMERS, sizeof(*timers)); 55 56 /* create thread structures so they won't be allocated during the 57 * time measurement */ 58 for (i = 0; i < SCHEDULE_TIMERS; i++) 59 timers[i] = thread_add_timer_msec(master, dummy_func, NULL, 0); 60 for (i = 0; i < SCHEDULE_TIMERS; i++) 61 thread_cancel(timers[i]); 62 63 quagga_gettime(QUAGGA_CLK_MONOTONIC, &tv_start); 64 65 for (i = 0; i < SCHEDULE_TIMERS; i++) 66 { 67 long interval_msec; 68 69 interval_msec = prng_rand(prng) % (100 * SCHEDULE_TIMERS); 70 timers[i] = thread_add_timer_msec(master, dummy_func, 71 NULL, interval_msec); 72 } 73 74 quagga_gettime(QUAGGA_CLK_MONOTONIC, &tv_lap); 75 76 for (i = 0; i < REMOVE_TIMERS; i++) 77 { 78 int index; 79 80 index = prng_rand(prng) % SCHEDULE_TIMERS; 81 if (timers[index]) 82 thread_cancel(timers[index]); 83 timers[index] = NULL; 84 } 85 86 quagga_gettime(QUAGGA_CLK_MONOTONIC, &tv_stop); 87 88 t_schedule = 1000 * (tv_lap.tv_sec - tv_start.tv_sec); 89 t_schedule += (tv_lap.tv_usec - tv_start.tv_usec) / 1000; 90 91 t_remove = 1000 * (tv_stop.tv_sec - tv_lap.tv_sec); 92 t_remove += (tv_stop.tv_usec - tv_lap.tv_usec) / 1000; 93 94 printf("Scheduling %d random timers took %ld.%03ld seconds.\n", 95 SCHEDULE_TIMERS, t_schedule/1000, t_schedule%1000); 96 printf("Removing %d random timers took %ld.%03ld seconds.\n", 97 REMOVE_TIMERS, t_remove/1000, t_remove%1000); 98 fflush(stdout); 99 100 free(timers); 101 thread_master_free(master); 102 prng_free(prng); 103 return 0; 104} 105