aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-16 13:03:40 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-16 13:03:40 +0000
commitb9fb0c481e8e4539b77bb2307ad30fb612ea6901 (patch)
tree377d703a614f14dd1b968d539398bea3fe7ae136
parentbc739455ba9c773725c2b3a2918ee851d6c68ee2 (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: http://svn.digium.com/svn/asterisk/trunk@122926 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--include/asterisk/_private.h1
-rw-r--r--main/asterisk.c5
-rw-r--r--main/timing.c66
3 files changed, 72 insertions, 0 deletions
diff --git a/include/asterisk/_private.h b/include/asterisk/_private.h
index 215a56178..fe9aa2c04 100644
--- a/include/asterisk/_private.h
+++ b/include/asterisk/_private.h
@@ -37,6 +37,7 @@ void ast_autoservice_init(void); /*!< Provided by autoservice.c */
int ast_http_init(void); /*!< Provided by http.c */
int ast_http_reload(void); /*!< Provided by http.c */
int ast_tps_init(void); /*!< Provided by taskprocessor.c */
+int ast_timing_init(void); /*!< Provided by timing.c */
/*!
* \brief Reload asterisk modules.
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));
+}