]> git.sesse.net Git - vlc/commitdiff
This should fix the locking problems with stats
authorClément Stenac <zorglub@videolan.org>
Sun, 6 Aug 2006 12:25:52 +0000 (12:25 +0000)
committerClément Stenac <zorglub@videolan.org>
Sun, 6 Aug 2006 12:25:52 +0000 (12:25 +0000)
src/input/input.c
src/misc/stats.c

index 7016824ee8192e684a819aa8f1565b9bc58e5889..138ea45a7cffb0d87cc35c7a01a37371bceb4007 100644 (file)
@@ -1120,7 +1120,9 @@ static void End( input_thread_t * p_input )
         input_EsOutDelete( p_input->p_es_out );
 
 #define CL_CO( c ) stats_CounterClean( p_input->counters.p_##c )
-
+    if( p_input->p_libvlc->b_stats )
+    {
+        vlc_mutex_lock( &p_input->counters.counters_lock );
         CL_CO( read_bytes );
         CL_CO( read_packets );
         CL_CO( demux_read );
@@ -1133,6 +1135,8 @@ static void End( input_thread_t * p_input )
         CL_CO( decoded_audio) ;
         CL_CO( decoded_video );
         CL_CO( decoded_sub) ;
+        vlc_mutex_unlock( &p_input->counters.counters_lock );
+    }
 
     /* Close optional stream output instance */
     if( p_input->p_sout )
@@ -1141,9 +1145,11 @@ static void End( input_thread_t * p_input )
             vlc_object_find( p_input, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
         vlc_value_t keep;
 
+        vlc_mutex_lock( &p_input->counters.counters_lock );
         CL_CO( sout_sent_packets );
         CL_CO( sout_sent_bytes );
         CL_CO( sout_send_bitrate );
+        vlc_mutex_unlock( &p_input->counters.counters_lock );
 
         if( var_Get( p_input, "sout-keep", &keep ) >= 0 && keep.b_bool && p_pl )
         {
index d4f0beae06c96db4b3eb20c8c5229a0fff3bd88a..6fe487e90333e7eb3f62e8ae600b18fb5c05a2bd 100644 (file)
@@ -137,6 +137,7 @@ void stats_ComputeInputStats( input_thread_t *p_input, input_stats_t *p_stats )
 {
     if( !p_input->p_libvlc->b_stats ) return;
 
+    vlc_mutex_lock( &p_input->counters.counters_lock );
     vlc_mutex_lock( &p_stats->lock );
 
     /* Input */
@@ -181,10 +182,12 @@ void stats_ComputeInputStats( input_thread_t *p_input, input_stats_t *p_stats )
                       &p_stats->i_lost_pictures );
 
     vlc_mutex_unlock( &p_stats->lock );
+    vlc_mutex_unlock( &p_input->counters.counters_lock );
 }
 
 void stats_ReinitInputStats( input_stats_t *p_stats )
 {
+    vlc_mutex_lock( &p_stats->lock );
     p_stats->i_read_packets = p_stats->i_read_bytes =
     p_stats->f_input_bitrate = p_stats->f_average_input_bitrate =
     p_stats->i_demux_read_packets = p_stats->i_demux_read_bytes =
@@ -194,6 +197,7 @@ void stats_ReinitInputStats( input_stats_t *p_stats )
     p_stats->i_decoded_video = p_stats->i_decoded_audio =
     p_stats->i_sent_bytes = p_stats->i_sent_packets = p_stats->f_send_bitrate
      = 0;
+    vlc_mutex_unlock( &p_stats->lock );
 }
 
 void stats_DumpInputStats( input_stats_t *p_stats  )
@@ -232,12 +236,14 @@ void __stats_ComputeGlobalStats( vlc_object_t *p_obj, global_stats_t *p_stats )
             float f_in = 0, f_out = 0, f_demux = 0;
             input_thread_t *p_input = (input_thread_t *)
                              p_list->p_values[i_index].p_object;
+            vlc_mutex_lock( &p_input->counters.counters_lock );
             stats_GetFloat( p_obj, p_input->counters.p_input_bitrate, &f_in );
             if( p_input->counters.p_sout_send_bitrate )
                 stats_GetFloat( p_obj, p_input->counters.p_sout_send_bitrate,
                                     &f_out );
             stats_GetFloat( p_obj, p_input->counters.p_demux_bitrate,
                                 &f_demux );
+            vlc_mutex_unlock( &p_input->counters.counters_lock );
             f_total_in += f_in; f_total_out += f_out;f_total_demux += f_demux;
         }
         p_stats->f_input_bitrate = f_total_in;
@@ -251,7 +257,9 @@ void __stats_ComputeGlobalStats( vlc_object_t *p_obj, global_stats_t *p_stats )
 
 void stats_ReinitGlobalStats( global_stats_t *p_stats )
 {
+    vlc_mutex_lock( &p_stats->lock );
     p_stats->f_input_bitrate = p_stats->f_output_bitrate = 0.0;
+    vlc_mutex_unlock( &p_stats->lock );
 }
 
 
@@ -276,7 +284,11 @@ void __stats_TimerStart( vlc_object_t *p_obj, const char *psz_name,
         counter_sample_t *p_sample;
         p_counter = stats_CounterCreate( p_obj->p_libvlc, VLC_VAR_TIME,
                                          STATS_TIMER );
-        if( !p_counter ) return;
+        if( !p_counter )
+        {
+            vlc_mutex_unlock( &p_obj->p_libvlc->timer_lock );
+            return;
+        }
         p_counter->psz_name = strdup( psz_name );
         p_counter->i_id = i_id;
         INSERT_ELEM( p_obj->p_libvlc->pp_timers, p_obj->p_libvlc->i_timers,
@@ -296,6 +308,7 @@ void __stats_TimerStart( vlc_object_t *p_obj, const char *psz_name,
     if( p_counter->pp_samples[0]->value.b_bool == VLC_TRUE )
     {
         msg_Warn( p_obj, "timer %s was already started !", psz_name );
+        vlc_mutex_unlock( &p_obj->p_libvlc->timer_lock );
         return;
     }
     p_counter->pp_samples[0]->value.b_bool = VLC_TRUE;
@@ -348,7 +361,6 @@ void __stats_TimerDump( vlc_object_t *p_obj, unsigned int i_id )
     vlc_mutex_unlock( &p_obj->p_libvlc->timer_lock );
 }
 
-
 void __stats_TimersDumpAll( vlc_object_t *p_obj )
 {
     int i;
@@ -378,15 +390,15 @@ void stats_CounterClean( counter_t *p_c )
     if( p_c )
     {
         i = p_c->i_samples - 1 ;
-        while( i >= 0)
+        while( i >= 0 )
         {
             counter_sample_t *p_s = p_c->pp_samples[i];
             REMOVE_ELEM( p_c->pp_samples, p_c->i_samples, i );
             free( p_s );
             i--;
         }
-    if( p_c->psz_name ) free( p_c->psz_name );
-    free( p_c );
+        if( p_c->psz_name ) free( p_c->psz_name );
+        free( p_c );
     }
 }