Commit 26d5b738 authored by Clément Stenac's avatar Clément Stenac

* Avoid useless stats_Get calls

* Reduce vlc_object_find calls
parent f8cac3e1
...@@ -4,6 +4,7 @@ Changes between 0.8.4a and 0.8.5-svn (not yet released): ...@@ -4,6 +4,7 @@ Changes between 0.8.4a and 0.8.5-svn (not yet released):
-------------------------------------------------------- --------------------------------------------------------
Core support: Core support:
* Statistics collection (bitrates, packets, connections, ...)
Input: Input:
* Initial support for RTSP-over-HTTP (to allow NAT traversal) * Initial support for RTSP-over-HTTP (to allow NAT traversal)
...@@ -49,11 +50,9 @@ OS X Port: ...@@ -49,11 +50,9 @@ OS X Port:
* Root wrapper to avoid running VLC as root * Root wrapper to avoid running VLC as root
Developers: Developers:
* New libvlc API (not finished yet)
* Java bindings * Java bindings
Changes between 0.8.4 and 0.8.4a: Changes between 0.8.4 and 0.8.4a:
--------------------------------- ---------------------------------
......
...@@ -62,6 +62,7 @@ struct libvlc_t ...@@ -62,6 +62,7 @@ struct libvlc_t
/* Do stats ? - We keep this boolean to avoid unneeded lookups */ /* Do stats ? - We keep this boolean to avoid unneeded lookups */
vlc_bool_t b_stats; vlc_bool_t b_stats;
stats_handler_t *p_stats;
/* Arch-specific variables */ /* Arch-specific variables */
#if !defined( WIN32 ) #if !defined( WIN32 )
......
...@@ -249,8 +249,8 @@ struct stats_handler_t ...@@ -249,8 +249,8 @@ struct stats_handler_t
VLC_EXPORT( void, stats_HandlerDestroy, (stats_handler_t*) ); VLC_EXPORT( void, stats_HandlerDestroy, (stats_handler_t*) );
#define stats_Update( a,b,c) __stats_Update( VLC_OBJECT( a ), b, c ) #define stats_Update( a,b,c, d) __stats_Update( VLC_OBJECT( a ), b, c, d )
VLC_EXPORT( int, __stats_Update, (vlc_object_t*, const char *, vlc_value_t) ); VLC_EXPORT( int, __stats_Update, (vlc_object_t*, const char *, vlc_value_t, vlc_value_t *) );
#define stats_Create( a,b,c,d ) __stats_Create( VLC_OBJECT(a), b, c, d ) #define stats_Create( a,b,c,d ) __stats_Create( VLC_OBJECT(a), b, c, d )
VLC_EXPORT( int, __stats_Create, (vlc_object_t*, const char *, int, int) ); VLC_EXPORT( int, __stats_Create, (vlc_object_t*, const char *, int, int) );
#define stats_Get( a,b,c,d ) __stats_Create( VLC_OBJECT(a), b, c, d ) #define stats_Get( a,b,c,d ) __stats_Create( VLC_OBJECT(a), b, c, d )
...@@ -277,21 +277,31 @@ static inline int __stats_GetFloat( vlc_object_t *p_obj, int i_id, ...@@ -277,21 +277,31 @@ static inline int __stats_GetFloat( vlc_object_t *p_obj, int i_id,
*value = val.f_float; *value = val.f_float;
return i_ret; return i_ret;
} }
#define stats_UpdateInteger( a,b,c ) __stats_UpdateInteger( VLC_OBJECT(a),b,c ) #define stats_UpdateInteger( a,b,c,d ) __stats_UpdateInteger( VLC_OBJECT(a),b,c,d )
static inline int __stats_UpdateInteger( vlc_object_t *p_obj, static inline int __stats_UpdateInteger( vlc_object_t *p_obj,
const char *psz_name, int i ) const char *psz_name, int i, int *pi_new )
{ {
int i_ret;
vlc_value_t val; vlc_value_t val;
vlc_value_t new_val;
val.i_int = i; val.i_int = i;
return __stats_Update( p_obj, psz_name, val ); i_ret = __stats_Update( p_obj, psz_name, val , &new_val );
if( pi_new )
*pi_new = new_val.i_int;
return i_ret;
} }
#define stats_UpdateFloat( a,b,c ) __stats_UpdateFloat( VLC_OBJECT(a),b,c ) #define stats_UpdateFloat( a,b,c,d ) __stats_UpdateFloat( VLC_OBJECT(a),b,c,d )
static inline int __stats_UpdateFloat( vlc_object_t *p_obj, static inline int __stats_UpdateFloat( vlc_object_t *p_obj,
const char *psz_name, float f ) const char *psz_name, float f, float *pf_new )
{ {
vlc_value_t val; vlc_value_t val;
int i_ret;
vlc_value_t new_val;
val.f_float = f; val.f_float = f;
return __stats_Update( p_obj, psz_name, val ); i_ret = __stats_Update( p_obj, psz_name, val, &new_val );
if( pf_new )
*pf_new = new_val.f_float;
return i_ret;
} }
/****************** /******************
......
...@@ -124,7 +124,7 @@ void vlm_MessageDelete (vlm_message_t *); ...@@ -124,7 +124,7 @@ void vlm_MessageDelete (vlm_message_t *);
void vout_SynchroDecode (vout_synchro_t *); void vout_SynchroDecode (vout_synchro_t *);
int playlist_Delete (playlist_t *, int); int playlist_Delete (playlist_t *, int);
void aout_FiltersPlay (aout_instance_t * p_aout, aout_filter_t ** pp_filters, int i_nb_filters, aout_buffer_t ** pp_input_buffer); void aout_FiltersPlay (aout_instance_t * p_aout, aout_filter_t ** pp_filters, int i_nb_filters, aout_buffer_t ** pp_input_buffer);
int __stats_Update (vlc_object_t*, const char *, vlc_value_t); int __stats_Update (vlc_object_t*, const char *, vlc_value_t, vlc_value_t *);
int __stats_Get (vlc_object_t*, int, const char *, vlc_value_t*); int __stats_Get (vlc_object_t*, int, const char *, vlc_value_t*);
char* httpd_ClientIP (httpd_client_t *cl, char *psz_ip); char* httpd_ClientIP (httpd_client_t *cl, char *psz_ip);
int __intf_UserProgress (vlc_object_t*, const char*, const char*, float); int __intf_UserProgress (vlc_object_t*, const char*, const char*, float);
...@@ -897,7 +897,7 @@ struct module_symbols_t ...@@ -897,7 +897,7 @@ struct module_symbols_t
void (*__intf_UserProgressUpdate_inner) (vlc_object_t*, int, const char*, float); void (*__intf_UserProgressUpdate_inner) (vlc_object_t*, int, const char*, float);
void (*__intf_UserHide_inner) (vlc_object_t *, int); void (*__intf_UserHide_inner) (vlc_object_t *, int);
int (*__stats_Create_inner) (vlc_object_t*, const char *, int, int); int (*__stats_Create_inner) (vlc_object_t*, const char *, int, int);
int (*__stats_Update_inner) (vlc_object_t*, const char *, vlc_value_t); int (*__stats_Update_inner) (vlc_object_t*, const char *, vlc_value_t, vlc_value_t *);
int (*__stats_Get_inner) (vlc_object_t*, int, const char *, vlc_value_t*); int (*__stats_Get_inner) (vlc_object_t*, int, const char *, vlc_value_t*);
void (*stats_ComputeInputStats_inner) (input_thread_t*, input_stats_t*); void (*stats_ComputeInputStats_inner) (input_thread_t*, input_stats_t*);
void (*stats_DumpInputStats_inner) (input_stats_t *); void (*stats_DumpInputStats_inner) (input_stats_t *);
......
...@@ -1328,7 +1328,7 @@ static int transcode_audio_process( sout_stream_t *p_stream, ...@@ -1328,7 +1328,7 @@ static int transcode_audio_process( sout_stream_t *p_stream,
while( (p_audio_buf = id->p_decoder->pf_decode_audio( id->p_decoder, while( (p_audio_buf = id->p_decoder->pf_decode_audio( id->p_decoder,
&in )) ) &in )) )
{ {
stats_UpdateInteger( p_stream->p_parent->p_parent, "decoded_audio", 1 ); stats_UpdateInteger( p_stream->p_parent->p_parent, "decoded_audio", 1, NULL );
if( p_sys->b_master_sync ) if( p_sys->b_master_sync )
{ {
mtime_t i_dts = date_Get( &id->interpolated_pts ) + 1; mtime_t i_dts = date_Get( &id->interpolated_pts ) + 1;
...@@ -1731,7 +1731,7 @@ static int transcode_video_process( sout_stream_t *p_stream, ...@@ -1731,7 +1731,7 @@ static int transcode_video_process( sout_stream_t *p_stream,
while( (p_pic = id->p_decoder->pf_decode_video( id->p_decoder, &in )) ) while( (p_pic = id->p_decoder->pf_decode_video( id->p_decoder, &in )) )
{ {
subpicture_t *p_subpic = 0; subpicture_t *p_subpic = 0;
stats_UpdateInteger( p_stream->p_parent->p_parent, "decoded_video", 1 ); stats_UpdateInteger( p_stream->p_parent->p_parent, "decoded_video", 1, NULL );
if( p_stream->p_sout->i_out_pace_nocontrol && p_sys->b_hurry_up ) if( p_stream->p_sout->i_out_pace_nocontrol && p_sys->b_hurry_up )
{ {
......
...@@ -312,7 +312,8 @@ int aout_DecPlay( aout_instance_t * p_aout, aout_input_t * p_input, ...@@ -312,7 +312,8 @@ int aout_DecPlay( aout_instance_t * p_aout, aout_input_t * p_input,
p_buffer->start_date - mdate()); p_buffer->start_date - mdate());
if( p_input->p_input_thread ) if( p_input->p_input_thread )
{ {
stats_UpdateInteger( p_input->p_input_thread, "lost_abuffers", 1 ); stats_UpdateInteger( p_input->p_input_thread, "lost_abuffers", 1,
NULL );
} }
aout_BufferFree( p_buffer ); aout_BufferFree( p_buffer );
return -1; return -1;
...@@ -367,7 +368,7 @@ int aout_DecPlay( aout_instance_t * p_aout, aout_input_t * p_input, ...@@ -367,7 +368,7 @@ int aout_DecPlay( aout_instance_t * p_aout, aout_input_t * p_input,
if( p_input->p_input_thread ) if( p_input->p_input_thread )
{ {
stats_UpdateInteger( p_input->p_input_thread, stats_UpdateInteger( p_input->p_input_thread,
"played_abuffers", 1 ); "played_abuffers", 1, NULL );
} }
vlc_mutex_unlock( &p_aout->mixer_lock ); vlc_mutex_unlock( &p_aout->mixer_lock );
......
...@@ -447,7 +447,8 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input, ...@@ -447,7 +447,8 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input,
start_date = 0; start_date = 0;
if( p_input->p_input_thread ) if( p_input->p_input_thread )
{ {
stats_UpdateInteger( p_input->p_input_thread, "lost_abuffers", 1 ); stats_UpdateInteger( p_input->p_input_thread, "lost_abuffers", 1,
NULL );
} }
} }
...@@ -459,7 +460,8 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input, ...@@ -459,7 +460,8 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input,
mdate() - p_buffer->start_date ); mdate() - p_buffer->start_date );
if( p_input->p_input_thread ) if( p_input->p_input_thread )
{ {
stats_UpdateInteger( p_input->p_input_thread, "lost_abuffers", 1 ); stats_UpdateInteger( p_input->p_input_thread, "lost_abuffers", 1,
NULL );
} }
aout_BufferFree( p_buffer ); aout_BufferFree( p_buffer );
p_input->i_resampling_type = AOUT_RESAMPLING_NONE; p_input->i_resampling_type = AOUT_RESAMPLING_NONE;
...@@ -500,7 +502,8 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input, ...@@ -500,7 +502,8 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input,
aout_BufferFree( p_buffer ); aout_BufferFree( p_buffer );
if( p_input->p_input_thread ) if( p_input->p_input_thread )
{ {
stats_UpdateInteger( p_input->p_input_thread, "lost_abuffers", 1 ); stats_UpdateInteger( p_input->p_input_thread, "lost_abuffers", 1,
NULL );
} }
return 0; return 0;
} }
......
...@@ -627,7 +627,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block ) ...@@ -627,7 +627,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
while( (p_aout_buf = p_dec->pf_decode_audio( p_dec, while( (p_aout_buf = p_dec->pf_decode_audio( p_dec,
&p_packetized_block )) ) &p_packetized_block )) )
{ {
stats_UpdateInteger( p_dec->p_parent, "decoded_audio", 1 ); stats_UpdateInteger( p_dec->p_parent, "decoded_audio", 1, NULL );
/* FIXME the best would be to handle the case start_date < preroll < end_date /* FIXME the best would be to handle the case start_date < preroll < end_date
* but that's not easy with non raw audio stream */ * but that's not easy with non raw audio stream */
if( p_dec->p_owner->i_preroll_end > 0 && if( p_dec->p_owner->i_preroll_end > 0 &&
...@@ -651,7 +651,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block ) ...@@ -651,7 +651,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
} }
else while( (p_aout_buf = p_dec->pf_decode_audio( p_dec, &p_block )) ) else while( (p_aout_buf = p_dec->pf_decode_audio( p_dec, &p_block )) )
{ {
stats_UpdateInteger( p_dec->p_parent, "decoded_audio", 1 ); stats_UpdateInteger( p_dec->p_parent, "decoded_audio", 1, NULL );
if( p_dec->p_owner->i_preroll_end > 0 && if( p_dec->p_owner->i_preroll_end > 0 &&
p_aout_buf->start_date < p_dec->p_owner->i_preroll_end ) p_aout_buf->start_date < p_dec->p_owner->i_preroll_end )
{ {
...@@ -698,7 +698,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block ) ...@@ -698,7 +698,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
&p_packetized_block )) ) &p_packetized_block )) )
{ {
stats_UpdateInteger( p_dec->p_parent, "decoded_video", stats_UpdateInteger( p_dec->p_parent, "decoded_video",
1 ); 1, NULL );
if( p_dec->p_owner->i_preroll_end > 0 && if( p_dec->p_owner->i_preroll_end > 0 &&
p_pic->date < p_dec->p_owner->i_preroll_end ) p_pic->date < p_dec->p_owner->i_preroll_end )
{ {
...@@ -719,7 +719,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block ) ...@@ -719,7 +719,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
} }
else while( (p_pic = p_dec->pf_decode_video( p_dec, &p_block )) ) else while( (p_pic = p_dec->pf_decode_video( p_dec, &p_block )) )
{ {
stats_UpdateInteger( p_dec->p_parent, "decoded_video", 1 ); stats_UpdateInteger( p_dec->p_parent, "decoded_video", 1 , NULL);
if( p_dec->p_owner->i_preroll_end > 0 && if( p_dec->p_owner->i_preroll_end > 0 &&
p_pic->date < p_dec->p_owner->i_preroll_end ) p_pic->date < p_dec->p_owner->i_preroll_end )
{ {
...@@ -739,7 +739,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block ) ...@@ -739,7 +739,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
subpicture_t *p_spu; subpicture_t *p_spu;
while( (p_spu = p_dec->pf_decode_sub( p_dec, &p_block ) ) ) while( (p_spu = p_dec->pf_decode_sub( p_dec, &p_block ) ) )
{ {
stats_UpdateInteger( p_dec->p_parent, "decoded_sub", 1 ); stats_UpdateInteger( p_dec->p_parent, "decoded_sub", 1 , NULL);
if( p_dec->p_owner->i_preroll_end > 0 && if( p_dec->p_owner->i_preroll_end > 0 &&
p_spu->i_start < p_dec->p_owner->i_preroll_end && p_spu->i_start < p_dec->p_owner->i_preroll_end &&
( p_spu->i_stop <= 0 || p_spu->i_stop <= p_dec->p_owner->i_preroll_end ) ) ( p_spu->i_stop <= 0 || p_spu->i_stop <= p_dec->p_owner->i_preroll_end ) )
......
...@@ -1033,10 +1033,9 @@ static int EsOutSend( es_out_t *out, es_out_id_t *es, block_t *p_block ) ...@@ -1033,10 +1033,9 @@ static int EsOutSend( es_out_t *out, es_out_id_t *es, block_t *p_block )
if( p_input->p_libvlc->b_stats ) if( p_input->p_libvlc->b_stats )
{ {
stats_UpdateInteger( p_input, "demux_read", p_block->i_buffer ); stats_UpdateInteger( p_input, "demux_read", p_block->i_buffer,
stats_GetInteger( p_input, p_input->i_object_id, "demux_read", &i_total );
&i_total ); stats_UpdateFloat( p_input , "demux_bitrate", (float)i_total, NULL );
stats_UpdateFloat( p_input , "demux_bitrate", (float)i_total );
} }
/* Mark preroll blocks */ /* Mark preroll blocks */
......
...@@ -1580,12 +1580,11 @@ static int AReadStream( stream_t *s, void *p_read, int i_read ) ...@@ -1580,12 +1580,11 @@ static int AReadStream( stream_t *s, void *p_read, int i_read )
if( !p_sys->i_list ) if( !p_sys->i_list )
{ {
i_read = p_access->pf_read( p_access, p_read, i_read ); i_read = p_access->pf_read( p_access, p_read, i_read );
stats_UpdateInteger( s->p_parent->p_parent , "read_bytes", i_read ); stats_UpdateInteger( s->p_parent->p_parent , "read_bytes", i_read,
stats_GetInteger( s, s->p_parent->p_parent->i_object_id, &i_total );
"read_bytes", &i_total );
stats_UpdateFloat( s->p_parent->p_parent , "input_bitrate", stats_UpdateFloat( s->p_parent->p_parent , "input_bitrate",
(float)i_total ); (float)i_total, NULL );
stats_UpdateInteger( s->p_parent->p_parent , "read_packets", 1 ); stats_UpdateInteger( s->p_parent->p_parent , "read_packets", 1, NULL );
return i_read; return i_read;
} }
...@@ -1614,12 +1613,11 @@ static int AReadStream( stream_t *s, void *p_read, int i_read ) ...@@ -1614,12 +1613,11 @@ static int AReadStream( stream_t *s, void *p_read, int i_read )
} }
/* Update read bytes in input */ /* Update read bytes in input */
stats_UpdateInteger( s->p_parent->p_parent , "read_bytes", i_read ); stats_UpdateInteger( s->p_parent->p_parent , "read_bytes", i_read,
stats_GetInteger( s, s->p_parent->p_parent->i_object_id, &i_total );
"read_bytes", &i_total );
stats_UpdateFloat( s->p_parent->p_parent , "input_bitrate", stats_UpdateFloat( s->p_parent->p_parent , "input_bitrate",
(float)i_total ); (float)i_total, NULL );
stats_UpdateInteger( s->p_parent->p_parent , "read_packets", 1 ); stats_UpdateInteger( s->p_parent->p_parent , "read_packets", 1, NULL );
return i_read; return i_read;
} }
...@@ -1638,12 +1636,10 @@ static block_t *AReadBlock( stream_t *s, vlc_bool_t *pb_eof ) ...@@ -1638,12 +1636,10 @@ static block_t *AReadBlock( stream_t *s, vlc_bool_t *pb_eof )
if( p_block && p_access->p_libvlc->b_stats ) if( p_block && p_access->p_libvlc->b_stats )
{ {
stats_UpdateInteger( s->p_parent->p_parent, "read_bytes", stats_UpdateInteger( s->p_parent->p_parent, "read_bytes",
p_block->i_buffer ); p_block->i_buffer, &i_total );
stats_GetInteger( s, s->p_parent->p_parent->i_object_id,
"read_bytes", &i_total );
stats_UpdateFloat( s->p_parent->p_parent , "input_bitrate", stats_UpdateFloat( s->p_parent->p_parent , "input_bitrate",
(float)i_total ); (float)i_total, NULL );
stats_UpdateInteger( s->p_parent->p_parent , "read_packets", 1 ); stats_UpdateInteger( s->p_parent->p_parent , "read_packets", 1, NULL );
} }
return p_block; return p_block;
} }
...@@ -1675,12 +1671,10 @@ static block_t *AReadBlock( stream_t *s, vlc_bool_t *pb_eof ) ...@@ -1675,12 +1671,10 @@ static block_t *AReadBlock( stream_t *s, vlc_bool_t *pb_eof )
if( p_block ) if( p_block )
{ {
stats_UpdateInteger( s->p_parent->p_parent, "read_bytes", stats_UpdateInteger( s->p_parent->p_parent, "read_bytes",
p_block->i_buffer ); p_block->i_buffer, &i_total );
stats_GetInteger( s, s->p_parent->p_parent->i_object_id,
"read_bytes", &i_total );
stats_UpdateFloat( s->p_parent->p_parent , "input_bitrate", stats_UpdateFloat( s->p_parent->p_parent , "input_bitrate",
(float)i_total ); (float)i_total, NULL );
stats_UpdateInteger( s->p_parent->p_parent , "read_packets", 1 ); stats_UpdateInteger( s->p_parent->p_parent , "read_packets", 1 , NULL);
} }
return p_block; return p_block;
......
...@@ -691,6 +691,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] ) ...@@ -691,6 +691,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
} }
libvlc.b_stats = config_GetInt( p_vlc, "stats" ); libvlc.b_stats = config_GetInt( p_vlc, "stats" );
libvlc.p_stats = NULL;
/* /*
* Initialize hotkey handling * Initialize hotkey handling
......
...@@ -218,7 +218,7 @@ static uint64_t HashString( const char *psz_string, int i_id ) ...@@ -218,7 +218,7 @@ static uint64_t HashString( const char *psz_string, int i_id )
i_hash ^= i_hash >> 8; i_hash ^= i_hash >> 8;
} }
i_hash += ( i_id << 32 ); i_hash += ( (uint64_t)i_id << 32 );
return i_hash; return i_hash;
} }
...@@ -36,7 +36,7 @@ static counter_t *GetCounter( stats_handler_t *p_handler, int i_object_id, ...@@ -36,7 +36,7 @@ static counter_t *GetCounter( stats_handler_t *p_handler, int i_object_id,
const char *psz_name ); const char *psz_name );
static int stats_CounterUpdate( stats_handler_t *p_handler, static int stats_CounterUpdate( stats_handler_t *p_handler,
counter_t *p_counter, counter_t *p_counter,
vlc_value_t val ); vlc_value_t val, vlc_value_t * );
static stats_handler_t* stats_HandlerCreate( vlc_object_t *p_this ); static stats_handler_t* stats_HandlerCreate( vlc_object_t *p_this );
static stats_handler_t *stats_HandlerGet( vlc_object_t *p_this ); static stats_handler_t *stats_HandlerGet( vlc_object_t *p_this );
...@@ -126,7 +126,7 @@ int __stats_Create( vlc_object_t *p_this, const char *psz_name, int i_type, ...@@ -126,7 +126,7 @@ int __stats_Create( vlc_object_t *p_this, const char *psz_name, int i_type,
* more information on how data is aggregated, \see __stats_Create * more information on how data is aggregated, \see __stats_Create
*/ */
int __stats_Update( vlc_object_t *p_this, const char *psz_name, int __stats_Update( vlc_object_t *p_this, const char *psz_name,
vlc_value_t val ) vlc_value_t val, vlc_value_t *val_new )
{ {
int i_ret; int i_ret;
counter_t *p_counter; counter_t *p_counter;
...@@ -151,7 +151,7 @@ int __stats_Update( vlc_object_t *p_this, const char *psz_name, ...@@ -151,7 +151,7 @@ int __stats_Update( vlc_object_t *p_this, const char *psz_name,
return VLC_ENOOBJ; return VLC_ENOOBJ;
} }
i_ret = stats_CounterUpdate( p_handler, p_counter, val ); i_ret = stats_CounterUpdate( p_handler, p_counter, val, val_new );
vlc_mutex_unlock( &p_handler->object_lock ); vlc_mutex_unlock( &p_handler->object_lock );
return i_ret; return i_ret;
...@@ -492,7 +492,7 @@ void __stats_TimersDumpAll( vlc_object_t *p_obj ) ...@@ -492,7 +492,7 @@ void __stats_TimersDumpAll( vlc_object_t *p_obj )
*/ */
static int stats_CounterUpdate( stats_handler_t *p_handler, static int stats_CounterUpdate( stats_handler_t *p_handler,
counter_t *p_counter, counter_t *p_counter,
vlc_value_t val ) vlc_value_t val, vlc_value_t *new_val )
{ {
switch( p_counter->i_compute_type ) switch( p_counter->i_compute_type )
{ {
...@@ -544,6 +544,7 @@ static int stats_CounterUpdate( stats_handler_t *p_handler, ...@@ -544,6 +544,7 @@ static int stats_CounterUpdate( stats_handler_t *p_handler,
free( p_counter->pp_samples[0]->value.psz_string ); free( p_counter->pp_samples[0]->value.psz_string );
} }
p_counter->pp_samples[0]->value = val; p_counter->pp_samples[0]->value = val;
*new_val = p_counter->pp_samples[0]->value;
} }
} }
break; break;
...@@ -596,9 +597,14 @@ static int stats_CounterUpdate( stats_handler_t *p_handler, ...@@ -596,9 +597,14 @@ static int stats_CounterUpdate( stats_handler_t *p_handler,
switch( p_counter->i_type ) switch( p_counter->i_type )
{ {
case VLC_VAR_INTEGER: case VLC_VAR_INTEGER:
case VLC_VAR_FLOAT:
p_counter->pp_samples[0]->value.i_int += val.i_int; p_counter->pp_samples[0]->value.i_int += val.i_int;
if( new_val )
new_val->i_int = p_counter->pp_samples[0]->value.i_int;
break; break;
case VLC_VAR_FLOAT:
p_counter->pp_samples[0]->value.f_float += val.f_float;
if( new_val )
new_val->f_float = p_counter->pp_samples[0]->value.f_float;
default: default:
msg_Err( p_handler, "Trying to increment invalid variable %s", msg_Err( p_handler, "Trying to increment invalid variable %s",
p_counter->psz_name ); p_counter->psz_name );
...@@ -621,9 +627,7 @@ static counter_t *GetCounter( stats_handler_t *p_handler, int i_object_id, ...@@ -621,9 +627,7 @@ static counter_t *GetCounter( stats_handler_t *p_handler, int i_object_id,
static stats_handler_t *stats_HandlerGet( vlc_object_t *p_this ) static stats_handler_t *stats_HandlerGet( vlc_object_t *p_this )
{ {
stats_handler_t *p_handler = (stats_handler_t*) stats_handler_t *p_handler = p_this->p_libvlc->p_stats;
vlc_object_find( p_this->p_vlc, VLC_OBJECT_STATS,
FIND_ANYWHERE );
if( !p_handler ) if( !p_handler )
{ {
p_handler = stats_HandlerCreate( p_this ); p_handler = stats_HandlerCreate( p_this );
...@@ -631,8 +635,8 @@ static stats_handler_t *stats_HandlerGet( vlc_object_t *p_this ) ...@@ -631,8 +635,8 @@ static stats_handler_t *stats_HandlerGet( vlc_object_t *p_this )
{ {
return NULL; return NULL;
} }
vlc_object_yield( p_handler );
} }
vlc_object_yield( p_handler );
return p_handler; return p_handler;
} }
...@@ -657,11 +661,13 @@ static stats_handler_t* stats_HandlerCreate( vlc_object_t *p_this ) ...@@ -657,11 +661,13 @@ static stats_handler_t* stats_HandlerCreate( vlc_object_t *p_this )
return NULL; return NULL;
} }
p_handler->i_counters = 0; p_handler->i_counters = 0;
p_handler->p_counters = (hashtable_entry_t *) malloc( 5 * sizeof( variable_t ) ); p_handler->p_counters = (hashtable_entry_t *) malloc( 4 * sizeof( variable_t ) );
/// \bug is it p_vlc or p_libvlc ? /// \bug is it p_vlc or p_libvlc ?
vlc_object_attach( p_handler, p_this->p_vlc ); vlc_object_attach( p_handler, p_this->p_vlc );
p_this->p_libvlc->p_stats = p_handler;
return p_handler; return p_handler;
} }
......
...@@ -2106,7 +2106,7 @@ static void httpd_HostThread( httpd_host_t *host ) ...@@ -2106,7 +2106,7 @@ static void httpd_HostThread( httpd_host_t *host )
cl->i_activity_date+cl->i_activity_timeout < mdate()) ) ) ) cl->i_activity_date+cl->i_activity_timeout < mdate()) ) ) )
{ {
httpd_ClientClean( cl ); httpd_ClientClean( cl );
stats_UpdateInteger( host, "active_connections", -1 ); stats_UpdateInteger( host, "active_connections", -1, NULL );
TAB_REMOVE( host->i_client, host->client, cl ); TAB_REMOVE( host->i_client, host->client, cl );
free( cl ); free( cl );
i_client--; i_client--;
...@@ -2560,8 +2560,10 @@ static void httpd_HostThread( httpd_host_t *host ) ...@@ -2560,8 +2560,10 @@ static void httpd_HostThread( httpd_host_t *host )
if( fd >= 0 ) if( fd >= 0 )
{ {
httpd_client_t *cl; httpd_client_t *cl;
stats_UpdateInteger( host, "client_connections", 1 ); stats_UpdateInteger( host, "client_connections", 1,
stats_UpdateInteger( host, "active_connections", 1 ); NULL );
stats_UpdateInteger( host, "active_connections", 1,
NULL );
cl = httpd_ClientNew( fd, &sock, i_sock_size, p_tls ); cl = httpd_ClientNew( fd, &sock, i_sock_size, p_tls );
p_tls = NULL; p_tls = NULL;
vlc_mutex_lock( &host->lock ); vlc_mutex_lock( &host->lock );
......
...@@ -381,14 +381,11 @@ int sout_AccessOutWrite( sout_access_out_t *p_access, block_t *p_buffer ) ...@@ -381,14 +381,11 @@ int sout_AccessOutWrite( sout_access_out_t *p_access, block_t *p_buffer )
FIND_PARENT ); FIND_PARENT );
if( p_input ) if( p_input )
{ {
stats_UpdateInteger( p_input, "sout_sent_packets", 10 ); stats_UpdateInteger( p_input, "sout_sent_packets", 10, NULL );
stats_UpdateInteger( p_input, "sout_sent_bytes", stats_UpdateInteger( p_input, "sout_sent_bytes",
p_access->i_sent_bytes ); p_access->i_sent_bytes, &i_total );
stats_GetInteger( p_input, stats_UpdateFloat( p_input, "sout_send_bitrate", (float)i_total,
p_access->p_parent->p_parent->i_object_id, NULL );
"sout_sent_bytes", &i_total );
stats_UpdateFloat( p_input, "sout_send_bitrate", (float)i_total );
p_access->i_sent_bytes = 0; p_access->i_sent_bytes = 0;
vlc_object_release( p_input ); vlc_object_release( p_input );
}