diff --git a/refuse.c b/refuse.c index aac49dc..a59ba6d 100644 --- a/refuse.c +++ b/refuse.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "refuse.h" static inline refhdr_t* _refuse_header(void* ptr) @@ -45,6 +46,7 @@ void refuse_reconcile(refuse_t* refuse) if(hdr->retainCount == 0) { // Iterate children, delete children free(hdr); + hdr = NULL; } hdr = refdeque_pop_front(refuse->dec); } diff --git a/tests.c b/tests.c index 68fc5d7..a9ffd40 100644 --- a/tests.c +++ b/tests.c @@ -71,12 +71,14 @@ START_TEST(test_refuse_retain_3) refuse_t refuse = {0}; refuse_init(&refuse); struct mock* t = refuse_alloc(&refuse, sizeof(struct mock)); - refuse_set_dirty(&refuse, t); - refuse_retain(&refuse, t); refhdr_t* hdr = (refhdr_t*)((char*)t - sizeof(refhdr_t)); - ck_assert_int_eq(hdr->retainCount, 0); + refuse_retain(&refuse, t); refuse_reconcile(&refuse); - ck_assert_int_eq(hdr->retainCount, 0); + refuse_set_dirty(&refuse, t); + ck_assert_int_eq(hdr->dirty, 1); + ck_assert_int_eq(hdr->retainCount, 1); + refuse_reconcile(&refuse); + ck_assert_int_eq(hdr->retainCount, 1); } END_TEST @@ -92,6 +94,8 @@ START_TEST(test_refuse_release_1) refuse_release(&refuse, t); ck_assert_int_eq(hdr->retainCount, 1); refuse_reconcile(&refuse); + // This is not safe, as the memory has been deallocated, but we're + // in a controlled environment. ck_assert_int_eq(hdr->retainCount, 0); } END_TEST