void region_test_truncate() { header(); struct region region; region_create(®ion, &cache); void *ptr = region_alloc_nothrow(®ion, 10); fail_unless(ptr); size_t size = region_used(®ion); region_alloc_nothrow(®ion, 10000); region_alloc_nothrow(®ion, 10000000); region_truncate(®ion, size); fail_unless(region_used(®ion) == size); region_free(®ion); footer(); }
void region_basic() { header(); struct region region; region_create(®ion, &cache); fail_unless(region_used(®ion) == 0); void *ptr = region_alloc_nothrow(®ion, 10); fail_unless(ptr); fail_unless(region_used(®ion) == 10); ptr = region_alloc_nothrow(®ion, 10000000); fail_unless(ptr); fail_unless(region_used(®ion) == 10000010); region_free(®ion); fail_unless(region_used(®ion) == 0); printf("name of a new region: %s.\n", region_name(®ion)); region_set_name(®ion, "region"); printf("set new region name: %s.\n", region_name(®ion)); region_set_name(®ion, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); printf("region name is truncated: %s.\n", region_name(®ion)); footer(); }
void * region_join_nothrow(struct region *region, size_t size) { if (rlist_empty(®ion->slabs.slabs)) { assert(size == 0); return region_alloc_nothrow(region, 0); } struct rslab *slab = rlist_first_entry(®ion->slabs.slabs, struct rslab, slab.next_in_list); if (slab->used >= size) { /* Don't move stuff if it's in a single chunk. */ return (char *) rslab_data(slab) + slab->used - size; } /** * Use region_reserve() to ensure slab->size is not * changed when the joined region is in the same slab * as the final chunk. */ char *ptr = region_reserve_nothrow(region, size); size_t offset = size; if (ptr == NULL) return NULL; /* * Copy data from last chunk to first, i.e. in the reverse order. */ while (offset > 0 && slab->used <= offset) { memcpy(ptr + offset - slab->used, rslab_data(slab), slab->used); offset -= slab->used; slab = rlist_next_entry(slab, slab.next_in_list); } if (offset > 0) memcpy(ptr, rslab_data(slab) + slab->used - offset, offset); region_alloc_nothrow(region, size); return ptr; }