Commit 2743c5c9 authored by Clément Stenac's avatar Clément Stenac

This should fix the locking problems with stats

parent 546b08b6
...@@ -1120,7 +1120,9 @@ static void End( input_thread_t * p_input ) ...@@ -1120,7 +1120,9 @@ static void End( input_thread_t * p_input )
input_EsOutDelete( p_input->p_es_out ); input_EsOutDelete( p_input->p_es_out );
#define CL_CO( c ) stats_CounterClean( p_input->counters.p_##c ) #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_bytes );
CL_CO( read_packets ); CL_CO( read_packets );
CL_CO( demux_read ); CL_CO( demux_read );
...@@ -1133,6 +1135,8 @@ static void End( input_thread_t * p_input ) ...@@ -1133,6 +1135,8 @@ static void End( input_thread_t * p_input )
CL_CO( decoded_audio) ; CL_CO( decoded_audio) ;
CL_CO( decoded_video ); CL_CO( decoded_video );
CL_CO( decoded_sub) ; CL_CO( decoded_sub) ;
vlc_mutex_unlock( &p_input->counters.counters_lock );
}
/* Close optional stream output instance */ /* Close optional stream output instance */
if( p_input->p_sout ) if( p_input->p_sout )
...@@ -1141,9 +1145,11 @@ static void End( input_thread_t * p_input ) ...@@ -1141,9 +1145,11 @@ static void End( input_thread_t * p_input )
vlc_object_find( p_input, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); vlc_object_find( p_input, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
vlc_value_t keep; vlc_value_t keep;
vlc_mutex_lock( &p_input->counters.counters_lock );
CL_CO( sout_sent_packets ); CL_CO( sout_sent_packets );
CL_CO( sout_sent_bytes ); CL_CO( sout_sent_bytes );
CL_CO( sout_send_bitrate ); 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 ) if( var_Get( p_input, "sout-keep", &keep ) >= 0 && keep.b_bool && p_pl )
{ {
......
...@@ -137,6 +137,7 @@ void stats_ComputeInputStats( input_thread_t *p_input, input_stats_t *p_stats ) ...@@ -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; if( !p_input->p_libvlc->b_stats ) return;
vlc_mutex_lock( &p_input->counters.counters_lock );
vlc_mutex_lock( &p_stats->lock ); vlc_mutex_lock( &p_stats->lock );
/* Input */ /* Input */
...@@ -181,10 +182,12 @@ void stats_ComputeInputStats( input_thread_t *p_input, input_stats_t *p_stats ) ...@@ -181,10 +182,12 @@ void stats_ComputeInputStats( input_thread_t *p_input, input_stats_t *p_stats )
&p_stats->i_lost_pictures ); &p_stats->i_lost_pictures );
vlc_mutex_unlock( &p_stats->lock ); vlc_mutex_unlock( &p_stats->lock );
vlc_mutex_unlock( &p_input->counters.counters_lock );
} }
void stats_ReinitInputStats( input_stats_t *p_stats ) 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->i_read_packets = p_stats->i_read_bytes =
p_stats->f_input_bitrate = p_stats->f_average_input_bitrate = p_stats->f_input_bitrate = p_stats->f_average_input_bitrate =
p_stats->i_demux_read_packets = p_stats->i_demux_read_bytes = p_stats->i_demux_read_packets = p_stats->i_demux_read_bytes =
...@@ -194,6 +197,7 @@ void stats_ReinitInputStats( input_stats_t *p_stats ) ...@@ -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_decoded_video = p_stats->i_decoded_audio =
p_stats->i_sent_bytes = p_stats->i_sent_packets = p_stats->f_send_bitrate p_stats->i_sent_bytes = p_stats->i_sent_packets = p_stats->f_send_bitrate
= 0; = 0;
vlc_mutex_unlock( &p_stats->lock );
} }
void stats_DumpInputStats( input_stats_t *p_stats ) 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 ) ...@@ -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; float f_in = 0, f_out = 0, f_demux = 0;
input_thread_t *p_input = (input_thread_t *) input_thread_t *p_input = (input_thread_t *)
p_list->p_values[i_index].p_object; 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 ); stats_GetFloat( p_obj, p_input->counters.p_input_bitrate, &f_in );
if( p_input->counters.p_sout_send_bitrate ) if( p_input->counters.p_sout_send_bitrate )
stats_GetFloat( p_obj, p_input->counters.p_sout_send_bitrate, stats_GetFloat( p_obj, p_input->counters.p_sout_send_bitrate,
&f_out ); &f_out );
stats_GetFloat( p_obj, p_input->counters.p_demux_bitrate, stats_GetFloat( p_obj, p_input->counters.p_demux_bitrate,
&f_demux ); &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; f_total_in += f_in; f_total_out += f_out;f_total_demux += f_demux;
} }
p_stats->f_input_bitrate = f_total_in; 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 ) ...@@ -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 ) 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; 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, ...@@ -276,7 +284,11 @@ void __stats_TimerStart( vlc_object_t *p_obj, const char *psz_name,
counter_sample_t *p_sample; counter_sample_t *p_sample;
p_counter = stats_CounterCreate( p_obj->p_libvlc, VLC_VAR_TIME, p_counter = stats_CounterCreate( p_obj->p_libvlc, VLC_VAR_TIME,
STATS_TIMER ); 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->psz_name = strdup( psz_name );
p_counter->i_id = i_id; p_counter->i_id = i_id;
INSERT_ELEM( p_obj->p_libvlc->pp_timers, p_obj->p_libvlc->i_timers, 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, ...@@ -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 ) if( p_counter->pp_samples[0]->value.b_bool == VLC_TRUE )
{ {
msg_Warn( p_obj, "timer %s was already started !", psz_name ); msg_Warn( p_obj, "timer %s was already started !", psz_name );
vlc_mutex_unlock( &p_obj->p_libvlc->timer_lock );
return; return;
} }
p_counter->pp_samples[0]->value.b_bool = VLC_TRUE; 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 ) ...@@ -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 ); vlc_mutex_unlock( &p_obj->p_libvlc->timer_lock );
} }
void __stats_TimersDumpAll( vlc_object_t *p_obj ) void __stats_TimersDumpAll( vlc_object_t *p_obj )
{ {
int i; int i;
...@@ -378,15 +390,15 @@ void stats_CounterClean( counter_t *p_c ) ...@@ -378,15 +390,15 @@ void stats_CounterClean( counter_t *p_c )
if( p_c ) if( p_c )
{ {
i = p_c->i_samples - 1 ; i = p_c->i_samples - 1 ;
while( i >= 0) while( i >= 0 )
{ {
counter_sample_t *p_s = p_c->pp_samples[i]; counter_sample_t *p_s = p_c->pp_samples[i];
REMOVE_ELEM( p_c->pp_samples, p_c->i_samples, i ); REMOVE_ELEM( p_c->pp_samples, p_c->i_samples, i );
free( p_s ); free( p_s );
i--; i--;
} }
if( p_c->psz_name ) free( p_c->psz_name ); if( p_c->psz_name ) free( p_c->psz_name );
free( p_c ); free( p_c );
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment