X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmalloc%2Fmalloc.c;h=88a31ae4f5b0293d3afb73c931f6d828f9d891c9;hb=599f97360389911c293e0ca4c5eb49e007377fba;hp=abf3e8fa268ad8a7244e9a1b938bd3f744fcf0d1;hpb=1c8bead345eca58ddc5177a121142b527937adee;p=musl diff --git a/src/malloc/malloc.c b/src/malloc/malloc.c index abf3e8fa..88a31ae4 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);