diff --git a/src/bitset.h b/src/bitset.h index 76d2a5e..9cb0d78 100644 --- a/src/bitset.h +++ b/src/bitset.h @@ -261,6 +261,38 @@ static inline void bitset_stream_dequeue( return; } +static inline int bitset_stream_size( struct bitset_mapping * set ) +{ + int size; + + pthread_mutex_lock( &set->stream->mutex ); + size = set->stream->size; + pthread_mutex_unlock( &set->stream->mutex ); + + return size; +} + +static inline uint64_t bitset_stream_queued_bytes( + struct bitset_mapping * set, + enum bitset_stream_events event +) +{ + uint64_t total = 0; + int i; + + pthread_mutex_lock( &set->stream->mutex ); + + for ( i = set->stream->out; i < set->stream->in ; i++ ) { + if ( set->stream->entries[i].event == event ) { + total += set->stream->entries[i].len; + } + } + + pthread_mutex_unlock( &set->stream->mutex ); + + return total; +} + static inline void bitset_stream_on( struct bitset_mapping * set ) { BITSET_LOCK; diff --git a/tests/unit/check_bitset.c b/tests/unit/check_bitset.c index 07e6575..cc3315d 100644 --- a/tests/unit/check_bitset.c +++ b/tests/unit/check_bitset.c @@ -310,7 +310,7 @@ START_TEST( test_bitset_set_range_doesnt_push_to_stream ) { struct bitset_mapping *map = bitset_alloc( 64, 1 ); bitset_set_range( map, 0, 64 ); - ck_assert_int_eq( map->stream->size, 0 ); + ck_assert_int_eq( 0, bitset_stream_size( map ) ); bitset_free( map ); } END_TEST @@ -319,7 +319,7 @@ START_TEST( test_bitset_clear_range_doesnt_push_to_stream ) { struct bitset_mapping *map = bitset_alloc( 64, 1 ); bitset_clear_range( map, 0, 64 ); - ck_assert_int_eq( map->stream->size, 0 ); + ck_assert_int_eq( 0, bitset_stream_size( map ) ); bitset_free( map ); } END_TEST @@ -354,7 +354,7 @@ START_TEST(test_bitset_stream_off) bitset_stream_off( map ); ck_assert_int_eq( 0, map->stream_enabled ); - ck_assert_int_eq( 2, map->stream->size ); + ck_assert_int_eq( 2, bitset_stream_size( map ) ); bitset_stream_dequeue( map, NULL ); // ON bitset_stream_dequeue( map, &result ); // OFF @@ -376,7 +376,7 @@ START_TEST(test_bitset_stream_with_set_range) bitset_stream_on( map ); bitset_set_range( map, 0, 32 ); - ck_assert_int_eq( 2, map->stream->size ); + ck_assert_int_eq( 2, bitset_stream_size( map ) ); bitset_stream_dequeue( map, NULL ); // ON bitset_stream_dequeue( map, &result ); // SET @@ -397,7 +397,7 @@ START_TEST(test_bitset_stream_with_clear_range) bitset_stream_on( map ); bitset_clear_range( map, 0, 32 ); - ck_assert_int_eq( 2, map->stream->size ); + ck_assert_int_eq( 2, bitset_stream_size( map ) ); bitset_stream_dequeue( map, NULL ); // ON bitset_stream_dequeue( map, &result ); // UNSET @@ -410,6 +410,47 @@ START_TEST(test_bitset_stream_with_clear_range) } END_TEST +START_TEST(test_bitset_stream_size) +{ + struct bitset_mapping *map = bitset_alloc( 64, 1 ); + bitset_stream_on( map ); + bitset_set_range( map, 0, 32 ); + bitset_set_range( map, 16, 32 ); + bitset_set_range( map, 7, 16 ); + + bitset_clear_range( map, 0, 32 ); + bitset_clear_range( map, 16, 32 ); + bitset_clear_range( map, 48, 16 ); + bitset_stream_off( map ); + + ck_assert_int_eq( 8, bitset_stream_size( map ) ); + + bitset_free( map ); +} +END_TEST + +START_TEST(test_bitset_stream_queued_bytes) +{ + struct bitset_mapping *map = bitset_alloc( 64, 1 ); + bitset_stream_on( map ); + bitset_set_range( map, 0, 32 ); + bitset_set_range( map, 16, 32 ); + bitset_set_range( map, 7, 16 ); + + bitset_clear_range( map, 0, 32 ); + bitset_clear_range( map, 16, 32 ); + bitset_clear_range( map, 48, 16 ); + bitset_clear_range( map, 0, 2 ); + bitset_stream_off( map ); + + ck_assert_int_eq( 64, bitset_stream_queued_bytes( map, BITSET_STREAM_ON ) ); + ck_assert_int_eq( 80, bitset_stream_queued_bytes( map, BITSET_STREAM_SET ) ); + ck_assert_int_eq( 82, bitset_stream_queued_bytes( map, BITSET_STREAM_UNSET ) ); + ck_assert_int_eq( 64, bitset_stream_queued_bytes( map, BITSET_STREAM_OFF ) ); + bitset_free( map ); +} +END_TEST + Suite* bitset_suite(void) { Suite *s = suite_create("bitset"); @@ -439,6 +480,8 @@ Suite* bitset_suite(void) tcase_add_test(tc_bitset_stream, test_bitset_stream_off); tcase_add_test(tc_bitset_stream, test_bitset_stream_with_set_range); tcase_add_test(tc_bitset_stream, test_bitset_stream_with_clear_range); + tcase_add_test(tc_bitset_stream, test_bitset_stream_size); + tcase_add_test(tc_bitset_stream, test_bitset_stream_queued_bytes); suite_add_tcase(s, tc_bitset_stream); return s;