Skip to content

Commit 1c95fcf

Browse files
committed
Added realloc and calloc support.
Fixes jbreitbart#1.
1 parent cccbb40 commit 1c95fcf

File tree

3 files changed

+34
-22
lines changed

3 files changed

+34
-22
lines changed

CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ if (OPENMP_FOUND)
1313
endif()
1414

1515
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
16-
ADD_DEFINITIONS(-g -Ofast -march=native)
16+
ADD_DEFINITIONS(-g -Ofast -march=native -std=c++11)
1717

1818
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
1919
# Using GCC
20-
ADD_DEFINITIONS(-g -O2 -march=native)
20+
ADD_DEFINITIONS(-g -O2 -march=native -std=c++11)
2121

2222
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
2323
# Using Intel C++
24-
ADD_DEFINITIONS(-g -fast)
24+
ADD_DEFINITIONS(-g -fast -std=c++11)
2525
endif()
2626
########
2727

malloc_bt.cpp

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,53 @@
11
#include "malloc.h"
22

33
#include <cstdio>
4+
#include <cstring>
45

56
extern "C" void *__libc_malloc(size_t size);
67
extern "C" void *__libc_free(void *ptr);
8+
extern "C" void *__libc_realloc(void *ptr, size_t new_size);
79

810
extern "C" void *malloc(size_t size) {
911
printf("malloc size: %zu\n", size);
1012
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));
1416
}
1517

1618
extern "C" void free(void *ptr) {
1719
if (ptr == 0) return;
1820

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);
2222

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
2525
#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;
2828
}
2929

3030
*size_ptr = 0;
31-
// call _free()
31+
void *real_ptr = static_cast<void *>(const_cast<char *>(ptr_ch) - sizeof(size_t));
3232
__libc_free(real_ptr);
3333
}
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+
}

malloc_bt.h

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)