|
1 | 1 | #include "malloc.h"
|
2 | 2 |
|
3 | 3 | #include <cstdio>
|
| 4 | +#include <cstring> |
4 | 5 |
|
5 | 6 | extern "C" void *__libc_malloc(size_t size);
|
6 | 7 | extern "C" void *__libc_free(void *ptr);
|
| 8 | +extern "C" void *__libc_realloc(void *ptr, size_t new_size); |
7 | 9 |
|
8 | 10 | extern "C" void *malloc(size_t size) {
|
9 | 11 | printf("malloc size: %zu\n", size);
|
10 | 12 | const size_t new_size = size + sizeof(size_t);
|
11 |
| - char *temp = (char *)__libc_malloc(new_size); |
12 |
| - *((size_t *)temp) = size; |
13 |
| - return (void *)(temp + sizeof(size_t)); |
| 13 | + char *temp = static_cast<char *>(__libc_malloc(new_size)); |
| 14 | + *reinterpret_cast<size_t *>(temp) = size; |
| 15 | + return static_cast<void *>(temp + sizeof(size_t)); |
14 | 16 | }
|
15 | 17 |
|
16 | 18 | extern "C" void free(void *ptr) {
|
17 | 19 | if (ptr == 0) return;
|
18 | 20 |
|
19 |
| - char *n = (char *)ptr; |
20 |
| - void *real_ptr = (void *)((char *)ptr - sizeof(size_t)); |
21 |
| - // get the size of the memory freed |
| 21 | + volatile char *ptr_ch = static_cast<volatile char *>(ptr); |
22 | 22 |
|
23 |
| - size_t *size_ptr = (size_t *)(n - sizeof(size_t)); |
24 |
| -// write zeros |
| 23 | + size_t *size_ptr = reinterpret_cast<size_t *>(const_cast<char *>(ptr_ch) - sizeof(size_t)); |
| 24 | +// write zeros, do not use memset as it may be optimized away |
25 | 25 | #pragma omp simd
|
26 |
| - for (size_t i = 0; i < *(size_ptr); ++i) { |
27 |
| - n[i] = 0; |
| 26 | + for (size_t i = 0; i < *size_ptr; ++i) { |
| 27 | + ptr_ch[i] = 0; |
28 | 28 | }
|
29 | 29 |
|
30 | 30 | *size_ptr = 0;
|
31 |
| - // call _free() |
| 31 | + void *real_ptr = static_cast<void *>(const_cast<char *>(ptr_ch) - sizeof(size_t)); |
32 | 32 | __libc_free(real_ptr);
|
33 | 33 | }
|
| 34 | + |
| 35 | +extern "C" void *realloc(void *ptr, size_t new_size) { |
| 36 | + printf("realloc %p - %zu\n", ptr, new_size); |
| 37 | + if (new_size == 0) return nullptr; |
| 38 | + |
| 39 | + void *temp = malloc(new_size); |
| 40 | + |
| 41 | + size_t old_size = *(size_t *)(static_cast<char *>(ptr) - sizeof(size_t)); |
| 42 | + std::memcpy(temp, ptr, old_size); |
| 43 | + |
| 44 | + free(ptr); |
| 45 | + return temp; |
| 46 | +} |
| 47 | + |
| 48 | +extern "C" void *calloc(size_t num, size_t size) { |
| 49 | + printf("calloc %zu - %zu\n", num, size); |
| 50 | + void *ptr = malloc(num * size); |
| 51 | + std::memset(ptr, 0, num * size); |
| 52 | + return ptr; |
| 53 | +} |
0 commit comments