diff --git a/examples/greenbean.c b/examples/greenbean.c index d91cac665..e92ceef8f 100644 --- a/examples/greenbean.c +++ b/examples/greenbean.c @@ -18,6 +18,7 @@ #include "libc/fmt/conv.h" #include "libc/fmt/itoa.h" #include "libc/intrin/kprintf.h" +#include "libc/intrin/wait0.internal.h" #include "libc/limits.h" #include "libc/log/check.h" #include "libc/log/log.h" @@ -333,11 +334,17 @@ int main(int argc, char *argv[]) { // clean up terminal line kprintf("\r\e[K"); - // clean up memory - for (i = 0; i < threads; ++i) { - if (stack) munmap(stack[i], GetStackSize()); - if (tls) free(tls[i]); + // join the workers + // this is how we guarantee stacks are safe to free + if (tls && stack) { + for (i = 0; i < threads; ++i) { + _wait0((int *)(tls[i] + 0x38)); + munmap(stack[i], GetStackSize()); + free(tls[i]); + } } + + // clean up memory free(hostips); free(stack); free(tls); diff --git a/libc/calls/getloadavg-nt.c b/libc/calls/getloadavg-nt.c index aad45d409..234bd45fc 100644 --- a/libc/calls/getloadavg-nt.c +++ b/libc/calls/getloadavg-nt.c @@ -29,7 +29,7 @@ static int cpus; static double load; -_Alignas(64) static int lock; +_Alignas(64) static char lock; static struct NtFileTime idle1, kern1, user1; textwindows int sys_getloadavg_nt(double *a, int n) { diff --git a/libc/intrin/once.h b/libc/intrin/once.h index 8aa755ad9..52eb74f2d 100644 --- a/libc/intrin/once.h +++ b/libc/intrin/once.h @@ -2,20 +2,20 @@ #define COSMOPOLITAN_LIBC_INTRIN_ONCE_H_ #include "libc/intrin/spinlock.h" -#define _once(x) \ - ({ \ - typeof(x) oncerc; \ - static bool once; \ - static typeof(oncerc) onceresult; \ - _Alignas(64) static int oncelock; \ - _spinlock(&oncelock); \ - if (once) { \ - oncerc = onceresult; \ - } else { \ - oncerc = onceresult = x; \ - } \ - _spunlock(&oncelock); \ - oncerc; \ +#define _once(x) \ + ({ \ + typeof(x) oncerc; \ + static bool once; \ + static typeof(oncerc) onceresult; \ + _Alignas(64) static char oncelock; \ + _spinlock(&oncelock); \ + if (once) { \ + oncerc = onceresult; \ + } else { \ + oncerc = onceresult = x; \ + } \ + _spunlock(&oncelock); \ + oncerc; \ }) #endif /* COSMOPOLITAN_LIBC_INTRIN_ONCE_H_ */ diff --git a/libc/intrin/pthread.h b/libc/intrin/pthread.h index 1c4267424..ac96d8f23 100644 --- a/libc/intrin/pthread.h +++ b/libc/intrin/pthread.h @@ -7,9 +7,9 @@ COSMOPOLITAN_C_START_ #define PTHREAD_ONCE_INIT 0 -#define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_RECURSIVE -#define PTHREAD_MUTEX_NORMAL 0 -#define PTHREAD_MUTEX_RECURSIVE 1 +#define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL +#define PTHREAD_MUTEX_RECURSIVE 0 +#define PTHREAD_MUTEX_NORMAL 1 #define PTHREAD_MUTEX_ERRORCHECK 2 #define PTHREAD_MUTEX_STALLED 0 #define PTHREAD_MUTEX_ROBUST 1 @@ -26,7 +26,7 @@ typedef int pthread_once_t; typedef struct { int attr; int reent; - _Atomic(int) owner; + _Atomic(int) lock; _Atomic(int) waits; } pthread_mutex_t; diff --git a/libc/intrin/pthread_mutex_lock.c b/libc/intrin/pthread_mutex_lock.c index c2fc26d00..049cb8200 100644 --- a/libc/intrin/pthread_mutex_lock.c +++ b/libc/intrin/pthread_mutex_lock.c @@ -29,11 +29,12 @@ * @return 0 on success, or error number on failure */ int pthread_mutex_lock(pthread_mutex_t *mutex) { - int me, owner; - unsigned tries; + int i, me, owner, tries; for (tries = 0, me = gettid();;) { - owner = 0; - if (atomic_compare_exchange_strong(&mutex->owner, &owner, me)) { + owner = atomic_load_explicit(&mutex->lock, memory_order_relaxed); + if (!owner && atomic_compare_exchange_weak_explicit( + &mutex->lock, &owner, me, memory_order_acquire, + memory_order_relaxed)) { break; } else if (owner == me) { if (mutex->attr != PTHREAD_MUTEX_ERRORCHECK) { @@ -42,15 +43,17 @@ int pthread_mutex_lock(pthread_mutex_t *mutex) { return EDEADLK; } } - atomic_fetch_add(&mutex->waits, 1); - if (!IsLinux() || LinuxFutexWait((void *)&mutex->owner, owner, 0)) { - if (++tries & 7) { - __builtin_ia32_pause(); - } else { - sched_yield(); + if (tries < 7) { + for (i = 0; i != 1 << tries; i++) { } + tries++; + } else if (IsLinux()) { + atomic_fetch_add(&mutex->waits, 1); + LinuxFutexWait(&mutex->lock, owner, 0); + atomic_fetch_sub(&mutex->waits, 1); + } else { + sched_yield(); } - atomic_fetch_sub(&mutex->waits, 1); } ++mutex->reent; return 0; diff --git a/libc/intrin/pthread_mutex_trylock.c b/libc/intrin/pthread_mutex_trylock.c index 20063a856..8e995a4d4 100644 --- a/libc/intrin/pthread_mutex_trylock.c +++ b/libc/intrin/pthread_mutex_trylock.c @@ -29,7 +29,7 @@ int pthread_mutex_trylock(pthread_mutex_t *mutex) { int rc, me, owner; me = gettid(); owner = 0; - if (!atomic_compare_exchange_strong(&mutex->owner, &owner, me) && + if (!atomic_compare_exchange_strong(&mutex->lock, &owner, me) && owner == me) { rc = 0; ++mutex->reent; diff --git a/libc/intrin/pthread_mutex_unlock.c b/libc/intrin/pthread_mutex_unlock.c index 3a9238cd8..265c507c0 100644 --- a/libc/intrin/pthread_mutex_unlock.c +++ b/libc/intrin/pthread_mutex_unlock.c @@ -31,14 +31,14 @@ */ int pthread_mutex_unlock(pthread_mutex_t *mutex) { int owner; - if (mutex->attr == PTHREAD_MUTEX_ERRORCHECK && mutex->owner != gettid()) { + if (mutex->attr == PTHREAD_MUTEX_ERRORCHECK && mutex->lock != gettid()) { return EPERM; } if (!--mutex->reent) { - atomic_store_explicit(&mutex->owner, 0, memory_order_relaxed); + atomic_store_explicit(&mutex->lock, 0, memory_order_relaxed); if (IsLinux() && atomic_load_explicit(&mutex->waits, memory_order_acquire)) { - LinuxFutexWake(&mutex->owner, 1); + LinuxFutexWake(&mutex->lock, 1); } } return 0; diff --git a/libc/intrin/spinlock.h b/libc/intrin/spinlock.h index 8ee2690cb..9294432b4 100644 --- a/libc/intrin/spinlock.h +++ b/libc/intrin/spinlock.h @@ -20,20 +20,19 @@ __atomic_store(__lock, &__x, __ATOMIC_RELEASE); \ }) -#define _spinlock_tiny(lock) \ - ({ \ - autotype(lock) __lock = (lock); \ - while (_trylock(__lock)) { \ - __builtin_ia32_pause(); \ - } \ - 0; \ +#define _spinlock_tiny(lock) \ + ({ \ + while (_trylock(lock)) { \ + __builtin_ia32_pause(); \ + } \ + 0; \ }) #define _spinlock_cooperative(lock) \ ({ \ - autotype(lock) __lock = (lock); \ - typeof(*__lock) __x; \ + char __x; \ unsigned __tries = 0; \ + char *__lock = (lock); \ for (;;) { \ __atomic_load(__lock, &__x, __ATOMIC_RELAXED); \ if (!__x && !_trylock(__lock)) { \ @@ -47,6 +46,27 @@ 0; \ }) +#define _spinlock_cooperative_(lock) \ + ({ \ + char __x; \ + volatile int __i; \ + unsigned __tries = 0; \ + char *__lock = (lock); \ + for (;;) { \ + __atomic_load(__lock, &__x, __ATOMIC_RELAXED); \ + if (!__x && !_trylock(__lock)) { \ + break; \ + } else if (__tries < 7) { \ + for (__i = 0; __i != 1 << __tries; __i++) { \ + } \ + __tries++; \ + } else { \ + _spinlock_yield(); \ + } \ + } \ + 0; \ + }) + #define _trylock(lock) __atomic_test_and_set(lock, __ATOMIC_SEQ_CST) void _spinlock_yield(void); diff --git a/libc/intrin/wait0.internal.h b/libc/intrin/wait0.internal.h new file mode 100644 index 000000000..28d104629 --- /dev/null +++ b/libc/intrin/wait0.internal.h @@ -0,0 +1,20 @@ +#ifndef COSMOPOLITAN_LIBC_INTRIN_WAIT0_H_ +#define COSMOPOLITAN_LIBC_INTRIN_WAIT0_H_ +#include "libc/bits/atomic.h" +#include "libc/calls/calls.h" +#include "libc/dce.h" +#include "libc/linux/futex.h" + +#define _wait0(ptid) \ + do { \ + int x; \ + if (!(x = atomic_load_explicit(ptid, memory_order_relaxed))) { \ + break; \ + } else if (IsLinux()) { \ + LinuxFutexWait(ptid, x, 0); \ + } else { \ + sched_yield(); \ + } \ + } while (1) + +#endif /* COSMOPOLITAN_LIBC_INTRIN_WAIT0_H_ */ diff --git a/libc/nt/gdi32/DdEntry0.s b/libc/nt/gdi32/DdEntry0.s deleted file mode 100644 index b54a028da..000000000 --- a/libc/nt/gdi32/DdEntry0.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry0,DdEntry0,1324 diff --git a/libc/nt/gdi32/DdEntry1.s b/libc/nt/gdi32/DdEntry1.s deleted file mode 100644 index 88ed6fc32..000000000 --- a/libc/nt/gdi32/DdEntry1.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry1,DdEntry1,1325 diff --git a/libc/nt/gdi32/DdEntry10.s b/libc/nt/gdi32/DdEntry10.s deleted file mode 100644 index 9d58c5a92..000000000 --- a/libc/nt/gdi32/DdEntry10.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry10,DdEntry10,1326 diff --git a/libc/nt/gdi32/DdEntry11.s b/libc/nt/gdi32/DdEntry11.s deleted file mode 100644 index 8193ae74a..000000000 --- a/libc/nt/gdi32/DdEntry11.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry11,DdEntry11,1327 diff --git a/libc/nt/gdi32/DdEntry12.s b/libc/nt/gdi32/DdEntry12.s deleted file mode 100644 index ef5706740..000000000 --- a/libc/nt/gdi32/DdEntry12.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry12,DdEntry12,1328 diff --git a/libc/nt/gdi32/DdEntry13.s b/libc/nt/gdi32/DdEntry13.s deleted file mode 100644 index fc13c41ad..000000000 --- a/libc/nt/gdi32/DdEntry13.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry13,DdEntry13,1329 diff --git a/libc/nt/gdi32/DdEntry14.s b/libc/nt/gdi32/DdEntry14.s deleted file mode 100644 index 4b8d188be..000000000 --- a/libc/nt/gdi32/DdEntry14.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry14,DdEntry14,1330 diff --git a/libc/nt/gdi32/DdEntry15.s b/libc/nt/gdi32/DdEntry15.s deleted file mode 100644 index f95c54f2b..000000000 --- a/libc/nt/gdi32/DdEntry15.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry15,DdEntry15,1331 diff --git a/libc/nt/gdi32/DdEntry16.s b/libc/nt/gdi32/DdEntry16.s deleted file mode 100644 index 2ceb8985c..000000000 --- a/libc/nt/gdi32/DdEntry16.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry16,DdEntry16,1332 diff --git a/libc/nt/gdi32/DdEntry17.s b/libc/nt/gdi32/DdEntry17.s deleted file mode 100644 index 2a7648d7a..000000000 --- a/libc/nt/gdi32/DdEntry17.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry17,DdEntry17,1333 diff --git a/libc/nt/gdi32/DdEntry18.s b/libc/nt/gdi32/DdEntry18.s deleted file mode 100644 index 095275a09..000000000 --- a/libc/nt/gdi32/DdEntry18.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry18,DdEntry18,1334 diff --git a/libc/nt/gdi32/DdEntry19.s b/libc/nt/gdi32/DdEntry19.s deleted file mode 100644 index 8222d138d..000000000 --- a/libc/nt/gdi32/DdEntry19.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry19,DdEntry19,1335 diff --git a/libc/nt/gdi32/DdEntry2.s b/libc/nt/gdi32/DdEntry2.s deleted file mode 100644 index b02cd8443..000000000 --- a/libc/nt/gdi32/DdEntry2.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry2,DdEntry2,1336 diff --git a/libc/nt/gdi32/DdEntry20.s b/libc/nt/gdi32/DdEntry20.s deleted file mode 100644 index 38e796a53..000000000 --- a/libc/nt/gdi32/DdEntry20.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry20,DdEntry20,1337 diff --git a/libc/nt/gdi32/DdEntry21.s b/libc/nt/gdi32/DdEntry21.s deleted file mode 100644 index 48d29c6a7..000000000 --- a/libc/nt/gdi32/DdEntry21.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry21,DdEntry21,1338 diff --git a/libc/nt/gdi32/DdEntry22.s b/libc/nt/gdi32/DdEntry22.s deleted file mode 100644 index 50ce1b7ce..000000000 --- a/libc/nt/gdi32/DdEntry22.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry22,DdEntry22,1339 diff --git a/libc/nt/gdi32/DdEntry23.s b/libc/nt/gdi32/DdEntry23.s deleted file mode 100644 index 9626d3758..000000000 --- a/libc/nt/gdi32/DdEntry23.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry23,DdEntry23,1340 diff --git a/libc/nt/gdi32/DdEntry24.s b/libc/nt/gdi32/DdEntry24.s deleted file mode 100644 index e89d76aab..000000000 --- a/libc/nt/gdi32/DdEntry24.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry24,DdEntry24,1341 diff --git a/libc/nt/gdi32/DdEntry25.s b/libc/nt/gdi32/DdEntry25.s deleted file mode 100644 index cc1d638cd..000000000 --- a/libc/nt/gdi32/DdEntry25.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry25,DdEntry25,1342 diff --git a/libc/nt/gdi32/DdEntry26.s b/libc/nt/gdi32/DdEntry26.s deleted file mode 100644 index 3c7949dae..000000000 --- a/libc/nt/gdi32/DdEntry26.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry26,DdEntry26,1343 diff --git a/libc/nt/gdi32/DdEntry27.s b/libc/nt/gdi32/DdEntry27.s deleted file mode 100644 index d088ad12e..000000000 --- a/libc/nt/gdi32/DdEntry27.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry27,DdEntry27,1344 diff --git a/libc/nt/gdi32/DdEntry28.s b/libc/nt/gdi32/DdEntry28.s deleted file mode 100644 index 4f9a21a79..000000000 --- a/libc/nt/gdi32/DdEntry28.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry28,DdEntry28,1345 diff --git a/libc/nt/gdi32/DdEntry29.s b/libc/nt/gdi32/DdEntry29.s deleted file mode 100644 index 3b1bd4f13..000000000 --- a/libc/nt/gdi32/DdEntry29.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry29,DdEntry29,1346 diff --git a/libc/nt/gdi32/DdEntry3.s b/libc/nt/gdi32/DdEntry3.s deleted file mode 100644 index 3d69c6140..000000000 --- a/libc/nt/gdi32/DdEntry3.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry3,DdEntry3,1347 diff --git a/libc/nt/gdi32/DdEntry30.s b/libc/nt/gdi32/DdEntry30.s deleted file mode 100644 index 403a112cc..000000000 --- a/libc/nt/gdi32/DdEntry30.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry30,DdEntry30,1348 diff --git a/libc/nt/gdi32/DdEntry31.s b/libc/nt/gdi32/DdEntry31.s deleted file mode 100644 index 462b58f31..000000000 --- a/libc/nt/gdi32/DdEntry31.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry31,DdEntry31,1349 diff --git a/libc/nt/gdi32/DdEntry32.s b/libc/nt/gdi32/DdEntry32.s deleted file mode 100644 index b87b8b8d9..000000000 --- a/libc/nt/gdi32/DdEntry32.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry32,DdEntry32,1350 diff --git a/libc/nt/gdi32/DdEntry33.s b/libc/nt/gdi32/DdEntry33.s deleted file mode 100644 index 84ce424fb..000000000 --- a/libc/nt/gdi32/DdEntry33.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry33,DdEntry33,1351 diff --git a/libc/nt/gdi32/DdEntry34.s b/libc/nt/gdi32/DdEntry34.s deleted file mode 100644 index 52abe2753..000000000 --- a/libc/nt/gdi32/DdEntry34.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry34,DdEntry34,1352 diff --git a/libc/nt/gdi32/DdEntry35.s b/libc/nt/gdi32/DdEntry35.s deleted file mode 100644 index 49b45d222..000000000 --- a/libc/nt/gdi32/DdEntry35.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry35,DdEntry35,1353 diff --git a/libc/nt/gdi32/DdEntry36.s b/libc/nt/gdi32/DdEntry36.s deleted file mode 100644 index 3c51c1529..000000000 --- a/libc/nt/gdi32/DdEntry36.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry36,DdEntry36,1354 diff --git a/libc/nt/gdi32/DdEntry37.s b/libc/nt/gdi32/DdEntry37.s deleted file mode 100644 index e2eadb885..000000000 --- a/libc/nt/gdi32/DdEntry37.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry37,DdEntry37,1355 diff --git a/libc/nt/gdi32/DdEntry38.s b/libc/nt/gdi32/DdEntry38.s deleted file mode 100644 index 281b331ed..000000000 --- a/libc/nt/gdi32/DdEntry38.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry38,DdEntry38,1356 diff --git a/libc/nt/gdi32/DdEntry39.s b/libc/nt/gdi32/DdEntry39.s deleted file mode 100644 index 4b9e36225..000000000 --- a/libc/nt/gdi32/DdEntry39.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry39,DdEntry39,1357 diff --git a/libc/nt/gdi32/DdEntry4.s b/libc/nt/gdi32/DdEntry4.s deleted file mode 100644 index d729bdfcb..000000000 --- a/libc/nt/gdi32/DdEntry4.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry4,DdEntry4,1358 diff --git a/libc/nt/gdi32/DdEntry40.s b/libc/nt/gdi32/DdEntry40.s deleted file mode 100644 index a8dc142e7..000000000 --- a/libc/nt/gdi32/DdEntry40.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry40,DdEntry40,1359 diff --git a/libc/nt/gdi32/DdEntry41.s b/libc/nt/gdi32/DdEntry41.s deleted file mode 100644 index aaffe57f6..000000000 --- a/libc/nt/gdi32/DdEntry41.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry41,DdEntry41,1360 diff --git a/libc/nt/gdi32/DdEntry42.s b/libc/nt/gdi32/DdEntry42.s deleted file mode 100644 index d146ea69b..000000000 --- a/libc/nt/gdi32/DdEntry42.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry42,DdEntry42,1361 diff --git a/libc/nt/gdi32/DdEntry43.s b/libc/nt/gdi32/DdEntry43.s deleted file mode 100644 index 1a67232c5..000000000 --- a/libc/nt/gdi32/DdEntry43.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry43,DdEntry43,1362 diff --git a/libc/nt/gdi32/DdEntry44.s b/libc/nt/gdi32/DdEntry44.s deleted file mode 100644 index fe7a1030e..000000000 --- a/libc/nt/gdi32/DdEntry44.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry44,DdEntry44,1363 diff --git a/libc/nt/gdi32/DdEntry45.s b/libc/nt/gdi32/DdEntry45.s deleted file mode 100644 index b853411b8..000000000 --- a/libc/nt/gdi32/DdEntry45.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry45,DdEntry45,1364 diff --git a/libc/nt/gdi32/DdEntry46.s b/libc/nt/gdi32/DdEntry46.s deleted file mode 100644 index 9ac43e3c5..000000000 --- a/libc/nt/gdi32/DdEntry46.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry46,DdEntry46,1365 diff --git a/libc/nt/gdi32/DdEntry47.s b/libc/nt/gdi32/DdEntry47.s deleted file mode 100644 index 5fb90a3b5..000000000 --- a/libc/nt/gdi32/DdEntry47.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry47,DdEntry47,1366 diff --git a/libc/nt/gdi32/DdEntry48.s b/libc/nt/gdi32/DdEntry48.s deleted file mode 100644 index 40be41e0c..000000000 --- a/libc/nt/gdi32/DdEntry48.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry48,DdEntry48,1367 diff --git a/libc/nt/gdi32/DdEntry49.s b/libc/nt/gdi32/DdEntry49.s deleted file mode 100644 index 621622130..000000000 --- a/libc/nt/gdi32/DdEntry49.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry49,DdEntry49,1368 diff --git a/libc/nt/gdi32/DdEntry5.s b/libc/nt/gdi32/DdEntry5.s deleted file mode 100644 index 154167112..000000000 --- a/libc/nt/gdi32/DdEntry5.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry5,DdEntry5,1369 diff --git a/libc/nt/gdi32/DdEntry50.s b/libc/nt/gdi32/DdEntry50.s deleted file mode 100644 index 6fabf567d..000000000 --- a/libc/nt/gdi32/DdEntry50.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry50,DdEntry50,1370 diff --git a/libc/nt/gdi32/DdEntry51.s b/libc/nt/gdi32/DdEntry51.s deleted file mode 100644 index e5d6efc39..000000000 --- a/libc/nt/gdi32/DdEntry51.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry51,DdEntry51,1371 diff --git a/libc/nt/gdi32/DdEntry52.s b/libc/nt/gdi32/DdEntry52.s deleted file mode 100644 index ffb246a5e..000000000 --- a/libc/nt/gdi32/DdEntry52.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry52,DdEntry52,1372 diff --git a/libc/nt/gdi32/DdEntry53.s b/libc/nt/gdi32/DdEntry53.s deleted file mode 100644 index cb15fea97..000000000 --- a/libc/nt/gdi32/DdEntry53.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry53,DdEntry53,1373 diff --git a/libc/nt/gdi32/DdEntry54.s b/libc/nt/gdi32/DdEntry54.s deleted file mode 100644 index 2cd8d68e8..000000000 --- a/libc/nt/gdi32/DdEntry54.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry54,DdEntry54,1374 diff --git a/libc/nt/gdi32/DdEntry55.s b/libc/nt/gdi32/DdEntry55.s deleted file mode 100644 index bd3d28ce9..000000000 --- a/libc/nt/gdi32/DdEntry55.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry55,DdEntry55,1375 diff --git a/libc/nt/gdi32/DdEntry56.s b/libc/nt/gdi32/DdEntry56.s deleted file mode 100644 index ddae132c7..000000000 --- a/libc/nt/gdi32/DdEntry56.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry56,DdEntry56,1376 diff --git a/libc/nt/gdi32/DdEntry6.s b/libc/nt/gdi32/DdEntry6.s deleted file mode 100644 index 100809bfb..000000000 --- a/libc/nt/gdi32/DdEntry6.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry6,DdEntry6,1377 diff --git a/libc/nt/gdi32/DdEntry7.s b/libc/nt/gdi32/DdEntry7.s deleted file mode 100644 index 20ad1fc55..000000000 --- a/libc/nt/gdi32/DdEntry7.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry7,DdEntry7,1378 diff --git a/libc/nt/gdi32/DdEntry8.s b/libc/nt/gdi32/DdEntry8.s deleted file mode 100644 index 3502030d0..000000000 --- a/libc/nt/gdi32/DdEntry8.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry8,DdEntry8,1379 diff --git a/libc/nt/gdi32/DdEntry9.s b/libc/nt/gdi32/DdEntry9.s deleted file mode 100644 index 265418dfc..000000000 --- a/libc/nt/gdi32/DdEntry9.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_DdEntry9,DdEntry9,1380 diff --git a/libc/nt/gdi32/GdiEntry1.s b/libc/nt/gdi32/GdiEntry1.s deleted file mode 100644 index e21fb95cb..000000000 --- a/libc/nt/gdi32/GdiEntry1.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry1,GdiEntry1,1518 diff --git a/libc/nt/gdi32/GdiEntry10.s b/libc/nt/gdi32/GdiEntry10.s deleted file mode 100644 index 865d6b48f..000000000 --- a/libc/nt/gdi32/GdiEntry10.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry10,GdiEntry10,1519 diff --git a/libc/nt/gdi32/GdiEntry11.s b/libc/nt/gdi32/GdiEntry11.s deleted file mode 100644 index 297be2389..000000000 --- a/libc/nt/gdi32/GdiEntry11.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry11,GdiEntry11,1520 diff --git a/libc/nt/gdi32/GdiEntry12.s b/libc/nt/gdi32/GdiEntry12.s deleted file mode 100644 index e7d9ddcbc..000000000 --- a/libc/nt/gdi32/GdiEntry12.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry12,GdiEntry12,1521 diff --git a/libc/nt/gdi32/GdiEntry13.s b/libc/nt/gdi32/GdiEntry13.s deleted file mode 100644 index cd17cedc2..000000000 --- a/libc/nt/gdi32/GdiEntry13.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry13,GdiEntry13,1522 diff --git a/libc/nt/gdi32/GdiEntry14.s b/libc/nt/gdi32/GdiEntry14.s deleted file mode 100644 index f2892ec2c..000000000 --- a/libc/nt/gdi32/GdiEntry14.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry14,GdiEntry14,1523 diff --git a/libc/nt/gdi32/GdiEntry15.s b/libc/nt/gdi32/GdiEntry15.s deleted file mode 100644 index 81e3b1dca..000000000 --- a/libc/nt/gdi32/GdiEntry15.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry15,GdiEntry15,1524 diff --git a/libc/nt/gdi32/GdiEntry16.s b/libc/nt/gdi32/GdiEntry16.s deleted file mode 100644 index 394669389..000000000 --- a/libc/nt/gdi32/GdiEntry16.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry16,GdiEntry16,1525 diff --git a/libc/nt/gdi32/GdiEntry2.s b/libc/nt/gdi32/GdiEntry2.s deleted file mode 100644 index 20c3d8e5f..000000000 --- a/libc/nt/gdi32/GdiEntry2.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry2,GdiEntry2,1526 diff --git a/libc/nt/gdi32/GdiEntry3.s b/libc/nt/gdi32/GdiEntry3.s deleted file mode 100644 index 07951818d..000000000 --- a/libc/nt/gdi32/GdiEntry3.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry3,GdiEntry3,1527 diff --git a/libc/nt/gdi32/GdiEntry4.s b/libc/nt/gdi32/GdiEntry4.s deleted file mode 100644 index 0625863e9..000000000 --- a/libc/nt/gdi32/GdiEntry4.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry4,GdiEntry4,1528 diff --git a/libc/nt/gdi32/GdiEntry5.s b/libc/nt/gdi32/GdiEntry5.s deleted file mode 100644 index 833a80134..000000000 --- a/libc/nt/gdi32/GdiEntry5.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry5,GdiEntry5,1529 diff --git a/libc/nt/gdi32/GdiEntry6.s b/libc/nt/gdi32/GdiEntry6.s deleted file mode 100644 index b814bf101..000000000 --- a/libc/nt/gdi32/GdiEntry6.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry6,GdiEntry6,1530 diff --git a/libc/nt/gdi32/GdiEntry7.s b/libc/nt/gdi32/GdiEntry7.s deleted file mode 100644 index 9bd13d5e3..000000000 --- a/libc/nt/gdi32/GdiEntry7.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry7,GdiEntry7,1531 diff --git a/libc/nt/gdi32/GdiEntry8.s b/libc/nt/gdi32/GdiEntry8.s deleted file mode 100644 index 2de940358..000000000 --- a/libc/nt/gdi32/GdiEntry8.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry8,GdiEntry8,1532 diff --git a/libc/nt/gdi32/GdiEntry9.s b/libc/nt/gdi32/GdiEntry9.s deleted file mode 100644 index 43944a292..000000000 --- a/libc/nt/gdi32/GdiEntry9.s +++ /dev/null @@ -1,2 +0,0 @@ -.include "o/libc/nt/codegen.inc" -.imp gdi32,__imp_GdiEntry9,GdiEntry9,1533 diff --git a/libc/runtime/clone.c b/libc/runtime/clone.c index 88f7b87b6..73a8e746a 100644 --- a/libc/runtime/clone.c +++ b/libc/runtime/clone.c @@ -63,7 +63,7 @@ struct CloneArgs { int64_t tid64; }; union { - int lock; + char lock; void *pstack; }; int *ctid; diff --git a/libc/testlib/showerror.c b/libc/testlib/showerror.c index 680ee7ef6..320e2facc 100644 --- a/libc/testlib/showerror.c +++ b/libc/testlib/showerror.c @@ -32,7 +32,7 @@ const char *testlib_showerror_func; const char *testlib_showerror_isfatal; const char *testlib_showerror_macro; const char *testlib_showerror_symbol; -_Alignas(64) static int testlib_showerror_lock; +_Alignas(64) static char testlib_showerror_lock; testonly void testlib_showerror(const char *file, int line, const char *func, const char *method, const char *symbol, diff --git a/libc/thread/join.c b/libc/thread/join.c index c07e98482..05dedb134 100644 --- a/libc/thread/join.c +++ b/libc/thread/join.c @@ -22,7 +22,6 @@ #include "libc/dce.h" #include "libc/errno.h" #include "libc/intrin/asan.internal.h" -#include "libc/intrin/spinlock.h" #include "libc/runtime/runtime.h" #include "libc/str/str.h" #include "libc/sysv/consts/futex.h" diff --git a/test/libc/calls/reservefd_test.c b/test/libc/calls/reservefd_test.c index 5c2a314f7..ace2bb5be 100644 --- a/test/libc/calls/reservefd_test.c +++ b/test/libc/calls/reservefd_test.c @@ -25,6 +25,7 @@ #include "libc/errno.h" #include "libc/intrin/kprintf.h" #include "libc/intrin/spinlock.h" +#include "libc/intrin/wait0.internal.h" #include "libc/macros.internal.h" #include "libc/nexgen32e/threaded.h" #include "libc/rand/rand.h" @@ -128,7 +129,7 @@ TEST(reservefd, tortureTest) { (int *)(tls[i] + 0x38)); } for (i = 0; i < THREADS; ++i) { - _spinlock((int *)(tls[i] + 0x38)); + _wait0((int *)(tls[i] + 0x38)); } // EXPECT_SYS(0, 0, sigaction(SIGALRM, &oldsa, 0)); // EXPECT_SYS(0, 0, setitimer(ITIMER_REAL, &oldit, 0)); diff --git a/test/libc/intrin/pthread_mutex_lock_test.c b/test/libc/intrin/pthread_mutex_lock_test.c index 79d0a6c36..4cfc7ea3f 100644 --- a/test/libc/intrin/pthread_mutex_lock_test.c +++ b/test/libc/intrin/pthread_mutex_lock_test.c @@ -22,7 +22,9 @@ #include "libc/intrin/kprintf.h" #include "libc/intrin/pthread.h" #include "libc/intrin/spinlock.h" +#include "libc/intrin/wait0.internal.h" #include "libc/nexgen32e/threaded.h" +#include "libc/runtime/internal.h" #include "libc/runtime/runtime.h" #include "libc/runtime/stack.h" #include "libc/sysv/consts/clone.h" @@ -32,24 +34,23 @@ #include "libc/testlib/testlib.h" #include "libc/thread/thread.h" -static char tls[64]; +#define THREADS 8 +#define ITERATIONS 512 -int PutProcessInThreadingMode(void *p) { - return 0; -} +char *stack[THREADS]; +char tls[THREADS][64]; -void SetUp(void) { - clone(PutProcessInThreadingMode, - mmap(0, GetStackSize(), PROT_READ | PROT_WRITE, - MAP_STACK | MAP_ANONYMOUS, -1, 0), - GetStackSize(), - CLONE_THREAD | CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | - CLONE_SETTLS, - 0, 0, __initialize_tls(tls), sizeof(tls), 0); +__attribute__((__constructor__)) void init(void) { + __enable_tls(); + __enable_threads(); } TEST(pthread_mutex_lock, normal) { pthread_mutex_t lock; + pthread_mutexattr_t attr; + ASSERT_EQ(0, pthread_mutexattr_init(&attr)); + ASSERT_EQ(0, pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL)); + ASSERT_EQ(0, pthread_mutex_init(&lock, &attr)); ASSERT_EQ(0, pthread_mutex_init(&lock, 0)); ASSERT_EQ(0, pthread_mutex_lock(&lock)); ASSERT_EQ(0, pthread_mutex_unlock(&lock)); @@ -89,6 +90,78 @@ TEST(pthread_mutex_lock, errorcheck) { ASSERT_EQ(0, pthread_mutexattr_destroy(&attr)); } +int count; +_Atomic(int) finished; +_Alignas(64) char slock; +pthread_mutex_t lock; + +int MutexWorker(void *p) { + int i; + for (i = 0; i < ITERATIONS; ++i) { + pthread_mutex_lock(&lock); + ++count; + pthread_mutex_unlock(&lock); + } + return 0; +} + +TEST(pthread_mutex_lock, contention) { + int i; + count = 0; + for (i = 0; i < THREADS; ++i) { + clone(MutexWorker, + (stack[i] = mmap(0, GetStackSize(), PROT_READ | PROT_WRITE, + MAP_STACK | MAP_ANONYMOUS, -1, 0)), + GetStackSize(), + CLONE_THREAD | CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | + CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | CLONE_SETTLS, + 0, 0, __initialize_tls(tls[i]), sizeof(tls[i]), + (int *)(tls[i] + 0x38)); + } + for (i = 0; i < THREADS; ++i) { + _wait0((int *)(tls[i] + 0x38)); + } + ASSERT_EQ(THREADS * ITERATIONS, count); + for (i = 0; i < THREADS; ++i) { + munmap(stack[i], GetStackSize()); + } +} + +int SpinlockWorker(void *p) { + int i; + for (i = 0; i < ITERATIONS; ++i) { + _spinlock(&slock); + ++count; + _spunlock(&slock); + } + ++finished; + return 0; +} + +TEST(_spinlock, contention) { + int i; + count = 0; + finished = 0; + for (i = 0; i < THREADS; ++i) { + clone(SpinlockWorker, + (stack[i] = mmap(0, GetStackSize(), PROT_READ | PROT_WRITE, + MAP_STACK | MAP_ANONYMOUS, -1, 0)), + GetStackSize(), + CLONE_THREAD | CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | + CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | CLONE_SETTLS, + 0, 0, __initialize_tls(tls[i]), sizeof(tls[i]), + (int *)(tls[i] + 0x38)); + } + for (i = 0; i < THREADS; ++i) { + _wait0((int *)(tls[i] + 0x38)); + } + ASSERT_EQ(THREADS, finished); + ASSERT_EQ(THREADS * ITERATIONS, count); + for (i = 0; i < THREADS; ++i) { + munmap(stack[i], GetStackSize()); + } +} + BENCH(pthread_mutex_lock, bench) { char schar = 0; pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; @@ -100,4 +173,6 @@ BENCH(pthread_mutex_lock, bench) { (_spinlock_tiny(&schar), _spunlock(&schar))); EZBENCH2("_spinlock_coop", donothing, (_spinlock_cooperative(&schar), _spunlock(&schar))); + EZBENCH2("content mut", donothing, pthread_mutex_lock_contention()); + EZBENCH2("content spin", donothing, _spinlock_contention()); } diff --git a/test/libc/runtime/clone_test.c b/test/libc/runtime/clone_test.c index 5fd0384a1..25fcb6b2d 100644 --- a/test/libc/runtime/clone_test.c +++ b/test/libc/runtime/clone_test.c @@ -21,6 +21,7 @@ #include "libc/errno.h" #include "libc/intrin/kprintf.h" #include "libc/intrin/spinlock.h" +#include "libc/intrin/wait0.internal.h" #include "libc/log/backtrace.internal.h" #include "libc/mem/mem.h" #include "libc/nexgen32e/gettls.h" @@ -102,14 +103,13 @@ int CloneTest1(void *arg) { TEST(clone, test1) { int ptid = 0; *childetid = -1; - _seizelock(childetid, -1); ASSERT_NE(-1, (tid = clone(CloneTest1, stack, GetStackSize(), CLONE_THREAD | CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_PARENT_SETTID | CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | CLONE_SETTLS, (void *)23, &ptid, tls, 64, childetid))); - _spinlock(childetid); // CLONE_CHILD_CLEARTID + _wait0(childetid); // CLONE_CHILD_CLEARTID ASSERT_NE(gettid(), tid); ASSERT_EQ(tid, ptid); ASSERT_EQ(42, x); @@ -174,7 +174,7 @@ TEST(clone, tlsSystemCallsErrno_wontClobberMainThreadBecauseTls) { } sysbarrier = 1; for (i = 0; i < 8; ++i) { - _spinlock((int *)(tls[i] + 0x38)); + _wait0((int *)(tls[i] + 0x38)); free(tls[i]); munmap(stack[i], GetStackSize()); } diff --git a/test/libc/stdio/dtoa_test.c b/test/libc/stdio/dtoa_test.c index 8d2a315d6..1ccd2a6d9 100644 --- a/test/libc/stdio/dtoa_test.c +++ b/test/libc/stdio/dtoa_test.c @@ -19,6 +19,7 @@ #include "libc/calls/calls.h" #include "libc/fmt/fmt.h" #include "libc/intrin/spinlock.h" +#include "libc/intrin/wait0.internal.h" #include "libc/math.h" #include "libc/runtime/stack.h" #include "libc/stdio/stdio.h" @@ -71,7 +72,7 @@ TEST(dtoa, test) { (int *)(tls[i] + 0x38)); } for (i = 0; i < THREADS; ++i) { - _spinlock((int *)(tls[i] + 0x38)); + _wait0((int *)(tls[i] + 0x38)); } } diff --git a/tool/build/mkdeps.c b/tool/build/mkdeps.c index a27647aef..7501a3cfc 100644 --- a/tool/build/mkdeps.c +++ b/tool/build/mkdeps.c @@ -30,6 +30,7 @@ #include "libc/fmt/fmt.h" #include "libc/intrin/kprintf.h" #include "libc/intrin/spinlock.h" +#include "libc/intrin/wait0.internal.h" #include "libc/log/check.h" #include "libc/log/log.h" #include "libc/macros.internal.h" @@ -131,10 +132,10 @@ struct Sauce *sauces; struct Strings strings; struct Sources sources; const char *buildroot; -_Alignas(64) int galock; -_Alignas(64) int readlock; -_Alignas(64) int writelock; -_Alignas(64) int reportlock; +_Alignas(64) char galock; +_Alignas(64) char readlock; +_Alignas(64) char writelock; +_Alignas(64) char reportlock; unsigned Hash(const void *s, size_t l) { return max(1, crc32c(0, s, l)); @@ -316,7 +317,7 @@ void LoadRelationships(int argc, char *argv[]) { } } for (i = 0; i < threads; ++i) { - _spinlock((int *)(tls[i] + 0x38)); + _wait0((int *)(tls[i] + 0x38)); } getargs_destroy(&ga); } @@ -431,7 +432,7 @@ void Explore(void) { } } for (i = 0; i < threads; ++i) { - _spinlock((int *)(tls[i] + 0x38)); + _wait0((int *)(tls[i] + 0x38)); } } diff --git a/tool/build/wastecpu.c b/tool/build/wastecpu.c index bce1ea198..fbb1d86e1 100644 --- a/tool/build/wastecpu.c +++ b/tool/build/wastecpu.c @@ -18,6 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/struct/sigaction.h" #include "libc/intrin/spinlock.h" +#include "libc/intrin/wait0.internal.h" #include "libc/log/log.h" #include "libc/mem/mem.h" #include "libc/nexgen32e/threaded.h" @@ -71,7 +72,7 @@ int main(int argc, char *argv[]) { usleep(1000); } for (i = 0; i < n; ++i) { - _spinlock((int *)(tls[i] + 0x38)); + _wait0((int *)(tls[i] + 0x38)); free(tls[i]); } } diff --git a/tool/net/redbean.c b/tool/net/redbean.c index 739afabb4..db0646c3d 100644 --- a/tool/net/redbean.c +++ b/tool/net/redbean.c @@ -36,6 +36,7 @@ #include "libc/fmt/itoa.h" #include "libc/intrin/kprintf.h" #include "libc/intrin/nomultics.internal.h" +#include "libc/intrin/wait0.internal.h" #include "libc/log/check.h" #include "libc/log/log.h" #include "libc/macros.internal.h" @@ -6357,7 +6358,7 @@ static int ExitWorker(void) { } if (monitortty) { terminatemonitor = true; - _spinlock(monitortid); + _wait0(monitortid); } _Exit(0); } @@ -7295,7 +7296,7 @@ void RedBean(int argc, char *argv[]) { if (!IsTiny()) { if (monitortty) { terminatemonitor = true; - _spinlock(monitortid); + _wait0(monitortid); munmap(monitorstack, GetStackSize()); free(monitortls); }