📄 su_timer_test.c
字号:
/* * This file is part of the Sofia-SIP package * * Copyright (C) 2005 Nokia Corporation. * * Contact: Pekka Pessi <pekka.pessi@nokia.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * *//**@ingroup su_root_ex * @CFILE su_timer_test.c * * @brief Test program for su timers * * @author Pekka Pessi <Pekka.Pessi@nokia.com> * * @internal * * @date Created: Fri Oct 19 08:53:55 2001 pessi */#include "config.h"#include <stdlib.h>#include <string.h>#include <stdio.h>#include <signal.h>#include <assert.h>struct tester;#define SU_ROOT_MAGIC_T struct tester#define SU_INTERNAL_P su_root_t *#define SU_TIMER_ARG_T struct timing#include "sofia-sip/su.h"#include "sofia-sip/su_wait.h"#include "sofia-sip/su_log.h"struct timing{ int t_run; int t_times; su_time_t t_prev;};struct tester{ su_root_t *root; su_timer_t *t, *t1; unsigned times; void *sentinel;};voidprint_stamp(struct tester *x, su_timer_t *t, struct timing *ti){ su_time_t now = su_now(), prev = ti->t_prev; ti->t_prev = now; if (!ti->t_run) su_timer_set(t, print_stamp, ti); printf("timer interval %f\n", 1000 * su_time_diff(now, prev)); if (++ti->t_times >= 10) su_timer_reset(t);}voidprint_X(struct tester *x, su_timer_t *t1, struct timing *ti){ su_timer_set(t1, print_X, ti); putchar('X'); fflush(stdout);}su_msg_r intr_msg = SU_MSG_R_INIT;static RETSIGTYPE intr_handler(int signum){ su_msg_send(intr_msg);}static void test_break(struct tester *tester, su_msg_r msg, su_msg_arg_t *arg){ su_root_break(tester->root);}voidend_test(struct tester *tester, su_timer_t *t, struct timing *ti){ su_timer_destroy(t); su_timer_reset(tester->t); su_timer_reset(tester->t1); su_root_break(tester->root);}voidincrement(struct tester *tester, su_timer_t *t, struct timing *ti){ tester->times++; if ((void *)ti == (void*)tester->sentinel) su_root_break(tester->root);}voidusage(char const *name){ fprintf(stderr, "usage: %s [-1r] [interval]\n", name); exit(1);}/* * test su_timer functionality: * * Create a timer, executing print_stamp() in every 20 ms */int main(int argc, char *argv[]){ su_root_t *root; su_timer_t *t, *t1, *t_end; su_timer_t **timers; su_duration_t interval = 60; char *argv0 = argv[0]; char *s; int use_t1 = 0; su_time_t now, started; intptr_t i, N; struct timing timing[1] = {{ 0 }}; struct tester tester[1] = {{ 0 }}; while (argv[1] && argv[1][0] == '-') { char *o = argv[1] + 1; while (*o) if (*o == '1') o++, use_t1 = 1; else if (*o == 'r') o++, timing->t_run = 1; else break; if (o == argv[1] + 1) usage(argv0); argv++; } if (argv[1]) { interval = strtoul(argv[1], &s, 10); if (interval == 0 || s == argv[1]) usage(argv0); } su_init(); atexit(su_deinit); tester->root = root = su_root_create(tester); su_msg_create(intr_msg, su_root_task(root), su_root_task(root), test_break, 0); signal(SIGINT, intr_handler);#if HAVE_SIGPIPE signal(SIGPIPE, intr_handler); signal(SIGQUIT, intr_handler); signal(SIGHUP, intr_handler);#endif t = su_timer_create(su_root_task(root), interval); t1 = su_timer_create(su_root_task(root), 1); t_end = su_timer_create(su_root_task(root), 20 * interval); if (t == NULL || t1 == NULL || t_end == NULL) su_perror("su_timer_create"), exit(1); tester->t = t, tester->t1 = t1; timing->t_prev = su_now(); if (timing->t_run) su_timer_run(t, print_stamp, timing); else su_timer_set(t, print_stamp, timing); if (use_t1) su_timer_set(t1, print_X, NULL); su_timer_set(t_end, end_test, NULL); su_root_run(root); su_msg_destroy(intr_msg); su_timer_destroy(t); su_timer_destroy(t1); if (timing->t_times != 10) { fprintf(stderr, "%s: t expired %d times (expecting 10)\n", argv0, timing->t_times); return 1; } /* Insert 500 timers in order */ timers = calloc(N = 500, sizeof *timers); if (!timers) { perror("calloc"); exit(1); } now = started = su_now(); for (i = 0; i < N; i++) { t = su_timer_create(su_root_task(root), 1000); if (!t) { perror("su_timer_create"); exit(1); } if (++now.tv_usec == 0) ++now.tv_sec; su_timer_set_at(t, increment, (void *)i, now); timers[i] = t; } tester->sentinel = (void*)(i - 1); su_root_run(root); printf("Processing %u timers took %f millisec (%f expected)\n", i, su_time_diff(su_now(), started) * 1000, (double)i / 1000); for (i = 0; i < N; i++) { su_timer_destroy(timers[i]); } su_root_destroy(root); su_deinit(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -