Witam,

Podsyłam łatkę, która trafiła kilka dni temu do CVS-u Xine. Poprawia problem, 
który ostatnio bardzo dał mi się we znaki, uniemożliwiając odtworzenie do 
końca dłuższej playlisty.

Do demuksowania mediów xine-lib używa osobnego wątku, który tworzony jest jako 
"joinable". Oznacza to, że niektóre zasoby wątku nie są zwalniane po 
zakończeniu jego pracy do momentu, aż inny wątek nie wykona na nim 
pthread_join. Błąd polega na tym, że pthread_join nie jest wykonywany na  
wątku demuksera, jeśli ten napotka koniec danych i samoistnie zakończy pracę. 
Aby to sprawdzić, wystarczy wziąść jakiś krótki plik audio/video, i utworzyć 
z niego długą playlistę. Proces xine powinien rosnąć ok.8MB na każdy plik.

Załączona łatka przenosi fatalną linijkę w demux.c - zerującą demux_thread i 
uniemożliwiającą wykonanie pthread_join - z wątku demuksera we właściwe 
miejsce (zaraz po join), oraz poprawia logikę sterującą w xine.c.

Nie stwierdziłem żadnych problemów po jej nałożeniu. Sądzę, że można spokojnie 
dorzucić ją na koniec do xine-lib.spec.

Pozdrawiam,
-- 
 Piotr Pawłow
 mailto:[EMAIL PROTECTED]
diff -urN xine-lib-1.0.old/src/xine-engine/demux.c xine-lib-1.0/src/xine-engine/demux.c
--- xine-lib-1.0.old/src/xine-engine/demux.c	2004-12-19 21:24:31.000000000 +0100
+++ xine-lib-1.0/src/xine-engine/demux.c	2005-03-09 00:23:42.748241544 +0100
@@ -315,7 +315,6 @@
   pthread_mutex_unlock (&stream->counter_lock);
   
   _x_handle_stream_end(stream, non_user);
-  stream->demux_thread = 0;
   return NULL;
 }
 
@@ -330,6 +329,8 @@
   stream->demux_action_pending = 0;
   
   if( !stream->demux_thread_running ) {
+
+    _x_assert(stream->demux_thread == 0);
     
     stream->demux_thread_running = 1;
     if ((err = pthread_create (&stream->demux_thread,
@@ -362,8 +363,10 @@
 
   lprintf ("joining thread %ld\n", stream->demux_thread );
   
-  if( stream->demux_thread )
+  if( stream->demux_thread ) {
     pthread_join (stream->demux_thread, &p);
+    stream->demux_thread = 0;
+  }
   
   /*
    * Wake up xine_play if it's waiting for a frame
diff -urN xine-lib-1.0.old/src/xine-engine/xine.c xine-lib-1.0/src/xine-engine/xine.c
--- xine-lib-1.0.old/src/xine-engine/xine.c	2004-12-20 22:22:21.000000000 +0100
+++ xine-lib-1.0/src/xine-engine/xine.c	2005-03-09 00:27:07.623095832 +0100
@@ -276,8 +276,7 @@
   if (stream->status == XINE_STATUS_STOP) {
     _x_demux_control_end(stream, 0);
     lprintf ("ignored\n");
-    return;
-  }
+  } else {
 
   /* make sure we're not in "paused" state */
   set_speed_internal (stream, XINE_FINE_SPEED_NORMAL);
@@ -285,16 +284,16 @@
   /* Don't change status if we're quitting */
   if (stream->status != XINE_STATUS_QUIT)
     stream->status = XINE_STATUS_STOP;
+  }
 
   /*
    * stop demux
    */
+  if (stream->demux_plugin && stream->demux_thread) {
   lprintf ("stopping demux\n");
-  if (stream->demux_plugin) {
     _x_demux_stop_thread( stream );
-    lprintf ("stop thread done\n");
-  }
   lprintf ("demux stopped\n");
+  }
   lprintf ("done\n");
 }
 
_______________________________________________
pld-devel-pl mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-devel-pl

Odpowiedź listem elektroniczym