changeset 30731:5a1ab9923c3a

Threaded cache fixes: do not free the stream_t struct twice on windows and make sure the cache thread quits also for streams without a control function (e.g. http).
author reimar
date Sat, 27 Feb 2010 21:02:44 +0000
parents f4fb7142e4c5
children 355873f64ce7
files stream/cache2.c
diffstat 1 files changed, 6 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/stream/cache2.c	Sat Feb 27 21:02:14 2010 +0000
+++ b/stream/cache2.c	Sat Feb 27 21:02:44 2010 +0000
@@ -222,14 +222,14 @@
 }
 
 static int cache_execute_control(cache_vars_t *s) {
-  int res = 1;
   static unsigned last;
-  if (!s->stream->control) {
+  int quit = s->control == -2;
+  if (quit || !s->stream->control) {
     s->stream_time_length = 0;
     s->control_new_pos = 0;
     s->control_res = STREAM_UNSUPPORTED;
     s->control = -1;
-    return res;
+    return !quit;
   }
   if (GetTimerMS() - last > 99) {
     double len;
@@ -239,7 +239,7 @@
       s->stream_time_length = 0;
     last = GetTimerMS();
   }
-  if (s->control == -1) return res;
+  if (s->control == -1) return 1;
   switch (s->control) {
     case STREAM_CTRL_GET_CURRENT_TIME:
     case STREAM_CTRL_SEEK_TO_TIME:
@@ -254,15 +254,13 @@
     case STREAM_CTRL_SET_ANGLE:
       s->control_res = s->stream->control(s->stream, s->control, &s->control_uint_arg);
       break;
-    case -2:
-      res = 0;
     default:
       s->control_res = STREAM_UNSUPPORTED;
       break;
   }
   s->control_new_pos = s->stream->pos;
   s->control = -1;
-  return res;
+  return 1;
 }
 
 static cache_vars_t* cache_init(int size,int sector){
@@ -314,9 +312,9 @@
   }
   if(!c) return;
 #if defined(__MINGW32__) || defined(PTHREAD_CACHE) || defined(__OS2__)
-  free(c->stream);
   free(c->buffer);
   c->buffer = NULL;
+  c->stream = NULL;
   free(s->cache_data);
 #else
   shmem_free(c->buffer,c->buffer_size);