diff --git a/include/roaring/portability.h b/include/roaring/portability.h index e24ae89e..6efbad0a 100644 --- a/include/roaring/portability.h +++ b/include/roaring/portability.h @@ -635,7 +635,7 @@ static inline void croaring_refcount_inc(croaring_refcount_t *val) { static inline bool croaring_refcount_dec(croaring_refcount_t *val) { assert(*val > 0); *val -= 1; - return val == 0; + return *val == 0; } static inline uint32_t croaring_refcount_get(const croaring_refcount_t *val) { diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 76145e51..39912906 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -18,6 +18,9 @@ add_c_test(run_container_unit) add_c_test(toplevel_unit) add_c_test(util_unit) add_c_test(format_portability_unit) +add_c_test(refcount_unit) +target_compile_definitions(refcount_unit PRIVATE + CROARING_ATOMIC_IMPL=CROARING_ATOMIC_IMPL_NONE) add_c_test(robust_deserialization_unit) add_c_test(container_comparison_unit) add_c_test(add_offset) diff --git a/tests/refcount_unit.c b/tests/refcount_unit.c new file mode 100644 index 00000000..e35124b4 --- /dev/null +++ b/tests/refcount_unit.c @@ -0,0 +1,21 @@ +#include + +#include + +#include "test.h" + +DEFINE_TEST(test_non_atomic_refcount) { + croaring_refcount_t refcount = 2; + + assert_false(croaring_refcount_dec(&refcount)); + assert_int_equal(croaring_refcount_get(&refcount), 1); + assert_true(croaring_refcount_dec(&refcount)); + assert_int_equal(croaring_refcount_get(&refcount), 0); +} + +int main() { + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_non_atomic_refcount), + }; + return cmocka_run_group_tests(tests, NULL, NULL); +}