changeset 31190:8432358f2d32

Improve handling of cache process/thread hanging/being killed. In particular allow a single STRG+C to quite MPlayer.
author reimar
date Fri, 28 May 2010 17:26:31 +0000
parents edfa98275e04
children 4e3a73b14a05
files stream/cache2.c
diffstat 1 files changed, 23 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/stream/cache2.c	Fri May 28 16:57:16 2010 +0000
+++ b/stream/cache2.c	Fri May 28 17:26:31 2010 +0000
@@ -116,6 +116,8 @@
 static int cache_read(cache_vars_t *s, unsigned char *buf, int size)
 {
   int total=0;
+  int sleep_count = 0;
+  int last_max = s->max_filepos;
   while(size>0){
     int pos,newb,len;
 
@@ -124,10 +126,21 @@
     if(s->read_filepos>=s->max_filepos || s->read_filepos<s->min_filepos){
 	// eof?
 	if(s->eof) break;
+	if (s->max_filepos == last_max) {
+	    if (sleep_count++ == 5)
+	        mp_msg(MSGT_CACHE, MSGL_WARN, "Cache not filling!\n");
+	} else {
+	    last_max = s->max_filepos;
+	    sleep_count = 0;
+	}
 	// waiting for buffer fill...
-	usec_sleep(READ_USLEEP_TIME); // 10ms
+	if (stream_check_interrupt(READ_USLEEP_TIME)) {
+	    s->eof = 1;
+	    break;
+	}
 	continue; // try again...
     }
+    sleep_count = 0;
 
     newb=s->max_filepos-s->read_filepos; // new bytes in the buffer
     if(newb<min_fill) min_fill=newb; // statistics...
@@ -534,6 +547,7 @@
 }
 
 int cache_do_control(stream_t *stream, int cmd, void *arg) {
+  int sleep_count = 0;
   cache_vars_t* s = stream->cache_data;
   switch (cmd) {
     case STREAM_CTRL_SEEK_TO_TIME:
@@ -562,8 +576,14 @@
       return STREAM_UNSUPPORTED;
   }
   cache_wakeup(stream);
-  while (s->control != -1)
-    usec_sleep(CONTROL_SLEEP_TIME);
+  while (s->control != -1) {
+    if (sleep_count++ == 1000)
+      mp_msg(MSGT_CACHE, MSGL_WARN, "Cache no responding!\n");
+    if (stream_check_interrupt(CONTROL_SLEEP_TIME)) {
+      s->eof = 1;
+      return STREAM_UNSUPPORTED;
+    }
+  }
   switch (cmd) {
     case STREAM_CTRL_GET_TIME_LENGTH:
     case STREAM_CTRL_GET_CURRENT_TIME: