[vlc-devel] commit: MMSTU: suspend the keep-alive thread while not paused ( Rémi Denis-Courmont )

git version control git at videolan.org
Mon Sep 8 22:14:04 CEST 2008


vlc | branch: master | Rémi Denis-Courmont <rdenis at simphalempin.com> | Mon Sep  8 22:58:30 2008 +0300| [f6ef7116fb262134293aa544f6f90a439d023a48] | committer: Rémi Denis-Courmont 

MMSTU: suspend the keep-alive thread while not paused

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f6ef7116fb262134293aa544f6f90a439d023a48
---

 include/vlc_mtime.h        |    2 +-
 modules/access/mms/mmstu.c |   90 ++++++++++++++++++++++++++------------------
 modules/access/mms/mmstu.h |   18 ++++-----
 3 files changed, 62 insertions(+), 48 deletions(-)

diff --git a/include/vlc_mtime.h b/include/vlc_mtime.h
index e51c639..2e6780f 100644
--- a/include/vlc_mtime.h
+++ b/include/vlc_mtime.h
@@ -74,7 +74,7 @@ VLC_EXPORT( char *,  secstotimestr, ( char *psz_buffer, int secs ) );
 # else
 #  define VLC_HARD_MIN_SLEEP 0
 # endif
-#define VLC_SOFT_MIN_SLEEP 29000000
+#define VLC_SOFT_MIN_SLEEP 9000000
 
 static
 __attribute__((unused))
diff --git a/modules/access/mms/mmstu.c b/modules/access/mms/mmstu.c
index 597dcbd..99f4978 100644
--- a/modules/access/mms/mmstu.c
+++ b/modules/access/mms/mmstu.c
@@ -33,6 +33,7 @@
 #include <vlc_access.h>
 
 #include <errno.h>
+#include <assert.h>
 
 #ifdef HAVE_UNISTD_H
 #   include <unistd.h>
@@ -92,7 +93,7 @@ static int  mms_HeaderMediaRead( access_t *, int );
 
 static int  mms_ReceivePacket( access_t * );
 
-static void* KeepAliveThread( vlc_object_t *p_this );
+static void* KeepAliveThread( void * );
 
 int  MMSTUOpen( access_t *p_access )
 {
@@ -203,13 +204,17 @@ int  MMSTUOpen( access_t *p_access )
     }
 
     /* Keep the connection alive when paused */
-    p_sys->p_keepalive_thread = vlc_object_create( p_access, sizeof( mmstu_keepalive_thread_t ) );
-    p_sys->p_keepalive_thread->p_access = p_access;
-    p_sys->p_keepalive_thread->b_paused = false;
-    p_sys->p_keepalive_thread->b_thread_error = false;
-    if( vlc_thread_create( p_sys->p_keepalive_thread, "mmstu keepalive thread", KeepAliveThread,
-                           VLC_THREAD_PRIORITY_LOW, false) )
-        p_sys->p_keepalive_thread->b_thread_error = true;
+    p_sys->p_keepalive = malloc( sizeof( mmstu_keepalive_t ) );
+    p_sys->p_keepalive->p_access = p_access;
+    vlc_mutex_init( &p_sys->p_keepalive->lock );
+    p_sys->p_keepalive->b_paused = false;
+    if( vlc_clone( &p_sys->p_keepalive->handle, KeepAliveThread,
+                   p_sys->p_keepalive, VLC_THREAD_PRIORITY_LOW ) )
+    {
+        vlc_mutex_destroy( &p_sys->p_keepalive->lock );
+        free( p_sys->p_keepalive );
+        p_sys->p_keepalive = NULL;
+    }
 
     return VLC_SUCCESS;
 }
@@ -221,10 +226,13 @@ void MMSTUClose( access_t *p_access )
 {
     access_sys_t *p_sys = p_access->p_sys;
 
-    vlc_object_kill( p_sys->p_keepalive_thread );
-    if( !p_sys->p_keepalive_thread->b_thread_error )
-        vlc_thread_join( p_sys->p_keepalive_thread );
-    vlc_object_release( p_sys->p_keepalive_thread );
+    if( p_sys->p_keepalive )
+    {
+        vlc_cancel( p_sys->p_keepalive->handle );
+        vlc_join( p_sys->p_keepalive->handle, NULL );
+        vlc_mutex_destroy( &p_sys->p_keepalive->lock );
+        free( p_sys->p_keepalive );
+    }
 
     /* close connection with server */
     MMSClose( p_access );
@@ -302,19 +310,15 @@ static int Control( access_t *p_access, int i_query, va_list args )
         case ACCESS_SET_PAUSE_STATE:
             b_bool = (bool)va_arg( args, int );
             if( b_bool )
-            {
                 MMSStop( p_access );
-                vlc_object_lock( p_sys->p_keepalive_thread );
-                p_sys->p_keepalive_thread->b_paused = true;
-                vlc_object_unlock( p_sys->p_keepalive_thread );
-            }
             else
-            {
                 Seek( p_access, p_access->info.i_pos );
-                vlc_object_lock( p_sys->p_keepalive_thread );
-                p_sys->p_keepalive_thread->b_paused = false;
-                vlc_object_unlock( p_sys->p_keepalive_thread );
-            }
+
+            vlc_mutex_lock( &p_sys->p_keepalive->lock );
+            p_sys->p_keepalive->b_paused = b_bool;
+            if( b_bool )
+                vlc_cond_signal( &p_sys->p_keepalive->wait );
+            vlc_mutex_unlock( &p_sys->p_keepalive->lock );
             break;
 
         case ACCESS_GET_TITLE_INFO:
@@ -1599,26 +1603,38 @@ static int mms_HeaderMediaRead( access_t *p_access, int i_type )
     return -1;
 }
 
-static void* KeepAliveThread( vlc_object_t *p_this )
+static void* KeepAliveThread( void *p_data )
 {
-    mmstu_keepalive_thread_t *p_thread = (mmstu_keepalive_thread_t *) p_this;
+    mmstu_keepalive_t *p_thread = (mmstu_keepalive_t *) p_data;
     access_t *p_access = p_thread->p_access;
-    bool b_paused;
-    bool b_was_paused = false;
 
-    vlc_object_lock( p_thread );
-    while( vlc_object_alive( p_thread) )
+    vlc_mutex_lock( &p_thread->lock );
+    mutex_cleanup_push( &p_thread->lock );
+
+    for( ;; )
     {
-        int canc = vlc_savecancel ();
-        b_paused = p_thread->b_paused;
+        /* Do nothing until paused (if ever) */
+        while( !p_thread->b_paused )
+            vlc_cond_wait( &p_thread->wait, &p_thread->lock );
 
-        if( b_paused && b_was_paused )
-                mms_CommandSend( p_access, 0x1b, 0, 0, NULL, 0 );
+        do
+        {
+            int canc;
+
+            /* Send keep-alive every ten seconds */
+            vlc_mutex_unlock( &p_thread->lock );
+            canc = vlc_savecancel();
 
-        b_was_paused = b_paused;
-        vlc_object_timedwait( p_thread, mdate() + 10000000 );
-        vlc_restorecancel (canc);
+            mms_CommandSend( p_access, 0x1b, 0, 0, NULL, 0 );
+
+            vlc_restorecancel( canc );
+            vlc_mutex_lock( &p_thread->lock );
+
+            msleep( 10 * CLOCK_FREQ );
+        }
+        while( p_thread->b_paused );
     }
-    vlc_object_unlock( p_thread );
-    return NULL;
+
+    vlc_cleanup_pop();
+    assert(0);
 }
diff --git a/modules/access/mms/mmstu.h b/modules/access/mms/mmstu.h
index 527c14c..7252665 100644
--- a/modules/access/mms/mmstu.h
+++ b/modules/access/mms/mmstu.h
@@ -34,8 +34,6 @@
 
 #define MMS_BUFFER_SIZE 100000
 
-typedef struct mmstu_keepalive_thread_t mmstu_keepalive_thread_t;
-
 struct access_sys_t
 {
     int         i_proto;        /* MMS_PROTO_TCP, MMS_PROTO_UDP */
@@ -96,17 +94,17 @@ struct access_sys_t
     /* misc */
     bool  b_seekable;
 
-    mmstu_keepalive_thread_t *p_keepalive_thread;
     vlc_mutex_t lock_netwrite;
+    struct mmstu_keepalive_t *p_keepalive;
 };
 
-struct mmstu_keepalive_thread_t
+typedef struct mmstu_keepalive_t
 {
-    VLC_COMMON_MEMBERS
-
-    access_t *p_access;
-    bool b_paused;
-    bool b_thread_error;
-};
+    access_t    *p_access;
+    vlc_mutex_t  lock;
+    vlc_cond_t   wait;
+    vlc_thread_t handle;
+    bool         b_paused;
+} mmstu_keepalive_t;
 
 #endif




More information about the vlc-devel mailing list