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:
*/
-