static int ssmem_mem_reclaim(ssmem_allocator_t* a) { if (__builtin_expect(a->released_num > 0, 0)) { ssmem_released_t* rel_cur = a->released_mem_list; ssmem_released_t* rel_nxt = rel_cur->next; if (rel_nxt != NULL && ssmem_ts_compare(rel_cur->ts_set, rel_nxt->ts_set)) { rel_cur->next = NULL; a->released_num = 1; /* find and collect the memory */ do { rel_cur = rel_nxt; free(rel_cur->mem); free(rel_cur); rel_nxt = rel_nxt->next; } while (rel_nxt != NULL); } } ssmem_free_set_t* fs_cur = a->free_set_list; if (fs_cur->ts_set == NULL) { return 0; } ssmem_free_set_t* fs_nxt = fs_cur->set_next; int gced_num = 0; if (fs_nxt == NULL || fs_nxt->ts_set == NULL) /* need at least 2 sets to compare */ { return 0; } if (ssmem_ts_compare(fs_cur->ts_set, fs_nxt->ts_set)) { gced_num = a->free_set_num - 1; /* take the the suffix of the list (all collected free_sets) away from the free_set list of a and set the correct num of free_sets*/ fs_cur->set_next = NULL; a->free_set_num = 1; /* find the tail for the collected_set list in order to append the new free_sets that were just collected */ ssmem_free_set_t* collected_set_cur = a->collected_set_list; if (collected_set_cur != NULL) { while (collected_set_cur->set_next != NULL) { collected_set_cur = collected_set_cur->set_next; } collected_set_cur->set_next = fs_nxt; } else { a->collected_set_list = fs_nxt; } a->collected_set_num += gced_num; } /* if (gced_num) */ /* { */ /* printf("//collected %d sets\n", gced_num); */ /* } */ return gced_num; }
static int ssmem_mem_reclaim(ssmem_allocator_t* a) { ssmem_free_set_t* fs_cur = a->free_set_list; ssmem_free_set_t* fs_nxt = fs_cur->set_next; if (__builtin_expect(a->released_num > 0, 0)) { size_t* ts_ref = fs_cur->ts_set; ssmem_released_t* rel_cur = NULL; ssmem_released_t* rel_nxt = a->released_mem_list; int gc_rest = 0; int num_cannot_release = 0; int num_release = 0; while (rel_nxt != NULL) { if (gc_rest || ssmem_ts_compare(ts_ref, rel_nxt->ts_set)) { gc_rest = 1; if (rel_cur == NULL) { a->released_mem_list = rel_nxt->next; } else { rel_cur->next = rel_nxt->next; } num_release++; ssmem_released_t* rel_free = rel_nxt; rel_nxt = rel_nxt->next; free(rel_free->mem); /* free(rel_free->ts_set); */ free(rel_free); } else { num_cannot_release++; rel_cur = rel_nxt; rel_nxt = rel_nxt->next; } } a->released_num = num_cannot_release; } int gced_num = 0; if (fs_nxt == NULL) /* need at least 2 sets to compare */ { return 0; } if (ssmem_ts_compare(fs_cur->ts_set, fs_nxt->ts_set)) { gced_num = a->free_set_num - 1; /* take the the suffix of the list (all collected free_sets) away from the free_set list of a and set the correct num of free_sets*/ fs_cur->set_next = NULL; a->free_set_num = 1; #ifdef TIGHT_ALLOC int i; ssmem_free_set_t* fs_nxt_nxt; while (fs_nxt != NULL) { for (i = 0; i < fs_nxt->size; i++) { free((void *) fs_nxt->set[i]); } fs_nxt_nxt = fs_nxt->set_next; ssmem_free_set_make_avail(a, fs_nxt); fs_nxt = fs_nxt_nxt; } #else /* find the tail for the collected_set list in order to append the new free_sets that were just collected */ ssmem_free_set_t* collected_set_cur = a->collected_set_list; if (collected_set_cur != NULL) { while (collected_set_cur->set_next != NULL) { collected_set_cur = collected_set_cur->set_next; } collected_set_cur->set_next = fs_nxt; } else { a->collected_set_list = fs_nxt; } a->collected_set_num += gced_num; #endif } /* if (gced_num) */ /* { */ /* printf("//collected %d sets\n", gced_num); */ /* } */ return gced_num; }