changeset 31142:355302f83219

Optimize cache behaviour for the many-consecutive-seeks case.
author reimar
date Sun, 23 May 2010 21:53:48 +0000
parents 3b5e8cc5e128
children 48622875aecc
files stream/cache2.c
diffstat 1 files changed, 13 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/stream/cache2.c	Sun May 23 19:49:28 2010 +0000
+++ b/stream/cache2.c	Sun May 23 21:53:48 2010 +0000
@@ -23,6 +23,10 @@
 // TODO: seeking, data consistency checking
 
 #define READ_USLEEP_TIME 10000
+// These defines are used to reduce the cost of many succesive
+// seeks (e.g. when a file has no index) by spinning quickly at first.
+#define INITIAL_FILL_USLEEP_TIME 1000
+#define INITIAL_FILL_USLEEP_COUNT 10
 #define FILL_USLEEP_TIME 50000
 #define PREFILL_SLEEP_TIME 200
 #define CONTROL_SLEEP_TIME 0
@@ -432,10 +436,17 @@
 // cache thread mainloop:
   signal(SIGTERM,exit_sighandler); // kill
   signal(SIGUSR1, dummy_sighandler); // wakeup
+ {
+  int sleep_count = 0;
   do {
     if(!cache_fill(s)){
+         if (sleep_count < INITIAL_FILL_USLEEP_COUNT) {
+             sleep_count++;
+             usec_sleep(INITIAL_FILL_USLEEP_TIME);
+         } else
 	 usec_sleep(FILL_USLEEP_TIME); // idle
-    }
+    } else
+         sleep_count = 0;
 //	 cache_stats(s->cache_data);
   } while (cache_execute_control(s));
 #if defined(__MINGW32__) || defined(__OS2__)
@@ -446,6 +457,7 @@
   // make sure forked code never leaves this function
   exit(0);
 #endif
+  }
 }
 
 int cache_stream_fill_buffer(stream_t *s){