diff --git a/src/malloc/malloc.c b/src/malloc/malloc.c index 9698259..0ad540f 100644 --- a/src/malloc/malloc.c +++ b/src/malloc/malloc.c @@ -6,6 +6,7 @@ #include #include #include "libc.h" +#include "lock.h" #include "atomic.h" #include "pthread_impl.h" #include "malloc_impl.h" @@ -26,12 +27,18 @@ int __malloc_replaced; static inline void lock(volatile int *lk) { + if (!libc.threads_minus_1 || !a_cas(lk, 0, INT_MIN + 1)) return; + LOCK(lk); + return; 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] < 0 && a_fetch_add(lk, -(INT_MIN + 1)) != (INT_MIN + 1)) + __wake(lk, 1, 1); + return; if (lk[0]) { a_store(lk, 0); if (lk[1]) __wake(lk, 1, 1);