diff options
author | Russell Bryant <russell@russellbryant.com> | 2008-06-16 13:03:40 +0000 |
---|---|---|
committer | Russell Bryant <russell@russellbryant.com> | 2008-06-16 13:03:40 +0000 |
commit | 96ea12126e2485fca439c0de887ed721a045e510 (patch) | |
tree | 377d703a614f14dd1b968d539398bea3fe7ae136 /main | |
parent | e27a98ce5a6ad53a78e24c83fdfcbf58653bde6a (diff) |
Add a "timing test" CLI command. It opens a timer and configures it for
50 ticks per second, and then counts to see how many ticks it actually
gets in a second.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@122926 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-rw-r--r-- | main/asterisk.c | 5 | ||||
-rw-r--r-- | main/timing.c | 66 |
2 files changed, 71 insertions, 0 deletions
diff --git a/main/asterisk.c b/main/asterisk.c index 0474d6375..a5a111cf3 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -3306,6 +3306,11 @@ int main(int argc, char *argv[]) ast_autoservice_init(); + if (ast_timing_init()) { + printf("%s", term_quit()); + exit(1); + } + if (load_modules(1)) { /* Load modules, pre-load only */ printf("%s", term_quit()); exit(1); diff --git a/main/timing.c b/main/timing.c index a1801fa68..e6b7c25c3 100644 --- a/main/timing.c +++ b/main/timing.c @@ -27,8 +27,13 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") +#include "asterisk/_private.h" + #include "asterisk/timing.h" #include "asterisk/lock.h" +#include "asterisk/cli.h" +#include "asterisk/utils.h" +#include "asterisk/time.h" AST_RWLOCK_DEFINE_STATIC(lock); @@ -192,3 +197,64 @@ enum ast_timing_event ast_timer_get_event(int handle) return result; } + +static char *timing_test(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) +{ + int fd, count = 0; + struct timeval start, end; + + switch (cmd) { + case CLI_INIT: + e->command = "timing test"; + e->usage = "Usage: timing test\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } + + ast_cli(a->fd, "Attempting to test a timer with 50 ticks per second ...\n"); + + if ((fd = ast_timer_open()) == -1) { + ast_cli(a->fd, "Failed to open timing fd\n"); + return CLI_FAILURE; + } + + start = ast_tvnow(); + + ast_timer_set_rate(fd, 50); + + while (ast_tvdiff_ms((end = ast_tvnow()), start) < 1000) { + int res; + struct pollfd pfd = { + .fd = fd, + .events = POLLIN | POLLPRI, + }; + + res = poll(&pfd, 1, 100); + + if (res == 1) { + count++; + ast_timer_ack(fd, 1); + } else if (!res) { + ast_cli(a->fd, "poll() timed out! This is bad.\n"); + } else if (errno != EAGAIN && errno != EINTR) { + ast_cli(a->fd, "poll() returned error: %s\n", strerror(errno)); + } + } + + ast_timer_close(fd); + + ast_cli(a->fd, "It has been %d milliseconds, and we got %d timer ticks\n", + ast_tvdiff_ms(end, start), count); + + return CLI_SUCCESS; +} + +static struct ast_cli_entry cli_timing[] = { + AST_CLI_DEFINE(timing_test, "Run a timing test"), +}; + +int ast_timing_init(void) +{ + return ast_cli_register_multiple(cli_timing, ARRAY_LEN(cli_timing)); +} |