diff options
author | Douglas Schilling Landgraf <dougsland@redhat.com> | 2009-02-02 14:34:50 -0200 |
---|---|---|
committer | Douglas Schilling Landgraf <dougsland@redhat.com> | 2009-02-02 14:34:50 -0200 |
commit | 652bc6f0e4e31f82785b9a94e7b770b2ba310097 (patch) | |
tree | 568433b5f60f20acba9ab76c53e8fc260624595d /v4l2-apps/test | |
parent | c4c07d30ad15e9f9f25f4c530f01d2a158dcd1ec (diff) | |
download | mediapointer-dvb-s2-652bc6f0e4e31f82785b9a94e7b770b2ba310097.tar.gz mediapointer-dvb-s2-652bc6f0e4e31f82785b9a94e7b770b2ba310097.tar.bz2 |
v4l2-apps: Add stress buffer tool
From: Douglas Schilling Landgraf <dougsland@redhat.com>
Added stress buffer tool
Priority: normal
Signed-off-by: Douglas Schilling Landgraf <dougsland@redhat.com>
Diffstat (limited to 'v4l2-apps/test')
-rw-r--r-- | v4l2-apps/test/stress-buffer.c | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/v4l2-apps/test/stress-buffer.c b/v4l2-apps/test/stress-buffer.c new file mode 100644 index 000000000..60410c70c --- /dev/null +++ b/v4l2-apps/test/stress-buffer.c @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2009 Douglas Schilling Landgraf <dougsland@redhat.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2 of the License. + * + * This program 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 General Public License for more details. + * + * stress-buffer tool makes infinite calls using read() for + * any device specified by the command argument. + * + * The size of buffer shall be a random number from 0 up to 1000. + * + * Also is automatically created a file called: stats-M-D-Y-h-m-s.txt + * in current directory with data executed. + * + * The stress test is performed by several read() calls, + * and it helped to identify real issues like: + * + * - memory leaks + * - specific crashs that are rare and hard to reproduce + * + * To compile: + * gcc -o stress-buffer stress-buffer.c -Wall + * + * To execute: + * ./stress-buffer /dev/device_for_test + * + * Example: + * ./stress-buffer /dev/video0 + */ + +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <stdio.h> +#include <sys/ioctl.h> +#include <stdlib.h> +#include <time.h> +#include <string.h> +#include <errno.h> + +int main(int argc, char **argv) +{ + char buffer[1000]; + char fname[30]; + int fd, ret, magic_buffer_size, cnt = 0; + time_t t1, t2; + double dif; + time_t current; + struct tm *timep; + + FILE *fd_file; + + if (argc != 2) { + printf("Usage: %s /dev/device_to_test\n", argv[0]); + return -1; + } + + current = time(NULL); + timep = localtime(¤t); + + memset(fname, 0, sizeof(fname)); + + snprintf(fname, sizeof(fname), "stats-%.2d-%.2d-%.2d-%.2d-%.2d-%.2d.txt", + timep->tm_mon+1, timep->tm_mday, timep->tm_year + 1900, + timep->tm_hour, timep->tm_min, timep->tm_sec); + + fd_file = fopen(fname, "a+"); + if (!fd_file) { + perror("error opening file"); + return -1; + } + + srand(time(NULL)); + + while (1) { + + if (time(&t1) < 0) { + perror("time_t t1"); + fclose(fd_file); + return -1; + } + + fd = open(argv[1], O_RDONLY); + if (fd < 0) { + perror("error opening device"); + fclose(fd_file); + return -1; + } + + /* Random number 0 - 1000 */ + magic_buffer_size = rand() % sizeof(buffer); + + memset(buffer, 0, sizeof(buffer)); + + ret = access(fname, W_OK); + if (ret < 0) { + close(fd); + perror("Error"); + return -1; + } + + ret = read(fd, buffer, magic_buffer_size); + if (ret < 0) { + fprintf(fd_file, "[%s] error reading buffer - [%s]\n", + argv[1], strerror(errno)); + fflush(fd_file); + perror("error reading buffer from device"); + return -1; + } + + if (time(&t2) < 0) { + perror("time_t t2"); + fclose(fd_file); + return -1; + } + + dif = difftime(t2, t1); + + printf("Seconds: [%d] - Test Number: [%d] - Read [%d] bytes\n", + (int)dif, cnt, ret); + + fprintf(fd_file, "Seconds: [%.2f] - Test number: [%d] - Read [%d] bytes\n", + dif, cnt, ret); + + fflush(fd_file); + + cnt++; + + close(fd); + + } + return 0; +} |