X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmalloc%2Fmalloc.c;h=1a6d1493291c7ed2d816687d92d100b78c972137;hb=3cd6f5229f079f892411e82fce3fe15c78eef4d8;hp=39c7d05188ce7fc516e312f348dcfb9b688bf3e0;hpb=e5d78fe8df9bd61940abcd98ad07ed69b7da4350;p=musl diff --git a/src/malloc/malloc.c b/src/malloc/malloc.c index 39c7d051..1a6d1493 100644 --- a/src/malloc/malloc.c +++ b/src/malloc/malloc.c @@ -9,6 +9,10 @@ #include "atomic.h" #include "pthread_impl.h" +#if defined(__GNUC__) && defined(__PIC__) +#define inline inline __attribute__((always_inline)) +#endif + uintptr_t __brk(uintptr_t); void *__mmap(void *, size_t, int, int, int, off_t); int __munmap(void *, size_t); @@ -58,20 +62,20 @@ static struct { /* Synchronization tools */ -static void lock(volatile int *lk) +static inline void lock(volatile int *lk) { if (!libc.threads_minus_1) return; while(a_swap(lk, 1)) __wait(lk, lk+1, 1, 1); } -static void unlock(volatile int *lk) +static inline void unlock(volatile int *lk) { if (!libc.threads_minus_1) return; a_store(lk, 0); if (lk[1]) __wake(lk, 1, 1); } -static void lock_bin(int i) +static inline void lock_bin(int i) { if (libc.threads_minus_1) lock(mal.bins[i].lock); @@ -79,7 +83,7 @@ static void lock_bin(int i) mal.bins[i].head = mal.bins[i].tail = BIN_TO_CHUNK(i); } -static void unlock_bin(int i) +static inline void unlock_bin(int i) { if (!libc.threads_minus_1) return; unlock(mal.bins[i].lock); @@ -192,7 +196,11 @@ static int init_malloc(size_t n) return 0; } - mal.brk = __brk(0) + 2*SIZE_ALIGN-1 & -SIZE_ALIGN; + mal.brk = __brk(0); +#ifdef SHARED + mal.brk = mal.brk + PAGE_SIZE-1 & -PAGE_SIZE; +#endif + mal.brk = mal.brk + 2*SIZE_ALIGN-1 & -SIZE_ALIGN; c = expand_heap(n);