X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Fmalloc%2Fmalloc.c;h=1a6d1493291c7ed2d816687d92d100b78c972137;hp=db4287ef061127bbb49714733d53389d4ea6569f;hb=b8ccf8e46bab6ee9d63a6e392c3b33b9aa89255c;hpb=5d0965cb56f92e24b36b98882543f8ee1e03b5ff diff --git a/src/malloc/malloc.c b/src/malloc/malloc.c index db4287ef..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); @@ -43,8 +47,8 @@ static struct { #define DONTCARE 16 #define RECLAIM 163840 -#define CHUNK_SIZE(c) ((c)->csize & SIZE_MASK) -#define CHUNK_PSIZE(c) ((c)->psize & SIZE_MASK) +#define CHUNK_SIZE(c) ((c)->csize & -2) +#define CHUNK_PSIZE(c) ((c)->psize & -2) #define PREV_CHUNK(c) ((struct chunk *)((char *)(c) - CHUNK_PSIZE(c))) #define NEXT_CHUNK(c) ((struct chunk *)((char *)(c) + CHUNK_SIZE(c))) #define MEM_TO_CHUNK(p) (struct chunk *)((char *)(p) - OVERHEAD) @@ -52,28 +56,26 @@ static struct { #define BIN_TO_CHUNK(i) (MEM_TO_CHUNK(&mal.bins[i].head)) #define C_INUSE ((size_t)1) -#define C_FLAGS ((size_t)3) -#define C_SIZE SIZE_MASK #define IS_MMAPPED(c) !((c)->csize & (C_INUSE)) /* 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); @@ -81,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); @@ -194,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); @@ -394,7 +400,7 @@ void *realloc(void *p, size_t n) size_t oldlen = n0 + extra; size_t newlen = n + extra; /* Crash on realloc of freed chunk */ - if ((uintptr_t)base < mal.brk) *(volatile char *)0=0; + if (extra & 1) a_crash(); if (newlen < PAGE_SIZE && (new = malloc(n))) { memcpy(new, p, n-OVERHEAD); free(p); @@ -457,7 +463,7 @@ void free(void *p) char *base = (char *)self - extra; size_t len = CHUNK_SIZE(self) + extra; /* Crash on double free */ - if ((uintptr_t)base < mal.brk) *(volatile char *)0=0; + if (extra & 1) a_crash(); __munmap(base, len); return; }