aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fl.fischer@fau.de>2019-11-11 19:27:26 +0100
committerFlorian Fischer <florian.fl.fischer@fau.de>2019-11-11 19:27:26 +0100
commit0de850f830ded3d1df42d359622886c22dbed3c0 (patch)
tree255ed60f653ee82031c6280ab86a35bd5af6aff6
parent27e9fb35b07e73bf2d682cbd85f3c45eb86f69ce (diff)
downloadallocbench-0de850f830ded3d1df42d359622886c22dbed3c0.tar.gz
allocbench-0de850f830ded3d1df42d359622886c22dbed3c0.zip
fix use of ltls after init_tls and further reduce tsd usebumpptrs
-rw-r--r--src/speedymalloc_2.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/src/speedymalloc_2.c b/src/speedymalloc_2.c
index a079714..02bf1e6 100644
--- a/src/speedymalloc_2.c
+++ b/src/speedymalloc_2.c
@@ -48,7 +48,10 @@ typedef struct TLStates {
__thread tls_t* tls;
static inline int size2bin(size_t size) {
- assert(size > 0 && size < CACHE_BINS * CACHE_BIN_SEPERATION);
+ assert(size < CACHE_BINS * CACHE_BIN_SEPERATION);
+ if (size == 0)
+ return 0;
+
return (size - 1) / CACHE_BIN_SEPERATION;
}
@@ -57,7 +60,7 @@ static inline size_t bin2size(int bin) {
return (bin + 1) * CACHE_BIN_SEPERATION;
}
-static void init_tls(void) {
+static tls_t* init_tls(void) {
void *mem = mmap(NULL, MEMSIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
if (mem == MAP_FAILED) {
perror("mmap");
@@ -67,13 +70,12 @@ static void init_tls(void) {
tls->ptr = ((uintptr_t)tls) + sizeof(tls_t);
tls->end = (uintptr_t)tls + MEMSIZE;
+ return (tls_t*)mem;
}
-inline static void* bump_alloc(size_t size, size_t align) {
+inline static void* bump_alloc(tls_t* ltls, size_t size, size_t align) {
assert(align % 2 == 0);
- tls_t* ltls = tls;
-
// allocate size header
uintptr_t ptr_w_header = ltls->ptr + sizeof(size_t);
@@ -95,9 +97,8 @@ inline static void* bump_alloc(size_t size, size_t align) {
void* malloc(size_t size) {
tls_t* ltls = tls;
-
if (unlikely(ltls == NULL)) {
- init_tls();
+ ltls = init_tls();
}
// cached sizes
@@ -109,22 +110,22 @@ void* malloc(size_t size) {
ltls->bins[bin] = chunk->next;
return chunk2ptr(chunk);
}
- return bump_alloc(bin2size(bin), MIN_ALIGNMENT);
+ return bump_alloc(ltls, bin2size(bin), MIN_ALIGNMENT);
}
- return bump_alloc(size, MIN_ALIGNMENT);
+ return bump_alloc(ltls, size, MIN_ALIGNMENT);
}
void free(void* ptr) {
- tls_t* ltls = tls;
- if (unlikely(ltls == NULL)) {
- init_tls();
- }
-
if (ptr == NULL) {
return;
}
+ tls_t* ltls = tls;
+ if (unlikely(ltls == NULL)) {
+ ltls = init_tls();
+ }
+
chunk_t* chunk = ptr2chunk(ptr);
if (chunk->size < CACHE_BINS * CACHE_BIN_SEPERATION) {
@@ -155,11 +156,12 @@ void* memalign(size_t alignment, size_t size) {
return NULL;
}
- if (unlikely(tls == NULL)) {
- init_tls();
+ tls_t* ltls = tls;
+ if (unlikely(ltls == NULL)) {
+ ltls = init_tls();
}
- return bump_alloc(size, alignment);
+ return bump_alloc(ltls, size, alignment);
}
int posix_memalign(void **memptr, size_t alignment, size_t size)