Tidy up the threading implementation

The organization of the source files is now much more rational.
Old experiments that didn't work out are now deleted. Naming of
things like files is now more intuitive.
This commit is contained in:
Justine Tunney 2022-09-10 02:56:25 -07:00
parent e9272f03fb
commit 155b378a39
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
199 changed files with 526 additions and 685 deletions

View file

@ -18,14 +18,14 @@
#include "libc/fmt/itoa.h" #include "libc/fmt/itoa.h"
#include "libc/intrin/atomic.h" #include "libc/intrin/atomic.h"
#include "libc/intrin/kprintf.h" #include "libc/intrin/kprintf.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/intrin/wait0.internal.h" #include "libc/intrin/wait0.internal.h"
#include "libc/limits.h" #include "libc/limits.h"
#include "libc/log/check.h" #include "libc/log/check.h"
#include "libc/log/log.h" #include "libc/log/log.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/mem/mem.h" #include "libc/mem/mem.h"
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
#include "libc/runtime/internal.h" #include "libc/runtime/internal.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
#include "libc/runtime/stack.h" #include "libc/runtime/stack.h"

View file

@ -7,7 +7,7 @@
http://creativecommons.org/publicdomain/zero/1.0/ │ http://creativecommons.org/publicdomain/zero/1.0/ │
*/ */
#endif #endif
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/stdio/stdio.h" #include "libc/stdio/stdio.h"
/** /**

View file

@ -17,7 +17,7 @@
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/calls/struct/timespec.h" #include "libc/calls/struct/timespec.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/nexgen32e/rdtsc.h" #include "libc/nexgen32e/rdtsc.h"
#include "libc/nexgen32e/x86feature.h" #include "libc/nexgen32e/x86feature.h"
#include "libc/sysv/consts/clock.h" #include "libc/sysv/consts/clock.h"

View file

@ -1,5 +1,5 @@
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ /*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│
vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi
This is free and unencumbered software released into the public domain. This is free and unencumbered software released into the public domain.
@ -26,5 +26,6 @@
*/ */
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
fstatat64: jmp fstatat fstatat64:
jmp fstatat
.endfn fstatat64,globl .endfn fstatat64,globl

View file

@ -1,5 +1,5 @@
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ /*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│
vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi
This is free and unencumbered software released into the public domain. This is free and unencumbered software released into the public domain.
@ -26,5 +26,6 @@
*/ */
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
ftruncate64: jmp ftruncate ftruncate64:
jmp ftruncate
.endfn ftruncate64,globl .endfn ftruncate64,globl

View file

@ -17,7 +17,7 @@
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/calls/state.internal.h" #include "libc/calls/state.internal.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
// TODO(jart): These should be _Thread_local but doing that currently // TODO(jart): These should be _Thread_local but doing that currently
// causes a regression with runitd.com on Windows. // causes a regression with runitd.com on Windows.

View file

@ -20,7 +20,7 @@
#include "libc/calls/syscall_support-nt.internal.h" #include "libc/calls/syscall_support-nt.internal.h"
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/fmt/conv.h" #include "libc/fmt/conv.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/nt/accounting.h" #include "libc/nt/accounting.h"
#include "libc/runtime/sysconf.h" #include "libc/runtime/sysconf.h"

View file

@ -27,7 +27,7 @@
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/intrin/lockcmpxchgp.h" #include "libc/intrin/lockcmpxchgp.h"
#include "libc/intrin/weaken.h" #include "libc/intrin/weaken.h"
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
textwindows bool _check_interrupts(bool restartable, struct Fd *fd) { textwindows bool _check_interrupts(bool restartable, struct Fd *fd) {
bool res; bool res;

View file

@ -1,5 +1,5 @@
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ /*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│
vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi
This is free and unencumbered software released into the public domain. This is free and unencumbered software released into the public domain.
@ -26,5 +26,6 @@
*/ */
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
lstat64: jmp lstat lstat64:
jmp lstat
.endfn lstat64,globl .endfn lstat64,globl

View file

@ -21,7 +21,7 @@
#include "libc/calls/strace.internal.h" #include "libc/calls/strace.internal.h"
#include "libc/calls/syscall-sysv.internal.h" #include "libc/calls/syscall-sysv.internal.h"
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
#include "libc/runtime/internal.h" #include "libc/runtime/internal.h"
#include "libc/sysv/consts/sicode.h" #include "libc/sysv/consts/sicode.h"
#include "libc/sysv/consts/sig.h" #include "libc/sysv/consts/sig.h"

View file

@ -19,8 +19,8 @@
#include "libc/assert.h" #include "libc/assert.h"
#include "libc/calls/internal.h" #include "libc/calls/internal.h"
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
#include "libc/stdio/lcg.internal.h" #include "libc/stdio/lcg.internal.h"
/** /**

View file

@ -22,7 +22,7 @@
#include "libc/calls/struct/sched_param.internal.h" #include "libc/calls/struct/sched_param.internal.h"
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/intrin/describeflags.internal.h" #include "libc/intrin/describeflags.internal.h"
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
#include "libc/str/str.h" #include "libc/str/str.h"
#include "libc/sysv/errfuns.h" #include "libc/sysv/errfuns.h"

View file

@ -17,7 +17,7 @@
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/calls/state.internal.h" #include "libc/calls/state.internal.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
static pthread_mutex_t __sig_lock_obj; static pthread_mutex_t __sig_lock_obj;

View file

@ -1,5 +1,5 @@
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ /*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│
vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi
This is free and unencumbered software released into the public domain. This is free and unencumbered software released into the public domain.

View file

@ -1,8 +1,8 @@
#ifndef COSMOPOLITAN_LIBC_CALLS_STATE_INTERNAL_H_ #ifndef COSMOPOLITAN_LIBC_CALLS_STATE_INTERNAL_H_
#define COSMOPOLITAN_LIBC_CALLS_STATE_INTERNAL_H_ #define COSMOPOLITAN_LIBC_CALLS_STATE_INTERNAL_H_
#include "libc/intrin/nopl.h" #include "libc/intrin/nopl.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
#if !(__ASSEMBLER__ + __LINKER__ + 0) #if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_ COSMOPOLITAN_C_START_

View file

@ -19,7 +19,7 @@
#include "libc/calls/calls.h" #include "libc/calls/calls.h"
#include "libc/calls/syscall_support-nt.internal.h" #include "libc/calls/syscall_support-nt.internal.h"
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/nt/enum/accessmask.h" #include "libc/nt/enum/accessmask.h"
#include "libc/nt/enum/fileflagandattributes.h" #include "libc/nt/enum/fileflagandattributes.h"
#include "libc/nt/enum/symboliclink.h" #include "libc/nt/enum/symboliclink.h"

View file

@ -30,7 +30,7 @@
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/fmt/conv.h" #include "libc/fmt/conv.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
#include "libc/runtime/internal.h" #include "libc/runtime/internal.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
#include "libc/runtime/stack.h" #include "libc/runtime/stack.h"

View file

@ -23,7 +23,7 @@
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/dns/hoststxt.h" #include "libc/dns/hoststxt.h"
#include "libc/fmt/fmt.h" #include "libc/fmt/fmt.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/nt/systeminfo.h" #include "libc/nt/systeminfo.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"

View file

@ -20,7 +20,7 @@
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/dns/resolvconf.h" #include "libc/dns/resolvconf.h"
#include "libc/fmt/fmt.h" #include "libc/fmt/fmt.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
#include "libc/sock/sock.h" #include "libc/sock/sock.h"

View file

@ -28,7 +28,6 @@
#include "libc/intrin/likely.h" #include "libc/intrin/likely.h"
#include "libc/intrin/lockcmpxchg.h" #include "libc/intrin/lockcmpxchg.h"
#include "libc/intrin/nomultics.internal.h" #include "libc/intrin/nomultics.internal.h"
#include "libc/intrin/pthread.h"
#include "libc/intrin/weaken.h" #include "libc/intrin/weaken.h"
#include "libc/log/backtrace.internal.h" #include "libc/log/backtrace.internal.h"
#include "libc/log/internal.h" #include "libc/log/internal.h"
@ -39,9 +38,7 @@
#include "libc/mem/mem.h" #include "libc/mem/mem.h"
#include "libc/mem/reverse.internal.h" #include "libc/mem/reverse.internal.h"
#include "libc/nexgen32e/gc.internal.h" #include "libc/nexgen32e/gc.internal.h"
#include "libc/nexgen32e/gettls.h"
#include "libc/nexgen32e/stackframe.h" #include "libc/nexgen32e/stackframe.h"
#include "libc/nexgen32e/threaded.h"
#include "libc/nt/enum/version.h" #include "libc/nt/enum/version.h"
#include "libc/nt/runtime.h" #include "libc/nt/runtime.h"
#include "libc/runtime/directmap.internal.h" #include "libc/runtime/directmap.internal.h"
@ -58,6 +55,7 @@
#include "libc/sysv/consts/prot.h" #include "libc/sysv/consts/prot.h"
#include "libc/sysv/errfuns.h" #include "libc/sysv/errfuns.h"
#include "libc/thread/thread.h" #include "libc/thread/thread.h"
#include "libc/thread/tls.h"
#include "third_party/dlmalloc/dlmalloc.h" #include "third_party/dlmalloc/dlmalloc.h"
STATIC_YOINK("_init_asan"); STATIC_YOINK("_init_asan");
@ -938,7 +936,7 @@ static void __asan_trace(struct AsanTrace *bt, const struct StackFrame *bp) {
size_t i, gi; size_t i, gi;
intptr_t addr; intptr_t addr;
struct Garbages *garbage; struct Garbages *garbage;
garbage = __tls_enabled ? ((cthread_t)__get_tls())->garbages : 0; garbage = __tls_enabled ? __get_tls()->tib_garbages : 0;
gi = garbage ? garbage->i : 0; gi = garbage ? garbage->i : 0;
for (f1 = -1, i = 0; bp && i < ARRAYLEN(bt->p); ++i, bp = bp->next) { for (f1 = -1, i = 0; bp && i < ARRAYLEN(bt->p); ++i, bp = bp->next) {
if (f1 != (f2 = ((intptr_t)bp >> 16))) { if (f1 != (f2 = ((intptr_t)bp >> 16))) {

View file

@ -1,7 +1,7 @@
#ifndef COSMOPOLITAN_LIBC_RUNTIME_CXAATEXIT_H_ #ifndef COSMOPOLITAN_LIBC_RUNTIME_CXAATEXIT_H_
#define COSMOPOLITAN_LIBC_RUNTIME_CXAATEXIT_H_ #define COSMOPOLITAN_LIBC_RUNTIME_CXAATEXIT_H_
#include "libc/intrin/nopl.h" #include "libc/intrin/nopl.h"
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
#include "libc/stdio/stdio.h" #include "libc/stdio/stdio.h"
#if !(__ASSEMBLER__ + __LINKER__ + 0) #if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_ COSMOPOLITAN_C_START_

View file

@ -17,7 +17,7 @@
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/cxaatexit.internal.h" #include "libc/intrin/cxaatexit.internal.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
static pthread_mutex_t __cxa_lock_obj; static pthread_mutex_t __cxa_lock_obj;

View file

@ -17,7 +17,7 @@
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/calls/state.internal.h" #include "libc/calls/state.internal.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
void(__fds_lock)(void) { void(__fds_lock)(void) {
pthread_mutex_lock(&__fds_lock_obj); pthread_mutex_lock(&__fds_lock_obj);

View file

@ -23,7 +23,7 @@
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/intrin/describeflags.internal.h" #include "libc/intrin/describeflags.internal.h"
#include "libc/intrin/futex.internal.h" #include "libc/intrin/futex.internal.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/sysv/consts/futex.h" #include "libc/sysv/consts/futex.h"
int _futex(void *, int, int, struct timespec *) hidden; int _futex(void *, int, int, struct timespec *) hidden;

View file

@ -21,7 +21,7 @@
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/intrin/describeflags.internal.h" #include "libc/intrin/describeflags.internal.h"
#include "libc/intrin/futex.internal.h" #include "libc/intrin/futex.internal.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/sysv/consts/futex.h" #include "libc/sysv/consts/futex.h"
int _futex(void *, int, int) hidden; int _futex(void *, int, int) hidden;

View file

@ -19,7 +19,7 @@
#include "libc/calls/extend.internal.h" #include "libc/calls/extend.internal.h"
#include "libc/calls/internal.h" #include "libc/calls/internal.h"
#include "libc/calls/state.internal.h" #include "libc/calls/state.internal.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/intrin/pushpop.h" #include "libc/intrin/pushpop.h"
#include "libc/intrin/weaken.h" #include "libc/intrin/weaken.h"
#include "libc/nt/runtime.h" #include "libc/nt/runtime.h"

View file

@ -21,8 +21,7 @@
#include "libc/calls/state.internal.h" #include "libc/calls/state.internal.h"
#include "libc/calls/syscall-sysv.internal.h" #include "libc/calls/syscall-sysv.internal.h"
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/nexgen32e/gettls.h" #include "libc/thread/tls.h"
#include "libc/nexgen32e/threaded.h"
/** /**
* Returns current thread id. * Returns current thread id.
@ -31,22 +30,6 @@
* if this is the main thread. On NetBSD, gettid() for the main thread * if this is the main thread. On NetBSD, gettid() for the main thread
* is always 1. * is always 1.
* *
* This function issues a system call. That stops being the case as soon
* as __install_tls() is called. That'll happen automatically, when you
* call clone() and provide the TLS parameter. We assume that when a TLS
* block exists, then
*
* *(int *)(__get_tls() + 0x38)
*
* will contain the thread id. Therefore when issuing clone() calls, the
* `CLONE_CHILD_SETTID` and `CLONE_CHILD_CLEARTID` flags should use that
* index as its `ctid` memory.
*
* gettid (single threaded) l: 126𝑐 41𝑛𝑠
* gettid (tls enabled) l: 2𝑐 1𝑛𝑠
*
* The TLS convention is important for reentrant lock performance.
*
* @return thread id greater than zero or -1 w/ errno * @return thread id greater than zero or -1 w/ errno
* @asyncsignalsafe * @asyncsignalsafe
* @threadsafe * @threadsafe
@ -55,7 +38,7 @@
int gettid(void) { int gettid(void) {
int tid; int tid;
if (__tls_enabled && !__vforked) { if (__tls_enabled && !__vforked) {
tid = *(int *)(__get_tls() + 0x38); tid = __get_tls()->tib_tid;
if (tid > 0) { if (tid > 0) {
return tid; return tid;
} }

View file

@ -93,11 +93,6 @@ o/$(MODE)/libc/intrin/futex_wait.o \
o/$(MODE)/libc/intrin/futex_wake.o \ o/$(MODE)/libc/intrin/futex_wake.o \
o/$(MODE)/libc/intrin/gettid.greg.o \ o/$(MODE)/libc/intrin/gettid.greg.o \
o/$(MODE)/libc/intrin/sys_gettid.greg.o \ o/$(MODE)/libc/intrin/sys_gettid.greg.o \
o/$(MODE)/libc/intrin/pthread_mutex_lock.o \
o/$(MODE)/libc/intrin/pthread_mutex_wait.o \
o/$(MODE)/libc/intrin/pthread_mutex_wake.o \
o/$(MODE)/libc/intrin/pthread_mutex_unlock.o \
o/$(MODE)/libc/intrin/pthread_mutex_trylock.o \
o/$(MODE)/libc/intrin/_trylock_debug_4.o \ o/$(MODE)/libc/intrin/_trylock_debug_4.o \
o/$(MODE)/libc/intrin/_spinlock_debug_4.o: private \ o/$(MODE)/libc/intrin/_spinlock_debug_4.o: private \
OVERRIDE_CFLAGS += \ OVERRIDE_CFLAGS += \

View file

@ -35,9 +35,7 @@
#include "libc/limits.h" #include "libc/limits.h"
#include "libc/log/internal.h" #include "libc/log/internal.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/nexgen32e/gettls.h"
#include "libc/nexgen32e/rdtsc.h" #include "libc/nexgen32e/rdtsc.h"
#include "libc/nexgen32e/threaded.h"
#include "libc/nexgen32e/uart.internal.h" #include "libc/nexgen32e/uart.internal.h"
#include "libc/nt/process.h" #include "libc/nt/process.h"
#include "libc/nt/runtime.h" #include "libc/nt/runtime.h"
@ -52,6 +50,8 @@
#include "libc/str/utf16.h" #include "libc/str/utf16.h"
#include "libc/sysv/consts/nr.h" #include "libc/sysv/consts/nr.h"
#include "libc/sysv/consts/prot.h" #include "libc/sysv/consts/prot.h"
#include "libc/thread/tls.h"
#include "libc/thread/tls2.h"
extern hidden struct SymbolTable *__symtab; extern hidden struct SymbolTable *__symtab;
@ -312,7 +312,7 @@ privileged static size_t kformat(char *b, size_t n, const char *fmt,
if (!__tls_enabled) { if (!__tls_enabled) {
x = __pid; x = __pid;
} else { } else {
x = *(int *)(__get_tls_privileged() + 0x38); x = __get_tls_privileged()->tib_tid;
} }
} else { } else {
x = 666; x = 666;

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
.init.start 200,_init__mmi .init.start 200,_init__mmi

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/runtime/memtrack.internal.h" #include "libc/runtime/memtrack.internal.h"
extern pthread_mutex_t __mmi_lock_obj; extern pthread_mutex_t __mmi_lock_obj;

View file

@ -16,6 +16,6 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
pthread_mutex_t __mmi_lock_obj; // recursive :'( pthread_mutex_t __mmi_lock_obj; // recursive :'(

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
/** /**
* Sets thread scheduler policy attribute, e.g. * Sets thread scheduler policy attribute, e.g.

View file

@ -1,205 +0,0 @@
#ifndef COSMOPOLITAN_LIBC_RUNTIME_PTHREAD_H_
#define COSMOPOLITAN_LIBC_RUNTIME_PTHREAD_H_
#define PTHREAD_KEYS_MAX 64
#define PTHREAD_STACK_MIN FRAMESIZE
#define PTHREAD_DESTRUCTOR_ITERATIONS 4
#define PTHREAD_BARRIER_SERIAL_THREAD 31337
#define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL
#define PTHREAD_MUTEX_NORMAL 0
#define PTHREAD_MUTEX_RECURSIVE 1
#define PTHREAD_MUTEX_ERRORCHECK 2
#define PTHREAD_MUTEX_STALLED 0
#define PTHREAD_MUTEX_ROBUST 1
#define PTHREAD_PROCESS_DEFAULT PTHREAD_PROCESS_PRIVATE
#define PTHREAD_PROCESS_PRIVATE 0
#define PTHREAD_PROCESS_SHARED 1
#define PTHREAD_CREATE_JOINABLE 0
#define PTHREAD_CREATE_DETACHED 1
#define PTHREAD_INHERIT_SCHED 0
#define PTHREAD_EXPLICIT_SCHED 1
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_
/* clang-format off */
#define PTHREAD_ONCE_INIT {0}
#define PTHREAD_COND_INITIALIZER {PTHREAD_PROCESS_DEFAULT}
#define PTHREAD_BARRIER_INITIALIZER {PTHREAD_PROCESS_DEFAULT}
#define PTHREAD_RWLOCK_INITIALIZER {PTHREAD_PROCESS_DEFAULT}
#define PTHREAD_MUTEX_INITIALIZER {PTHREAD_MUTEX_DEFAULT, \
PTHREAD_PROCESS_DEFAULT}
/* clang-format on */
typedef uintptr_t pthread_t;
typedef int pthread_id_np_t;
typedef char pthread_condattr_t;
typedef char pthread_rwlockattr_t;
typedef char pthread_barrierattr_t;
typedef unsigned pthread_key_t;
typedef void (*pthread_key_dtor)(void *);
typedef struct pthread_once_s {
_Atomic(char) lock;
} pthread_once_t;
typedef struct pthread_spinlock_s {
_Atomic(char) lock;
} pthread_spinlock_t;
typedef struct pthread_mutex_s {
char type;
char pshared;
int reent;
_Atomic(int) lock;
_Atomic(int) waits;
} pthread_mutex_t;
typedef struct pthread_mutexattr_s {
char type;
char pshared;
} pthread_mutexattr_t;
typedef struct pthread_cond_s {
char pshared;
_Atomic(int) waits;
_Atomic(unsigned) seq;
} pthread_cond_t;
typedef struct pthread_barrier_s {
char pshared;
int count;
_Atomic(int) waits;
_Atomic(int) popped;
} pthread_barrier_t;
typedef struct pthread_rwlock_s {
char pshared;
_Atomic(int) lock;
_Atomic(int) waits;
} pthread_rwlock_t;
typedef struct pthread_attr_s {
char detachstate;
char inheritsched;
int schedparam;
int schedpolicy;
int scope;
unsigned guardsize;
unsigned stacksize;
char *stackaddr;
} pthread_attr_t;
int pthread_yield(void);
void pthread_exit(void *) wontreturn;
pthread_t pthread_self(void) pureconst;
pthread_id_np_t pthread_getthreadid_np(void);
int64_t pthread_getunique_np(pthread_t);
int pthread_setname_np(pthread_t, const char *);
int pthread_getname_np(pthread_t, char *, size_t);
int pthread_getattr_np(pthread_t, pthread_attr_t *);
int pthread_attr_init(pthread_attr_t *);
int pthread_attr_destroy(pthread_attr_t *);
int pthread_attr_getdetachstate(const pthread_attr_t *, int *);
int pthread_attr_setdetachstate(pthread_attr_t *, int);
int pthread_attr_getguardsize(const pthread_attr_t *, size_t *);
int pthread_attr_setguardsize(pthread_attr_t *, size_t);
int pthread_attr_getinheritsched(const pthread_attr_t *, int *);
int pthread_attr_setinheritsched(pthread_attr_t *, int);
int pthread_attr_getschedpolicy(const pthread_attr_t *, int *);
int pthread_attr_setschedpolicy(pthread_attr_t *, int);
int pthread_attr_getscope(const pthread_attr_t *, int *);
int pthread_attr_setscope(pthread_attr_t *, int);
int pthread_attr_getstack(const pthread_attr_t *, void **, size_t *);
int pthread_attr_setstack(pthread_attr_t *, void *, size_t);
int pthread_attr_getstacksize(const pthread_attr_t *, size_t *);
int pthread_attr_setstacksize(pthread_attr_t *, size_t);
int pthread_create(pthread_t *, const pthread_attr_t *, void *(*)(void *),
void *);
int pthread_detach(pthread_t);
int pthread_cancel(pthread_t);
int pthread_join(pthread_t, void **);
int pthread_equal(pthread_t, pthread_t);
int pthread_once(pthread_once_t *, void (*)(void));
int pthread_spin_init(pthread_spinlock_t *, int);
int pthread_spin_destroy(pthread_spinlock_t *);
int pthread_spin_lock(pthread_spinlock_t *);
int pthread_spin_unlock(pthread_spinlock_t *);
int pthread_spin_trylock(pthread_spinlock_t *);
int pthread_mutexattr_init(pthread_mutexattr_t *);
int pthread_mutexattr_destroy(pthread_mutexattr_t *);
int pthread_mutexattr_gettype(const pthread_mutexattr_t *, int *);
int pthread_mutexattr_settype(pthread_mutexattr_t *, int);
int pthread_mutexattr_setpshared(pthread_mutexattr_t *, int);
int pthread_mutexattr_getpshared(const pthread_mutexattr_t *, int *);
int pthread_mutex_init(pthread_mutex_t *, const pthread_mutexattr_t *);
int pthread_mutex_lock(pthread_mutex_t *);
int pthread_mutex_unlock(pthread_mutex_t *);
int pthread_mutex_trylock(pthread_mutex_t *);
int pthread_mutex_destroy(pthread_mutex_t *);
int pthread_mutex_consistent(pthread_mutex_t *);
int pthread_condattr_init(pthread_condattr_t *);
int pthread_condattr_destroy(pthread_condattr_t *);
int pthread_condattr_setpshared(pthread_condattr_t *, int);
int pthread_condattr_getpshared(const pthread_condattr_t *, int *);
int pthread_cond_init(pthread_cond_t *, const pthread_condattr_t *);
int pthread_cond_destroy(pthread_cond_t *);
int pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);
int pthread_cond_broadcast(pthread_cond_t *);
int pthread_cond_signal(pthread_cond_t *);
int pthread_rwlockattr_init(pthread_rwlockattr_t *);
int pthread_rwlockattr_destroy(pthread_rwlockattr_t *);
int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *, int);
int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *, int *);
int pthread_rwlock_init(pthread_rwlock_t *, const pthread_rwlockattr_t *);
int pthread_rwlock_destroy(pthread_rwlock_t *);
int pthread_rwlock_rdlock(pthread_rwlock_t *);
int pthread_rwlock_tryrdlock(pthread_rwlock_t *);
int pthread_rwlock_wrlock(pthread_rwlock_t *);
int pthread_rwlock_trywrlock(pthread_rwlock_t *);
int pthread_rwlock_unlock(pthread_rwlock_t *);
int pthread_key_create(pthread_key_t *, pthread_key_dtor);
int pthread_key_delete(pthread_key_t);
int pthread_setspecific(pthread_key_t, void *);
void *pthread_getspecific(pthread_key_t);
int pthread_barrierattr_init(pthread_barrierattr_t *);
int pthread_barrierattr_destroy(pthread_barrierattr_t *);
int pthread_barrierattr_getpshared(const pthread_barrierattr_t *, int *);
int pthread_barrierattr_setpshared(pthread_barrierattr_t *, int);
int pthread_barrier_wait(pthread_barrier_t *);
int pthread_barrier_destroy(pthread_barrier_t *);
int pthread_barrier_init(pthread_barrier_t *, const pthread_barrierattr_t *,
unsigned);
#define pthread_spin_init(pSpin, multiprocess) ((pSpin)->lock = 0, 0)
#define pthread_spin_destroy(pSpin) ((pSpin)->lock = -1, 0)
#if (__GNUC__ + 0) * 100 + (__GNUC_MINOR__ + 0) >= 407 && \
!defined(__STRICT_ANSI__)
extern const errno_t EBUSY;
#define pthread_spin_lock(pSpin) \
({ \
pthread_spinlock_t *_s = pSpin; \
while (__atomic_test_and_set(&_s->lock, __ATOMIC_SEQ_CST)) donothing; \
0; \
})
#define pthread_spin_unlock(pSpin) \
({ \
pthread_spinlock_t *_s = pSpin; \
__atomic_store_n(&_s->lock, 0, __ATOMIC_RELAXED); \
0; \
})
#define pthread_spin_trylock(pSpin) \
({ \
pthread_spinlock_t *_s = pSpin; \
__atomic_test_and_set(&_s->lock, __ATOMIC_SEQ_CST) ? EBUSY : 0; \
})
#endif /* GCC 4.7+ */
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_LIBC_RUNTIME_PTHREAD_H_ */

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
/** /**
* Initializes mutex. * Initializes mutex.
@ -27,8 +27,8 @@
int pthread_mutex_init(pthread_mutex_t *mutex, int pthread_mutex_init(pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr) { const pthread_mutexattr_t *attr) {
*mutex = (pthread_mutex_t){ *mutex = (pthread_mutex_t){
attr ? attr->type : PTHREAD_MUTEX_DEFAULT, attr ? attr->type : 0,
attr ? attr->pshared : PTHREAD_PROCESS_DEFAULT, attr ? attr->pshared : 0,
}; };
return 0; return 0;
} }

View file

@ -22,9 +22,9 @@
#include "libc/intrin/asmflag.h" #include "libc/intrin/asmflag.h"
#include "libc/intrin/atomic.h" #include "libc/intrin/atomic.h"
#include "libc/intrin/futex.internal.h" #include "libc/intrin/futex.internal.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/linux/futex.h" #include "libc/linux/futex.h"
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
#include "libc/sysv/consts/futex.h" #include "libc/sysv/consts/futex.h"
#include "libc/sysv/consts/nr.h" #include "libc/sysv/consts/nr.h"

View file

@ -20,7 +20,7 @@
#include "libc/calls/calls.h" #include "libc/calls/calls.h"
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/intrin/atomic.h" #include "libc/intrin/atomic.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
/** /**
* Locks mutex if it isn't locked already. * Locks mutex if it isn't locked already.

View file

@ -22,7 +22,7 @@
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/intrin/atomic.h" #include "libc/intrin/atomic.h"
#include "libc/intrin/futex.internal.h" #include "libc/intrin/futex.internal.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
/** /**
* Releases mutex. * Releases mutex.

View file

@ -20,7 +20,7 @@
#include "libc/calls/calls.h" #include "libc/calls/calls.h"
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/intrin/atomic.h" #include "libc/intrin/atomic.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#define INIT 0 #define INIT 0
#define CALLING 1 #define CALLING 1

View file

@ -18,7 +18,7 @@
*/ */
#include "libc/calls/calls.h" #include "libc/calls/calls.h"
#include "libc/calls/strace.internal.h" #include "libc/calls/strace.internal.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
/** /**
* Yields current thread's remaining timeslice to operating system. * Yields current thread's remaining timeslice to operating system.

View file

@ -17,9 +17,9 @@
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/calls/_getauxval.internal.h" #include "libc/calls/_getauxval.internal.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/nexgen32e/rdtsc.h" #include "libc/nexgen32e/rdtsc.h"
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
#include "libc/runtime/internal.h" #include "libc/runtime/internal.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
#include "libc/str/str.h" #include "libc/str/str.h"

View file

@ -16,9 +16,9 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
void TlsIsRequired(void) { void __require_tls(void) {
if (!__tls_enabled) { if (!__tls_enabled) {
notpossible; notpossible;
} }

View file

@ -20,7 +20,7 @@
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/intrin/atomic.h" #include "libc/intrin/atomic.h"
#include "libc/intrin/futex.internal.h" #include "libc/intrin/futex.internal.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/intrin/wait0.internal.h" #include "libc/intrin/wait0.internal.h"
#include "libc/linux/futex.h" #include "libc/linux/futex.h"

View file

@ -1,6 +1,6 @@
#ifndef LIBC_ISYSTEM_LIMITS_H_ #ifndef LIBC_ISYSTEM_LIMITS_H_
#define LIBC_ISYSTEM_LIMITS_H_ #define LIBC_ISYSTEM_LIMITS_H_
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/limits.h" #include "libc/limits.h"
#include "libc/sysv/consts/_posix.h" #include "libc/sysv/consts/_posix.h"
#include "libc/sysv/consts/iov.h" #include "libc/sysv/consts/iov.h"

View file

@ -1,5 +1,5 @@
#ifndef LIBC_ISYSTEM_PTHREAD_H_ #ifndef LIBC_ISYSTEM_PTHREAD_H_
#define LIBC_ISYSTEM_PTHREAD_H_ #define LIBC_ISYSTEM_PTHREAD_H_
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/intrin/pthread2.h" #include "libc/thread/thread2.h"
#endif /* LIBC_ISYSTEM_PTHREAD_H_ */ #endif /* LIBC_ISYSTEM_PTHREAD_H_ */

View file

@ -37,8 +37,6 @@
#include "libc/mem/alg.h" #include "libc/mem/alg.h"
#include "libc/mem/bisectcarleft.internal.h" #include "libc/mem/bisectcarleft.internal.h"
#include "libc/nexgen32e/gc.internal.h" #include "libc/nexgen32e/gc.internal.h"
#include "libc/nexgen32e/gettls.h"
#include "libc/nexgen32e/threaded.h"
#include "libc/runtime/gc.internal.h" #include "libc/runtime/gc.internal.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
#include "libc/runtime/stack.h" #include "libc/runtime/stack.h"
@ -49,7 +47,7 @@
#include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/fileno.h"
#include "libc/sysv/consts/o.h" #include "libc/sysv/consts/o.h"
#include "libc/sysv/consts/sig.h" #include "libc/sysv/consts/sig.h"
#include "libc/thread/thread.h" #include "libc/thread/tls.h"
#include "libc/x/x.h" #include "libc/x/x.h"
#define kBacktraceMaxFrames 128 #define kBacktraceMaxFrames 128
@ -109,7 +107,7 @@ static int PrintBacktraceUsingAddr2line(int fd, const struct StackFrame *bp) {
argv[i++] = "-a"; /* filter out w/ shell script wrapper for old versions */ argv[i++] = "-a"; /* filter out w/ shell script wrapper for old versions */
argv[i++] = "-pCife"; argv[i++] = "-pCife";
argv[i++] = debugbin; argv[i++] = debugbin;
garbage = __tls_enabled ? ((cthread_t)__get_tls())->garbages : 0; garbage = __tls_enabled ? __get_tls()->tib_garbages : 0;
gi = garbage ? garbage->i : 0; gi = garbage ? garbage->i : 0;
for (frame = bp; frame && i < kBacktraceMaxFrames - 1; frame = frame->next) { for (frame = bp; frame && i < kBacktraceMaxFrames - 1; frame = frame->next) {
addr = frame->addr; addr = frame->addr;

View file

@ -26,14 +26,12 @@
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/mem/bisectcarleft.internal.h" #include "libc/mem/bisectcarleft.internal.h"
#include "libc/nexgen32e/gc.internal.h" #include "libc/nexgen32e/gc.internal.h"
#include "libc/nexgen32e/gettls.h"
#include "libc/nexgen32e/stackframe.h" #include "libc/nexgen32e/stackframe.h"
#include "libc/nexgen32e/threaded.h"
#include "libc/runtime/memtrack.internal.h" #include "libc/runtime/memtrack.internal.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
#include "libc/runtime/symbols.internal.h" #include "libc/runtime/symbols.internal.h"
#include "libc/str/str.h" #include "libc/str/str.h"
#include "libc/thread/thread.h" #include "libc/thread/tls.h"
#define LIMIT 100 #define LIMIT 100
@ -57,7 +55,7 @@ noinstrument noasan int PrintBacktraceUsingSymbols(int fd,
struct Garbages *garbage; struct Garbages *garbage;
const struct StackFrame *frame; const struct StackFrame *frame;
if (!bp) bp = __builtin_frame_address(0); if (!bp) bp = __builtin_frame_address(0);
garbage = __tls_enabled ? ((cthread_t)__get_tls())->garbages : 0; garbage = __tls_enabled ? __get_tls()->tib_garbages : 0;
gi = garbage ? garbage->i : 0; gi = garbage ? garbage->i : 0;
for (i = 0, frame = bp; frame; frame = frame->next) { for (i = 0, frame = bp; frame; frame = frame->next) {
if (++i == LIMIT) { if (++i == LIMIT) {

View file

@ -35,7 +35,7 @@
#include "libc/log/log.h" #include "libc/log/log.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/nexgen32e/stackframe.h" #include "libc/nexgen32e/stackframe.h"
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
#include "libc/runtime/internal.h" #include "libc/runtime/internal.h"
#include "libc/runtime/pc.internal.h" #include "libc/runtime/pc.internal.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"

View file

@ -20,10 +20,8 @@
#include "libc/intrin/kprintf.h" #include "libc/intrin/kprintf.h"
#include "libc/log/log.h" #include "libc/log/log.h"
#include "libc/nexgen32e/gc.internal.h" #include "libc/nexgen32e/gc.internal.h"
#include "libc/nexgen32e/gettls.h"
#include "libc/nexgen32e/threaded.h"
#include "libc/stdio/stdio.h" #include "libc/stdio/stdio.h"
#include "libc/thread/thread.h" #include "libc/thread/tls.h"
// clang-format off // clang-format off
/** /**
@ -38,7 +36,7 @@ void PrintGarbage(void) {
kprintf(" SHADOW STACK @ %p\n", __builtin_frame_address(0)); kprintf(" SHADOW STACK @ %p\n", __builtin_frame_address(0));
kprintf("garbage ent. parent frame original ret callback arg \n"); kprintf("garbage ent. parent frame original ret callback arg \n");
kprintf("------------ ------------ ------------------ ------------------ ------------------\n"); kprintf("------------ ------------ ------------------ ------------------ ------------------\n");
if ((g = __tls_enabled ? ((cthread_t)__get_tls())->garbages:0) && g->i) { if ((g = __tls_enabled ? __get_tls()->tib_garbages:0) && g->i) {
for (i = g->i; i--;) { for (i = g->i; i--;) {
symbol = __get_symbol_by_addr(g->p[i].ret); symbol = __get_symbol_by_addr(g->p[i].ret);
if (symbol) { if (symbol) {

View file

@ -20,12 +20,10 @@
#include "libc/intrin/likely.h" #include "libc/intrin/likely.h"
#include "libc/mem/mem.h" #include "libc/mem/mem.h"
#include "libc/nexgen32e/gc.internal.h" #include "libc/nexgen32e/gc.internal.h"
#include "libc/nexgen32e/gettls.h"
#include "libc/nexgen32e/stackframe.h" #include "libc/nexgen32e/stackframe.h"
#include "libc/nexgen32e/threaded.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
#include "libc/str/str.h" #include "libc/str/str.h"
#include "libc/thread/thread.h" #include "libc/thread/tls.h"
static inline bool PointerNotOwnedByParentStackFrame(struct StackFrame *frame, static inline bool PointerNotOwnedByParentStackFrame(struct StackFrame *frame,
struct StackFrame *parent, struct StackFrame *parent,
@ -36,11 +34,11 @@ static inline bool PointerNotOwnedByParentStackFrame(struct StackFrame *frame,
static void TeardownGc(void) { static void TeardownGc(void) {
int i; int i;
cthread_t tls;
struct Garbages *g; struct Garbages *g;
struct CosmoTib *t;
if (__tls_enabled) { if (__tls_enabled) {
tls = (cthread_t)__get_tls(); t = __get_tls();
if ((g = tls->garbages)) { if ((g = t->tib_garbages)) {
// exit() currently doesn't use _gclongjmp() like pthread_exit() // exit() currently doesn't use _gclongjmp() like pthread_exit()
// so we need to run the deferred functions manually. // so we need to run the deferred functions manually.
while (g->i) { while (g->i) {
@ -61,18 +59,18 @@ __attribute__((__constructor__)) static void InitializeGc(void) {
// then rewrite caller's return address on stack. // then rewrite caller's return address on stack.
static void DeferFunction(struct StackFrame *frame, void *fn, void *arg) { static void DeferFunction(struct StackFrame *frame, void *fn, void *arg) {
int n2; int n2;
cthread_t tls;
struct Garbage *p2; struct Garbage *p2;
struct Garbages *g; struct Garbages *g;
TlsIsRequired(); struct CosmoTib *t;
tls = (cthread_t)__get_tls(); __require_tls();
g = tls->garbages; t = __get_tls();
g = t->tib_garbages;
if (UNLIKELY(!g)) { if (UNLIKELY(!g)) {
if (!(g = malloc(sizeof(struct Garbages)))) notpossible; if (!(g = malloc(sizeof(struct Garbages)))) notpossible;
g->i = 0; g->i = 0;
g->n = 4; g->n = 4;
if (!(g->p = malloc(g->n * sizeof(struct Garbage)))) notpossible; if (!(g->p = malloc(g->n * sizeof(struct Garbage)))) notpossible;
tls->garbages = g; t->tib_garbages = g;
} else if (UNLIKELY(g->i == g->n)) { } else if (UNLIKELY(g->i == g->n)) {
p2 = g->p; p2 = g->p;
n2 = g->n + (g->n >> 1); n2 = g->n + (g->n >> 1);

View file

@ -34,7 +34,7 @@
// @see test/libc/runtime/gc_test.c // @see test/libc/runtime/gc_test.c
// @threadsafe // @threadsafe
__gc: mov %fs:0,%rcx # __get_tls() __gc: mov %fs:0,%rcx # __get_tls()
mov 0x18(%rcx),%rcx # cthread_t::garbages mov 0x18(%rcx),%rcx # tls::garbages
decl (%rcx) # ++g->i decl (%rcx) # ++g->i
mov (%rcx),%r8d # r8 = g->i mov (%rcx),%r8d # r8 = g->i
mov 8(%rcx),%r9 # r9 = g->p mov 8(%rcx),%r9 # r9 = g->p

View file

@ -35,7 +35,7 @@ _gclongjmp:
mov %rsp,%rbp mov %rsp,%rbp
.profilable .profilable
mov %fs:0,%r12 # __get_tls() mov %fs:0,%r12 # __get_tls()
mov 0x18(%r12),%r12 # cthread_t::garbages mov 0x18(%r12),%r12 # Tls::garbages
test %r12,%r12 test %r12,%r12
jz 0f jz 0f
movl (%r12),%r13d # garbages.i movl (%r12),%r13d # garbages.i

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
/** /**
* Contains TID of main thread or 0 if threading isn't enabled. * Contains TID of main thread or 0 if threading isn't enabled.

View file

@ -1,16 +0,0 @@
#ifndef COSMOPOLITAN_LIBC_NEXGEN32E_THREADED_H_
#define COSMOPOLITAN_LIBC_NEXGEN32E_THREADED_H_
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_
extern int __threaded;
extern bool __tls_enabled;
extern unsigned __tls_index;
void TlsIsRequired(void);
void *__initialize_tls(char[64]);
void __install_tls(char[64]);
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_LIBC_NEXGEN32E_THREADED_H_ */

View file

@ -1,34 +0,0 @@
/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│
vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi
Copyright 2020 Justine Alexandra Roberts Tunney
Permission to use, copy, modify, and/or distribute this software for
any purpose with or without fee is hereby granted, provided that the
above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
*/
#include "libc/runtime/internal.h"
#include "libc/macros.internal.h"
.text.startup
// Calls global initialization functions.
//
// @param r12 is argc
// @param r13 is argv
// @param r14 is environ
// @param r15 is auxv
_construct:
push %rbp
mov %rsp,%rbp
pop %rbp
ret
.endfn _construct,globl

View file

@ -19,7 +19,7 @@
#include "libc/assert.h" #include "libc/assert.h"
#include "libc/calls/calls.h" #include "libc/calls/calls.h"
#include "libc/calls/strace.internal.h" #include "libc/calls/strace.internal.h"
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
extern int __threadcalls_end[]; extern int __threadcalls_end[];

View file

@ -26,14 +26,13 @@
#include "libc/log/libfatal.internal.h" #include "libc/log/libfatal.internal.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/nexgen32e/msr.h" #include "libc/nexgen32e/msr.h"
#include "libc/nexgen32e/threaded.h"
#include "libc/nt/thread.h" #include "libc/nt/thread.h"
#include "libc/runtime/internal.h" #include "libc/runtime/internal.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
#include "libc/stdalign.internal.h" #include "libc/stdalign.internal.h"
#include "libc/str/str.h" #include "libc/str/str.h"
#include "libc/sysv/consts/nrlinux.h" #include "libc/sysv/consts/nrlinux.h"
#include "libc/thread/thread.h" #include "libc/thread/tls.h"
#include "third_party/xed/x86.h" #include "third_party/xed/x86.h"
#define __NR_sysarch 0x000000a5 // freebsd+netbsd #define __NR_sysarch 0x000000a5 // freebsd+netbsd
@ -48,7 +47,7 @@
#define _TLSZ ((intptr_t)_tls_size) #define _TLSZ ((intptr_t)_tls_size)
#define _TLDZ ((intptr_t)_tdata_size) #define _TLDZ ((intptr_t)_tdata_size)
#define _TIBZ sizeof(struct cthread_descriptor_t) #define _TIBZ sizeof(struct CosmoTib)
int sys_enable_tls(); int sys_enable_tls();
@ -97,14 +96,14 @@ _Alignas(long) static char __static_tls[5008];
*/ */
privileged void __enable_tls(void) { privileged void __enable_tls(void) {
size_t siz; size_t siz;
cthread_t tib; struct CosmoTib *tib;
char *mem, *tls; char *mem, *tls;
siz = ROUNDUP(_TLSZ + _TIBZ, alignof(__static_tls)); siz = ROUNDUP(_TLSZ + _TIBZ, alignof(__static_tls));
if (siz <= sizeof(__static_tls)) { if (siz <= sizeof(__static_tls)) {
// if tls requirement is small then use the static tls block // if tls requirement is small then use the static tls block
// which helps avoid a system call for appes with little tls // which helps avoid a system call for appes with little tls
// this is crucial to keeping life.com 16 kilobytes in size! // this is crucial to keeping life.com 16 kilobytes in size!
_Static_assert(alignof(__static_tls) >= alignof(cthread_t)); _Static_assert(alignof(__static_tls) >= alignof(struct CosmoTib));
mem = __static_tls; mem = __static_tls;
} else { } else {
// if this binary needs a hefty tls block then we'll bank on // if this binary needs a hefty tls block then we'll bank on
@ -116,17 +115,17 @@ privileged void __enable_tls(void) {
mem = weaken(_mapanon)(siz); mem = weaken(_mapanon)(siz);
assert(mem); assert(mem);
} }
tib = (cthread_t)(mem + siz - _TIBZ); tib = (struct CosmoTib *)(mem + siz - _TIBZ);
tls = mem + siz - _TIBZ - _TLSZ; tls = mem + siz - _TIBZ - _TLSZ;
tib->self = tib; tib->tib_self = tib;
tib->self2 = tib; tib->tib_self2 = tib;
tib->err = __errno; tib->tib_errno = __errno;
if (IsLinux()) { if (IsLinux()) {
// gnu/systemd guarantees pid==tid for the main thread so we can // gnu/systemd guarantees pid==tid for the main thread so we can
// avoid issuing a superfluous system call at startup in program // avoid issuing a superfluous system call at startup in program
tib->tid = __pid; tib->tib_tid = __pid;
} else { } else {
tib->tid = sys_gettid(); tib->tib_tid = sys_gettid();
} }
__repmovsb(tls, _tdata_start, _TLDZ); __repmovsb(tls, _tdata_start, _TLDZ);

View file

@ -29,7 +29,7 @@
#include "libc/mem/alloca.h" #include "libc/mem/alloca.h"
#include "libc/mem/mem.h" #include "libc/mem/mem.h"
#include "libc/nexgen32e/nt2sysv.h" #include "libc/nexgen32e/nt2sysv.h"
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
#include "libc/nt/console.h" #include "libc/nt/console.h"
#include "libc/nt/createfile.h" #include "libc/nt/createfile.h"
#include "libc/nt/enum/accessmask.h" #include "libc/nt/enum/accessmask.h"

View file

@ -22,11 +22,10 @@
#include "libc/calls/syscall-nt.internal.h" #include "libc/calls/syscall-nt.internal.h"
#include "libc/calls/syscall-sysv.internal.h" #include "libc/calls/syscall-sysv.internal.h"
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/nexgen32e/gettls.h"
#include "libc/nexgen32e/threaded.h"
#include "libc/nt/process.h" #include "libc/nt/process.h"
#include "libc/runtime/internal.h" #include "libc/runtime/internal.h"
#include "libc/sysv/consts/sig.h" #include "libc/sysv/consts/sig.h"
#include "libc/thread/tls.h"
/** /**
* Creates new process. * Creates new process.
@ -61,7 +60,7 @@ int fork(void) {
parent = __pid; parent = __pid;
__pid = dx; __pid = dx;
if (__tls_enabled) { if (__tls_enabled) {
*(int *)(__get_tls() + 0x38) = IsLinux() ? dx : sys_gettid(); __get_tls()->tib_tid = IsLinux() ? dx : sys_gettid();
} }
STRACE("fork() → 0 (child of %d)", parent); STRACE("fork() → 0 (child of %d)", parent);
sigprocmask(SIG_SETMASK, &old, 0); sigprocmask(SIG_SETMASK, &old, 0);

View file

@ -23,13 +23,12 @@
#include "libc/intrin/kprintf.h" #include "libc/intrin/kprintf.h"
#include "libc/intrin/nopl.h" #include "libc/intrin/nopl.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/nexgen32e/gettls.h"
#include "libc/nexgen32e/stackframe.h" #include "libc/nexgen32e/stackframe.h"
#include "libc/nexgen32e/threaded.h"
#include "libc/runtime/internal.h" #include "libc/runtime/internal.h"
#include "libc/runtime/stack.h" #include "libc/runtime/stack.h"
#include "libc/runtime/symbols.internal.h" #include "libc/runtime/symbols.internal.h"
#include "libc/thread/thread.h" #include "libc/thread/tls.h"
#include "libc/thread/tls2.h"
#define MAX_NESTING 512 #define MAX_NESTING 512
@ -44,7 +43,7 @@
void ftrace_hook(void); void ftrace_hook(void);
static int g_stackdigs; static int g_stackdigs;
static struct Ftrace g_ftrace; static struct CosmoFtrace g_ftrace;
static privileged inline int GetNestingLevelImpl(struct StackFrame *frame) { static privileged inline int GetNestingLevelImpl(struct StackFrame *frame) {
int nesting = -2; int nesting = -2;
@ -55,12 +54,12 @@ static privileged inline int GetNestingLevelImpl(struct StackFrame *frame) {
return MAX(0, nesting); return MAX(0, nesting);
} }
static privileged inline int GetNestingLevel(struct Ftrace *ft, static privileged inline int GetNestingLevel(struct CosmoFtrace *ft,
struct StackFrame *sf) { struct StackFrame *sf) {
int nesting; int nesting;
nesting = GetNestingLevelImpl(sf); nesting = GetNestingLevelImpl(sf);
if (nesting < ft->skew) ft->skew = nesting; if (nesting < ft->ft_skew) ft->ft_skew = nesting;
nesting -= ft->skew; nesting -= ft->ft_skew;
return MIN(MAX_NESTING, nesting); return MIN(MAX_NESTING, nesting);
} }
@ -73,27 +72,27 @@ static privileged inline int GetNestingLevel(struct Ftrace *ft,
*/ */
privileged void ftracer(void) { privileged void ftracer(void) {
long stackuse; long stackuse;
struct Ftrace *ft; struct CosmoFtrace *ft;
struct StackFrame *sf; struct StackFrame *sf;
if (__tls_enabled) { if (__tls_enabled) {
ft = (struct Ftrace *)(__get_tls_privileged() + 0x08); ft = &__get_tls_privileged()->tib_ftrace;
} else { } else {
ft = &g_ftrace; ft = &g_ftrace;
} }
if (_cmpxchg(&ft->once, false, true)) { if (_cmpxchg(&ft->ft_once, false, true)) {
ft->lastaddr = -1; ft->ft_lastaddr = -1;
ft->skew = GetNestingLevelImpl(__builtin_frame_address(0)); ft->ft_skew = GetNestingLevelImpl(__builtin_frame_address(0));
} }
if (_cmpxchg(&ft->noreentry, false, true)) { if (_cmpxchg(&ft->ft_noreentry, false, true)) {
sf = __builtin_frame_address(0); sf = __builtin_frame_address(0);
sf = sf->next; sf = sf->next;
if (sf->addr != ft->lastaddr) { if (sf->addr != ft->ft_lastaddr) {
stackuse = GetStackAddr() + GetStackSize() - (intptr_t)sf; stackuse = GetStackAddr() + GetStackSize() - (intptr_t)sf;
kprintf("%rFUN %6P %'13T %'*ld %*s%t\n", g_stackdigs, stackuse, kprintf("%rFUN %6P %'13T %'*ld %*s%t\n", g_stackdigs, stackuse,
GetNestingLevel(ft, sf) * 2, "", sf->addr); GetNestingLevel(ft, sf) * 2, "", sf->addr);
ft->lastaddr = sf->addr; ft->ft_lastaddr = sf->addr;
} }
ft->noreentry = false; ft->ft_noreentry = false;
} }
} }

View file

@ -20,7 +20,7 @@
#include "libc/calls/strace.internal.h" #include "libc/calls/strace.internal.h"
#include "libc/intrin/bits.h" #include "libc/intrin/bits.h"
#include "libc/intrin/promises.internal.h" #include "libc/intrin/promises.internal.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/intrin/weaken.h" #include "libc/intrin/weaken.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/runtime/internal.h" #include "libc/runtime/internal.h"

View file

@ -5,7 +5,7 @@
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/intrin/nopl.h" #include "libc/intrin/nopl.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
#include "libc/nt/version.h" #include "libc/nt/version.h"
#include "libc/runtime/stack.h" #include "libc/runtime/stack.h"
#include "libc/sysv/consts/ss.h" #include "libc/sysv/consts/ss.h"

View file

@ -28,7 +28,7 @@
#include "libc/intrin/bits.h" #include "libc/intrin/bits.h"
#include "libc/intrin/describeflags.internal.h" #include "libc/intrin/describeflags.internal.h"
#include "libc/intrin/likely.h" #include "libc/intrin/likely.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/intrin/safemacros.internal.h" #include "libc/intrin/safemacros.internal.h"
#include "libc/intrin/weaken.h" #include "libc/intrin/weaken.h"
#include "libc/limits.h" #include "libc/limits.h"

View file

@ -26,7 +26,7 @@
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/intrin/asan.internal.h" #include "libc/intrin/asan.internal.h"
#include "libc/intrin/nopl.h" #include "libc/intrin/nopl.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/intrin/weaken.h" #include "libc/intrin/weaken.h"
#include "libc/mem/mem.h" #include "libc/mem/mem.h"
#include "libc/nt/enum/fileflagandattributes.h" #include "libc/nt/enum/fileflagandattributes.h"

View file

@ -17,7 +17,7 @@
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/calls/calls.h" #include "libc/calls/calls.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/mem/mem.h" #include "libc/mem/mem.h"
#include "libc/stdio/internal.h" #include "libc/stdio/internal.h"
#include "libc/stdio/stdio.h" #include "libc/stdio/stdio.h"

View file

@ -1,7 +1,7 @@
#ifndef COSMOPOLITAN_LIBC_STDIO_FFLUSH_H_ #ifndef COSMOPOLITAN_LIBC_STDIO_FFLUSH_H_
#define COSMOPOLITAN_LIBC_STDIO_FFLUSH_H_ #define COSMOPOLITAN_LIBC_STDIO_FFLUSH_H_
#include "libc/intrin/nopl.h" #include "libc/intrin/nopl.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/stdio/stdio.h" #include "libc/stdio/stdio.h"
#if !(__ASSEMBLER__ + __LINKER__ + 0) #if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_ COSMOPOLITAN_C_START_

View file

@ -19,7 +19,7 @@
#include "libc/calls/calls.h" #include "libc/calls/calls.h"
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/intrin/bits.h" #include "libc/intrin/bits.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/intrin/pushpop.h" #include "libc/intrin/pushpop.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/mem/arraylist.internal.h" #include "libc/mem/arraylist.internal.h"

View file

@ -17,7 +17,7 @@
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/calls/calls.h" #include "libc/calls/calls.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/stdio/fflush.internal.h" #include "libc/stdio/fflush.internal.h"
#include "libc/stdio/lock.h" #include "libc/stdio/lock.h"
#include "libc/stdio/stdio.h" #include "libc/stdio/stdio.h"

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/mem/mem.h" #include "libc/mem/mem.h"
#include "libc/stdio/stdio.h" #include "libc/stdio/stdio.h"
#include "libc/str/str.h" #include "libc/str/str.h"

View file

@ -27,11 +27,10 @@
*/ */
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/mem/mem.h" #include "libc/mem/mem.h"
#include "libc/nexgen32e/gettls.h"
#include "libc/stdio/iconv.h" #include "libc/stdio/iconv.h"
#include "libc/str/str.h"
#include "libc/thread/thread.h"
#include "libc/str/locale.h" #include "libc/str/locale.h"
#include "libc/str/str.h"
#include "libc/thread/tls.h"
// clang-format off // clang-format off
asm(".ident\t\"\\n\\n\ asm(".ident\t\"\\n\\n\
@ -283,7 +282,7 @@ size_t iconv(iconv_t cd, char **restrict in, size_t *restrict inb, char **restri
int err; int err;
unsigned char type = map[-1]; unsigned char type = map[-1];
unsigned char totype = tomap[-1]; unsigned char totype = tomap[-1];
locale_t *ploc = &((cthread_t)__get_tls())->locale; locale_t *ploc = (locale_t *)&__get_tls()->tib_locale;
locale_t loc = *ploc; locale_t loc = *ploc;
if (!in || !*in || !*inb) return 0; if (!in || !*in || !*inb) return 0;

View file

@ -1,7 +1,7 @@
#ifndef COSMOPOLITAN_LIBC_STDIO_LOCK_H_ #ifndef COSMOPOLITAN_LIBC_STDIO_LOCK_H_
#define COSMOPOLITAN_LIBC_STDIO_LOCK_H_ #define COSMOPOLITAN_LIBC_STDIO_LOCK_H_
#include "libc/intrin/nopl.h" #include "libc/intrin/nopl.h"
#include "libc/nexgen32e/threaded.h" #include "libc/thread/tls.h"
#include "libc/stdio/stdio.h" #include "libc/stdio/stdio.h"
#if !(__ASSEMBLER__ + __LINKER__ + 0) #if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_ COSMOPOLITAN_C_START_

View file

@ -1,5 +1,5 @@
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ /*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│
vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi
This is free and unencumbered software released into the public domain. This is free and unencumbered software released into the public domain.
@ -26,5 +26,6 @@
*/ */
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
readdir64: jmp readdir readdir64:
jmp readdir
.endfn readdir64,globl .endfn readdir64,globl

View file

@ -20,7 +20,7 @@
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/calls/calls.h" #include "libc/calls/calls.h"
#include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/fileno.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
.init.start 400,_init_stderr .init.start 400,_init_stderr

View file

@ -20,7 +20,7 @@
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/calls/calls.h" #include "libc/calls/calls.h"
#include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/fileno.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
.init.start 400,_init_stdin .init.start 400,_init_stdin

View file

@ -1,7 +1,7 @@
#ifndef COSMOPOLITAN_LIBC_STDIO_STDIO_H_ #ifndef COSMOPOLITAN_LIBC_STDIO_STDIO_H_
#define COSMOPOLITAN_LIBC_STDIO_STDIO_H_ #define COSMOPOLITAN_LIBC_STDIO_STDIO_H_
#include "libc/fmt/pflink.h" #include "libc/fmt/pflink.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#define _STDIO_H #define _STDIO_H
#define L_ctermid 20 #define L_ctermid 20

View file

@ -20,7 +20,7 @@
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/calls/calls.h" #include "libc/calls/calls.h"
#include "libc/sysv/consts/fileno.h" #include "libc/sysv/consts/fileno.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
.init.start 400,_init_stdout .init.start 400,_init_stdout

View file

@ -25,11 +25,10 @@
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/ */
#include "libc/nexgen32e/gettls.h"
#include "libc/thread/thread.h"
#include "libc/str/langinfo.h" #include "libc/str/langinfo.h"
#include "libc/str/locale.h" #include "libc/str/locale.h"
#include "libc/str/nltypes.h" #include "libc/str/nltypes.h"
#include "libc/thread/tls.h"
asm(".ident\t\"\\n\\n\ asm(".ident\t\"\\n\\n\
Musl libc (MIT License)\\n\ Musl libc (MIT License)\\n\
@ -101,5 +100,5 @@ char *nl_langinfo_l(nl_item item, locale_t loc)
char *nl_langinfo(nl_item item) char *nl_langinfo(nl_item item)
{ {
return nl_langinfo_l(item, ((cthread_t)__get_tls())->locale); return nl_langinfo_l(item, (locale_t)__get_tls()->tib_locale);
} }

View file

@ -17,16 +17,12 @@
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/nexgen32e/gettls.h" #include "libc/thread/tls2.h"
#include "libc/nexgen32e/threaded.h"
/** /**
* Returns address of errno variable. * Returns address of errno variable.
*
* @see __initialize_tls()
* @see __install_tls()
*/ */
privileged nocallersavedregisters errno_t *(__errno_location)(void) { privileged nocallersavedregisters errno_t *(__errno_location)(void) {
if (!__tls_enabled) return &__errno; if (!__tls_enabled) return &__errno;
return (errno_t *)(__get_tls_privileged() + 0x3c); return &__get_tls_privileged()->tib_errno;
} }

View file

@ -28,7 +28,7 @@
#include "libc/fmt/fmt.h" #include "libc/fmt/fmt.h"
#include "libc/fmt/itoa.h" #include "libc/fmt/itoa.h"
#include "libc/intrin/atomic.h" #include "libc/intrin/atomic.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/intrin/weaken.h" #include "libc/intrin/weaken.h"
#include "libc/log/check.h" #include "libc/log/check.h"
#include "libc/log/internal.h" #include "libc/log/internal.h"

View file

@ -23,11 +23,8 @@
#include "libc/dce.h" #include "libc/dce.h"
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/intrin/asan.internal.h" #include "libc/intrin/asan.internal.h"
#include "libc/intrin/pthread.h"
#include "libc/limits.h" #include "libc/limits.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/nexgen32e/gettls.h"
#include "libc/nexgen32e/threaded.h"
#include "libc/nt/runtime.h" #include "libc/nt/runtime.h"
#include "libc/nt/thread.h" #include "libc/nt/thread.h"
#include "libc/nt/thunk/msabi.h" #include "libc/nt/thunk/msabi.h"
@ -42,6 +39,8 @@
#include "libc/sysv/errfuns.h" #include "libc/sysv/errfuns.h"
#include "libc/thread/freebsd.internal.h" #include "libc/thread/freebsd.internal.h"
#include "libc/thread/openbsd.internal.h" #include "libc/thread/openbsd.internal.h"
#include "libc/thread/thread.h"
#include "libc/thread/tls.h"
#include "libc/thread/xnu.internal.h" #include "libc/thread/xnu.internal.h"
#define __NR_thr_new 455 #define __NR_thr_new 455
@ -495,20 +494,6 @@ static int CloneLinux(int (*func)(void *arg, int tid), char *stk, size_t stksz,
* _Exit1() which terminates the thread. Even though the callback says * _Exit1() which terminates the thread. Even though the callback says
* it supports a return code, that'll only work on Linux and Windows. * it supports a return code, that'll only work on Linux and Windows.
* *
* The `tls` parameter is for thread-local storage. If you specify this
* then clone() will implicitly rewire libc (e.g. errno) to use TLS:
*
* static char tib[64];
* __initialize_tls(tib);
* __install_tls(tib);
*
* If you want a main process TLS size that's larger call it manually.
* Once you've done the above and/or started creating your own threads
* you'll be able to access your `tls` thread information block, using
*
* char *p = __get_tls();
* printf("errno is %d\n", *(int *)(p + 0x3c));
*
* This function follows the same ABI convention as the Linux userspace * This function follows the same ABI convention as the Linux userspace
* libraries, with a few small changes. The varargs has been removed to * libraries, with a few small changes. The varargs has been removed to
* help prevent broken code, and the stack size and tls size parameters * help prevent broken code, and the stack size and tls size parameters

View file

@ -1,6 +1,6 @@
#ifndef COSMOPOLITAN_LIBC_THREAD_INTERNAL_H_ #ifndef COSMOPOLITAN_LIBC_THREAD_INTERNAL_H_
#define COSMOPOLITAN_LIBC_THREAD_INTERNAL_H_ #define COSMOPOLITAN_LIBC_THREAD_INTERNAL_H_
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#if !(__ASSEMBLER__ + __LINKER__ + 0) #if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_ COSMOPOLITAN_C_START_

View file

@ -22,12 +22,12 @@
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
#include "libc/str/str.h" #include "libc/str/str.h"
#include "libc/thread/spawn.h" #include "libc/thread/spawn.h"
#include "libc/thread/thread.h" #include "libc/thread/tls.h"
#define _TLSZ ((intptr_t)_tls_size) #define _TLSZ ((intptr_t)_tls_size)
#define _TLDZ ((intptr_t)_tdata_size) #define _TLDZ ((intptr_t)_tdata_size)
#define _TIBZ sizeof(struct cthread_descriptor_t) #define _TIBZ sizeof(struct CosmoTib)
#define _MEMZ ROUNDUP(_TLSZ + _TIBZ, _Alignof(struct cthread_descriptor_t)) #define _MEMZ ROUNDUP(_TLSZ + _TIBZ, _Alignof(struct CosmoTib))
/** /**
* Allocates thread-local storage memory for new thread. * Allocates thread-local storage memory for new thread.
@ -35,18 +35,18 @@
*/ */
char *_mktls(char **out_tib) { char *_mktls(char **out_tib) {
char *tls; char *tls;
cthread_t tib; struct CosmoTib *tib;
// Allocate enough TLS memory for all the GNU Linuker (_tls_size) // Allocate enough TLS memory for all the GNU Linuker (_tls_size)
// organized _Thread_local data, as well as Cosmpolitan Libc (64) // organized _Thread_local data, as well as Cosmpolitan Libc (64)
if (!(tls = calloc(1, _MEMZ))) return 0; if (!(tls = calloc(1, _MEMZ))) return 0;
// set up thread information block // set up thread information block
tib = (cthread_t)(tls + _MEMZ - _TIBZ); tib = (struct CosmoTib *)(tls + _MEMZ - _TIBZ);
tib->self = tib; tib->tib_self = tib;
tib->self2 = tib; tib->tib_self2 = tib;
tib->err = 0; tib->tib_errno = 0;
tib->tid = -1; tib->tib_tid = -1;
memmove(tls, _tdata_start, _TLDZ); memmove(tls, _tdata_start, _TLDZ);
if (out_tib) { if (out_tib) {

View file

@ -1,8 +1,8 @@
#ifndef COSMOPOLITAN_LIBC_THREAD_POSIXTHREAD_INTERNAL_H_ #ifndef COSMOPOLITAN_LIBC_THREAD_POSIXTHREAD_INTERNAL_H_
#define COSMOPOLITAN_LIBC_THREAD_POSIXTHREAD_INTERNAL_H_ #define COSMOPOLITAN_LIBC_THREAD_POSIXTHREAD_INTERNAL_H_
#include "libc/calls/struct/sched_param.h" #include "libc/calls/struct/sched_param.h"
#include "libc/intrin/pthread.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
#include "libc/thread/thread.h"
#if !(__ASSEMBLER__ + __LINKER__ + 0) #if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_ COSMOPOLITAN_C_START_
@ -67,13 +67,14 @@ struct PosixThread {
pthread_attr_t attr; pthread_attr_t attr;
}; };
void _pthread_free(struct PosixThread *) hidden;
void _pthread_wait(struct PosixThread *) hidden;
int _pthread_reschedule(struct PosixThread *) hidden; int _pthread_reschedule(struct PosixThread *) hidden;
int _pthread_setschedparam_freebsd(int, int, const struct sched_param *) hidden;
void _pthread_free(struct PosixThread *) hidden;
void _pthread_ungarbage(void) hidden;
void _pthread_wait(struct PosixThread *) hidden;
void _pthread_zombies_add(struct PosixThread *) hidden; void _pthread_zombies_add(struct PosixThread *) hidden;
void _pthread_zombies_decimate(void) hidden; void _pthread_zombies_decimate(void) hidden;
void _pthread_zombies_harvest(void) hidden; void _pthread_zombies_harvest(void) hidden;
int _pthread_setschedparam_freebsd(int, int, const struct sched_param *);
COSMOPOLITAN_C_END_ COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/str/str.h" #include "libc/str/str.h"
/** /**

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
/** /**
* Gets thread detachable attribute. * Gets thread detachable attribute.

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
/** /**
* Returns size of unmapped pages at bottom of stack. * Returns size of unmapped pages at bottom of stack.

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
/** /**
* Returns thread inherit schedule attribute. * Returns thread inherit schedule attribute.

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread2.h" #include "libc/thread/thread2.h"
/** /**
* Gets thread scheduler parameter attribute. * Gets thread scheduler parameter attribute.

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
/** /**
* Gets thread scheduler policy attribute * Gets thread scheduler policy attribute

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
int pthread_attr_getscope(const pthread_attr_t *a, int *x) { int pthread_attr_getscope(const pthread_attr_t *a, int *x) {
*x = a->scope; *x = a->scope;

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/runtime/stack.h" #include "libc/runtime/stack.h"
/** /**

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/runtime/stack.h" #include "libc/runtime/stack.h"
/** /**

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
#include "libc/runtime/stack.h" #include "libc/runtime/stack.h"
/** /**

View file

@ -17,7 +17,7 @@
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
/** /**
* Sets thread detachable attribute, e.g. * Sets thread detachable attribute, e.g.

View file

@ -16,7 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
/** /**
* Sets size of unmapped pages at bottom of stack. * Sets size of unmapped pages at bottom of stack.

View file

@ -18,7 +18,7 @@
*/ */
#include "libc/assert.h" #include "libc/assert.h"
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/intrin/pthread.h" #include "libc/thread/thread.h"
/** /**
* Sets thread scheduler inheritance attribute, e.g. * Sets thread scheduler inheritance attribute, e.g.

View file

@ -18,7 +18,7 @@
*/ */
#include "libc/calls/struct/sched_param.h" #include "libc/calls/struct/sched_param.h"
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/intrin/pthread2.h" #include "libc/thread/thread2.h"
/** /**
* Sets thread scheduler parameter attribute, e.g. * Sets thread scheduler parameter attribute, e.g.

Some files were not shown because too many files have changed in this diff Show more