Skip to content

Commit 44c4678

Browse files
committed
Implement ta_getsize() and ta_realloc()
1 parent 1728aca commit 44c4678

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

tinyalloc.c

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,21 @@ static void memclear(void *ptr, size_t num) {
243243
}
244244
}
245245

246+
static void memcopy(void *dst, void *src, size_t num) {
247+
size_t *dstw = (size_t *)dst;
248+
size_t *srcw = (size_t *)src;
249+
size_t numw = (num & -sizeof(size_t)) / sizeof(size_t);
250+
while (numw--) {
251+
*dstw++ = *srcw++;
252+
}
253+
num &= (sizeof(size_t) - 1);
254+
uint8_t *dstb = (uint8_t *)dstw;
255+
uint8_t *srcb = (uint8_t *)srcw;
256+
while (num--) {
257+
*dstb++ = *srcb++;
258+
}
259+
}
260+
246261
void *ta_calloc(size_t num, size_t size) {
247262
size_t orig = num;
248263
num *= size;
@@ -251,7 +266,44 @@ void *ta_calloc(size_t num, size_t size) {
251266
}
252267
Block *block = alloc_block(num);
253268
if (block != NULL) {
254-
memclear(block->addr, num);
269+
memclear(block->addr, block->size);
270+
return block->addr;
271+
}
272+
return NULL;
273+
}
274+
275+
size_t ta_getsize(void *ptr) {
276+
if (ptr == NULL) {
277+
return 0;
278+
}
279+
Block *block = heap->used;
280+
while (block != NULL) {
281+
if (ptr == block->addr) {
282+
return block->size;
283+
}
284+
block = block->next;
285+
}
286+
return 0;
287+
}
288+
289+
void *ta_realloc(void *ptr, size_t num) {
290+
if (ptr == NULL) {
291+
return ta_alloc(num);
292+
} else if (num == 0) {
293+
ta_free(ptr);
294+
return NULL;
295+
}
296+
size_t size = ta_getsize(ptr);
297+
if (num <= size && size - num <= heap_split_thresh) {
298+
return ptr; // keep current block
299+
}
300+
Block *block = alloc_block(num);
301+
if (block != NULL) {
302+
if (size > num) {
303+
size = num;
304+
}
305+
memcopy(block->addr, ptr, size);
306+
ta_free(ptr);
255307
return block->addr;
256308
}
257309
return NULL;

tinyalloc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ extern "C" {
88
bool ta_init(const void *base, const void *limit, const size_t heap_blocks, const size_t split_thresh, const size_t alignment);
99
void *ta_alloc(size_t num);
1010
void *ta_calloc(size_t num, size_t size);
11+
size_t ta_getsize(void *ptr);
12+
void *ta_realloc(void *ptr, size_t num);
1113
bool ta_free(void *ptr);
1214

1315
size_t ta_num_free();

0 commit comments

Comments
 (0)