|
Message-Id: <163ca89d544cffbaba5fcfbacf56fb589fd2b03a.1514985618.git.Jens.Gustedt@inria.fr> Date: Wed, 3 Jan 2018 14:17:12 +0100 From: Jens Gustedt <Jens.Gustedt@...ia.fr> To: musl@...ts.openwall.com Subject: [PATCH 5/7] use the new lock algorithm for malloc Malloc used a specialized lock implementation in many places. Now that we have a generic lock that has the desired properties, we should just use this, instead of this multitude of very similar lock mechanisms. --- src/malloc/malloc.c | 38 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/src/malloc/malloc.c b/src/malloc/malloc.c index 9e05e1d6..6c667a5a 100644 --- a/src/malloc/malloc.c +++ b/src/malloc/malloc.c @@ -13,6 +13,8 @@ #define inline inline __attribute__((always_inline)) #endif +#include "__lock.h" + void *__mmap(void *, size_t, int, int, int, off_t); int __munmap(void *, size_t); void *__mremap(void *, size_t, size_t, int, ...); @@ -24,7 +26,7 @@ struct chunk { }; struct bin { - volatile int lock[2]; + volatile int lock[1]; struct chunk *head; struct chunk *tail; }; @@ -32,7 +34,7 @@ struct bin { static struct { volatile uint64_t binmap; struct bin bins[64]; - volatile int free_lock[2]; + volatile int free_lock[1]; } mal; @@ -58,30 +60,16 @@ static struct { /* Synchronization tools */ -static inline void lock(volatile int *lk) -{ - if (libc.threads_minus_1) - while(a_swap(lk, 1)) __wait(lk, lk+1, 1, 1); -} - -static inline void unlock(volatile int *lk) -{ - if (lk[0]) { - a_store(lk, 0); - if (lk[1]) __wake(lk, 1, 1); - } -} - static inline void lock_bin(int i) { - lock(mal.bins[i].lock); + __lock_fast(mal.bins[i].lock); if (!mal.bins[i].head) mal.bins[i].head = mal.bins[i].tail = BIN_TO_CHUNK(i); } static inline void unlock_bin(int i) { - unlock(mal.bins[i].lock); + __unlock_fast(mal.bins[i].lock); } static int first_set(uint64_t x) @@ -161,7 +149,7 @@ void *__expand_heap(size_t *); static struct chunk *expand_heap(size_t n) { - static int heap_lock[2]; + static volatile int heap_lock[1]; static void *end; void *p; struct chunk *w; @@ -171,11 +159,11 @@ static struct chunk *expand_heap(size_t n) * we need room for an extra zero-sized sentinel chunk. */ n += SIZE_ALIGN; - lock(heap_lock); + __lock_fast(heap_lock); p = __expand_heap(&n); if (!p) { - unlock(heap_lock); + __unlock_fast(heap_lock); return 0; } @@ -200,7 +188,7 @@ static struct chunk *expand_heap(size_t n) w = MEM_TO_CHUNK(p); w->csize = n | C_INUSE; - unlock(heap_lock); + __unlock_fast(heap_lock); return w; } @@ -481,10 +469,10 @@ void free(void *p) next->psize = final_size | C_INUSE; i = bin_index(final_size); lock_bin(i); - lock(mal.free_lock); + __lock_fast(mal.free_lock); if (self->psize & next->csize & C_INUSE) break; - unlock(mal.free_lock); + __unlock_fast(mal.free_lock); unlock_bin(i); } @@ -510,7 +498,7 @@ void free(void *p) self->csize = final_size; next->psize = final_size; - unlock(mal.free_lock); + __unlock_fast(mal.free_lock); self->next = BIN_TO_CHUNK(i); self->prev = mal.bins[i].tail; -- 2.15.1
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.