src/lib/stat.c in trema-0.2.5 vs src/lib/stat.c in trema-0.2.6

- old
+ new

@@ -62,16 +62,10 @@ static hash_table *stats = NULL; static pthread_mutex_t stats_table_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; -typedef struct { - char key[ STAT_KEY_LENGTH ]; - uint64_t value; -} stat_entry; - - static void create_stats_table() { assert( stats == NULL ); stats = create_hash( compare_string, hash_string ); assert( stats != NULL ); @@ -86,11 +80,13 @@ assert( stats != NULL ); init_hash_iterator( stats, &iter ); while ( ( e = iterate_hash_next( &iter ) ) != NULL ) { void *value = delete_hash_entry( stats, e->key ); - xfree( value ); + if ( value != NULL ) { + xfree( value ); + } } delete_hash( stats ); stats = NULL; } @@ -176,38 +172,79 @@ pthread_mutex_unlock( &stats_table_mutex ); } void -dump_stats() { +reset_stats() { assert( stats != NULL ); - int n_stats = 0; + pthread_mutex_lock( &stats_table_mutex ); + + hash_entry *e = NULL; hash_iterator iter; - hash_entry *e; + init_hash_iterator( stats, &iter ); + while ( ( e = iterate_hash_next( &iter ) ) != NULL ) { + stat_entry *st = e->value; + if ( st != NULL ) { + void *deleted = delete_hash_entry( stats, st->key ); + if ( deleted != NULL ) { + xfree( deleted ); + } + } + } - pthread_mutex_lock( &stats_table_mutex ); + pthread_mutex_unlock( &stats_table_mutex ); +} - info( "Statistics:" ); +void +foreach_stat( void function( const char *key, const uint64_t value, void *user_data ), void *user_data ) { + assert( stats != NULL ); + assert( function != NULL ); + + pthread_mutex_lock( &stats_table_mutex ); + + hash_entry *e = NULL; + hash_iterator iter; init_hash_iterator( stats, &iter ); while ( ( e = iterate_hash_next( &iter ) ) != NULL ) { stat_entry *st = e->value; - info( "%s: %" PRIu64, st->key, st->value ); - n_stats++; + if ( st != NULL ) { + function( st->key, st->value, user_data ); + } } + pthread_mutex_unlock( &stats_table_mutex ); +} + + +static void +print_stat( const char *key, const uint64_t value, void *user_data ) { + assert( key != NULL ); + assert( user_data != NULL ); + + info( "%s: %" PRIu64, key, value ); + ( *( int * ) user_data )++; +} + + +void +dump_stats() { + assert( stats != NULL ); + + info( "Statistics:" ); + + int n_stats = 0; + foreach_stat( print_stat, &n_stats ); + if ( n_stats == 0 ) { info( "No statistics found." ); } - - pthread_mutex_unlock( &stats_table_mutex ); } /* * Local variables: * c-basic-offset: 2 * indent-tabs-mode: nil * End: */ -