Browse Source

Generate random data to check way too clever controllers

Suren A. Chilingaryan 11 years ago
parent
commit
40330dd43d
2 changed files with 44 additions and 13 deletions
  1. 43 12
      fwbench.c
  2. 1 1
      fwbench.sh

+ 43 - 12
fwbench.c

@@ -21,6 +21,7 @@
 #include "config.h"
 
 //#define USE_FIFO
+#define WRITE_RANDOM "/dev/frandom"
 #define WRITE_INTERVAL 1
 #define WRITE_SUMMARY 5
 #define DELTA_TOLERANCE 5
@@ -34,6 +35,7 @@
 const char *fifo_name = ".fifo";
 
 struct setup_s {
+    size_t uc;
     size_t width;
     size_t height;
     size_t bpp;
@@ -81,6 +83,7 @@ typedef enum {
     OPT_FPF = 'f',
     OPT_MISSING = 'm',
     OPT_QUIET = 'q',
+    OPT_UC = 'u',
     OPT_HELP = 'h'
 } options_t;
 
@@ -111,7 +114,8 @@ void Usage(int argc,  char* const argv[], const char *format, ...) {
 "   -n frames		- Number of frames to write\n"
 "   -g <width>x<height>	- Geometry [1024]\n"
 "   -g <pixels>		- Number of megapixels [0.7]\n"
-"   -m <percent>	        - Tolerable missing frames  [100%%]\n"
+"   -m <percent>		- Tolerable missing frames  [100%%]\n"
+"   -u <size>		- Use uncompressable data, repeating block (MB)\n"
 "   -q			- Quiete\n"
 "   -h			- Help\n"
 "\n\n",
@@ -184,6 +188,9 @@ static void set_fail_tolerance(setup_t *setup, double fail_rate) {
     setup->tolerance = fail_rate;
 }
 
+static void request_uncompressable_data(setup_t *setup, size_t uc) {
+    setup->uc = uc;
+}
 
 static int callback(setup_t *s, size_t result, void *buffer);
 
@@ -230,28 +237,46 @@ static void *run(setup_t *setup) {
     size_t i;
     struct timeval tv;
     size_t size = setup->width * setup->height * setup->bpp;
-    char buffer[size];
+    size_t pos = 0, mult = setup->uc / size;
+    char *buffer = malloc((mult + 1) * size);
     double interval = 1000000. / setup->fps, nextus;
     ssize_t tmp;
     size_t nexts;
 
+    g_assert(buffer);
+    
+    if (!mult) mult = 1;
+
+# ifdef WRITE_RANDOM
+    if (setup->uc) {
+	printf("Generating %zu MB of randomness...\n", mult * size / 1024 / 1024);
+	int rfd = open(WRITE_RANDOM, O_RDONLY);
+	g_assert(rfd >= 0);
+	read(rfd, buffer, mult * size);
+	close(rfd);
+    }
+# endif /* WRITE_RANDOM */
+
     setup->run_started = 1;
 
-#ifdef USE_FIFO
+# ifdef USE_FIFO
     int fd = open(fifo_name, O_WRONLY);
     g_assert(fd >= 0);
-#endif /* USE_FIFO */
+# endif /* USE_FIFO */
+
     gettimeofday(&tv, NULL); 
     nexts = tv.tv_sec;
     nextus = tv.tv_usec + interval;
     for (i = 0; i < setup->iters; i++) {
-#ifdef USE_FIFO
-	ssize_t res = write(fd, buffer, size);
+# ifdef USE_FIFO
+	ssize_t res = write(fd, buffer + pos * size, size);
 	g_assert(res == size);
-#else /* USE_FIFO */
-	callback(setup, size, buffer);
-#endif /* USE_FIFO */
+# else /* USE_FIFO */
+	callback(setup, size, buffer + pos * size);
+# endif /* USE_FIFO */
 
+	if ((++pos) == mult) pos = 0;
+	
 	tmp = ((size_t)round(nextus)) / 1000000;
 	nexts += tmp;
 	nextus -= tmp * 1000000;
@@ -263,10 +288,11 @@ static void *run(setup_t *setup) {
 	nextus += interval;
     }
 
-#ifdef USE_FIFO
+# ifdef USE_FIFO
     close(fd);
-#endif /* USE_FIFO */
+# endif /* USE_FIFO */
 
+    free(buffer);
 #endif /* USE_UFO_GENERATOR */
 
     return NULL;
@@ -400,6 +426,7 @@ int main(int argc, char* const argv[])
     size_t height = 768;
     size_t speed = 850;
     size_t size = 0;
+    size_t uc = 0;
     size_t run_time = 0;
     size_t iters = 0x7FFFFFFF;
     size_t fw_buffer = 0;
@@ -418,7 +445,7 @@ int main(int argc, char* const argv[])
 
 
 
-    while ((c = getopt(argc, argv, "hqo:s:t:r:n:g:f:m:b:")) != (unsigned char)-1) {
+    while ((c = getopt(argc, argv, "hqo:s:u:t:r:n:g:f:m:b:")) != (unsigned char)-1) {
 	switch (c) {
 	 case OPT_OUTPUT:
 	    out = optarg;
@@ -429,6 +456,9 @@ int main(int argc, char* const argv[])
          case OPT_SIZE:
             size = atol(optarg);
 	    break;
+	 case OPT_UC:
+	    uc = atol(optarg);
+	    break;
          case OPT_TIME:
             run_time = atol(optarg);
 	    break;
@@ -484,6 +514,7 @@ int main(int argc, char* const argv[])
     set_fail_tolerance(&setup, fail_rate);
     set_frames_per_file(&setup, fpf);
 
+    request_uncompressable_data(&setup, uc * 1024 * 1024);
 
     setup.fw = fastwriter_init(setup.fs, FASTWRITER_FLAGS_OVERWRITE);
     g_assert(setup.fw);

+ 1 - 1
fwbench.sh

@@ -34,7 +34,7 @@ speed=$((speed + 50))
 res=1
 while [ $res -ne 0 ]; do
     speed=$((speed - 50))
-    fwbench -b 1024 -m 0 -r $speed -s $size -o $out
+    fwbench -b 1024 -m 0 -u 512 -r $speed -s $size -o $out
     res=$?
     usleep 500000
 done