cosmopolitan/libc
Justine Tunney cdfcee51ca
Properly serialize fork() operations
This change solves an issue where many threads attempting to spawn forks
at once would cause fork() performance to degrade with the thread count.
Things got real nasty on NetBSD, which slowed down the whole test fleet,
because there's no vfork() and we're forced to use fork() in our server.

   threads      count task
         1       1062 fork+exit+wait
         2        668 fork+exit+wait
         4         66 fork+exit+wait
         8         19 fork+exit+wait
        16         22 fork+exit+wait
        32         16 fork+exit+wait

Things are now much less bad on NetBSD, but not great, since it does not
have futexes; we rely on its semaphore file descriptors to do conditions

   threads      count task
         1       1085 fork+exit+wait
         2        842 fork+exit+wait
         4        532 fork+exit+wait
         8        400 fork+exit+wait
        16        276 fork+exit+wait
        32         66 fork+exit+wait

With OpenBSD which also lacks vfork(), things were just as bad as NetBSD

   threads      count task
         1        584 fork+exit+wait
         2        687 fork+exit+wait
         4        206 fork+exit+wait
         8         24 fork+exit+wait
        16         33 fork+exit+wait
        32         26 fork+exit+wait

But since OpenBSD has futexes fork() works terrifically thanks to *NSYNC

   threads      count task
         1        525 fork+exit+wait
         2        580 fork+exit+wait
         4        451 fork+exit+wait
         8        479 fork+exit+wait
        16        408 fork+exit+wait
        32        373 fork+exit+wait

This issue would most likely only manifest itself, when pthread_atfork()
callers manage to slip a spin lock into the outermost position of fork's
list of locks. Since fork() is very slow, a spin lock can be devastating

Needless to say vfork() rules and anyone who says differently is kidding
themselves. Look at what a FreeBSD 14.1 virtual machine with equal specs
can do over the course of three hundred milliseconds.

   threads      count task
         1       2559 vfork+exit+wait
         2       5389 vfork+exit+wait
         4      34933 vfork+exit+wait
         8      43273 vfork+exit+wait
        16      49648 vfork+exit+wait
        32      40247 vfork+exit+wait

So it's a shame that so few OSes support vfork(). It creates an unsavory
situation, where someone wanting to build a server that spawns processes
would be better served to not use threads and favor a multiprocess model
2024-07-27 08:23:44 -07:00
..
calls Make some improvements of little consequence 2024-07-27 08:20:18 -07:00
crt Do more quality assurance work 2024-06-24 06:53:49 -07:00
dlopen Introduce cosmocc flags -mdbg -mtiny -moptlinux 2024-07-26 05:10:25 -07:00
elf Rerun clang-format on the repo (#1217) 2024-06-15 16:34:48 -04:00
fmt Fix ctype.h and wctype.h 2024-07-21 15:54:17 -07:00
integral Release Cosmopolitan v3.6.1 2024-07-25 13:34:02 -07:00
intrin Expand the virtual address space on Windows 2024-07-27 08:19:05 -07:00
irq Get rid of .internal.h convention in LIBC_INTRIN 2024-07-19 19:38:00 -07:00
isystem Release Cosmopolitan v3.6.0 2024-07-23 03:28:19 -07:00
log Introduce cosmocc flags -mdbg -mtiny -moptlinux 2024-07-26 05:10:25 -07:00
mem Improve multithreading 2024-07-21 14:40:45 -07:00
nexgen32e Introduce cosmocc flags -mdbg -mtiny -moptlinux 2024-07-26 05:10:25 -07:00
nt Make some new Windows 10 memory APIs available 2024-07-19 22:26:49 -07:00
proc Properly serialize fork() operations 2024-07-27 08:23:44 -07:00
runtime Introduce cosmocc flags -mdbg -mtiny -moptlinux 2024-07-26 05:10:25 -07:00
sock Fix ctype.h and wctype.h 2024-07-21 15:54:17 -07:00
stdio Make some improvements of little consequence 2024-07-27 08:20:18 -07:00
str bzero() should be defined without special defines 2024-07-24 16:15:30 -07:00
sysv Introduce cosmocc flags -mdbg -mtiny -moptlinux 2024-07-26 05:10:25 -07:00
testlib Fix ctype.h and wctype.h 2024-07-21 15:54:17 -07:00
thread Make some improvements of little consequence 2024-07-27 08:20:18 -07:00
tinymath Introduce cosmocc flags -mdbg -mtiny -moptlinux 2024-07-26 05:10:25 -07:00
vga Fix ctype.h and wctype.h 2024-07-21 15:54:17 -07:00
x Remove more _Atomic keywords from public headers 2024-07-24 13:56:03 -07:00
ar.h Reduce header complexity 2023-11-28 14:39:42 -08:00
assert.h Add dontthrow attribute to most libc functions 2024-01-09 01:26:03 -08:00
atomic.h
BUILD.mk Upgrade to 2022-era LLVM LIBCXX 2024-05-27 02:12:27 -07:00
complex.h libc headers: make <complex.h> work, add struct ipv6_mreq (#1100) 2024-02-05 17:22:56 -05:00
cosmo.h Remove bad defines from early days of project 2024-07-24 12:11:21 -07:00
ctype.h Fix ctype.h and wctype.h 2024-07-21 15:54:17 -07:00
cxxabi.h libc: Fix __cxa_thread_atexit prototype (#1088) 2024-01-22 10:23:28 -08:00
dce.h Delete ASAN 2024-06-22 05:45:49 -07:00
dos.internal.h Rerun clang-format on the repo (#1217) 2024-06-15 16:34:48 -04:00
empty.s Do some basic build tuning 2023-05-10 04:20:46 -07:00
errno.h Make dlmalloc 2.4x faster for multithreading 2024-05-28 11:18:34 -07:00
imag.internal.h Remove evil constants from cosmopolitan.h 2022-12-17 00:42:45 -08:00
inttypes.h Fix issues for latest GCC toolchain 2023-10-11 14:54:42 -07:00
iso646.internal.h Run clang-format (#1197) 2024-06-01 16:30:43 -04:00
limits.h Make improvements 2023-10-08 08:59:53 -07:00
literal.h Get GNU MPFR and MPC tests to pass 2023-08-21 15:05:10 -07:00
mach.internal.h Reduce header complexity 2023-11-28 14:39:42 -08:00
macho.internal.h Fiddle around with Mach-O 2023-05-20 04:13:49 -07:00
macros.internal.h Delete ASAN 2024-06-22 05:45:49 -07:00
math.h Release Cosmopolitan v3.6.0 2024-07-23 03:28:19 -07:00
paths.h Embed cocmd.com interpreter for system() / open() 2022-10-02 15:29:57 -07:00
README.md
serialize.h Reduce header complexity 2023-11-28 14:39:42 -08:00
stdalign.internal.h
stdbool.h Make improvements 2024-02-12 10:23:00 -08:00
stdckdint.h Reduce header complexity 2023-11-28 14:39:42 -08:00
stdlib.h Upgrade to 2022-era LLVM LIBCXX 2024-05-27 02:12:27 -07:00
temp.h Add dontthrow attribute to most libc functions 2024-01-09 01:26:03 -08:00
testlib-test.txt Fix some zipos directory related bugs 2023-09-19 02:30:42 -07:00
time.h Implement proper time zone support 2024-05-04 23:06:37 -07:00
unistd.h Put confstr() in unistd.h 2024-05-21 15:35:06 -07:00
utime.h Implement proper time zone support 2024-05-04 23:06:37 -07:00
wctype.h Fix ctype.h and wctype.h 2024-07-21 15:54:17 -07:00
zip.internal.h Add dontthrow attribute to most libc functions 2024-01-09 01:26:03 -08:00

Cosmopolitan Standard Library

This directory defines static archives defining functions, like printf(), mmap(), win32, etc. Please note that the Cosmopolitan build configuration doesn't link any C/C++ library dependencies by default, so you still have the flexibility to choose the one provided by your system. If you'd prefer Cosmopolitan, just add $(LIBC) and $(CRT) to your linker arguments.

Your library is compromised of many bite-sized static archives. We use the checkdeps tool to guarantee that the contents of the archives are organized in a logical way that's easy to use with or without our makefile infrastructure, since there's no cyclic dependencies.

The Cosmopolitan Library exports only the most stable canonical system calls for all supported operating systems, regardless of which platform is used for compilation. We polyfill many of the APIs, e.g. read(), write() so they work consistently everywhere while other apis, e.g. CreateWindowEx(), might only work on one platform, in which case they become no-op functions on others.

Cosmopolitan polyfill wrappers will usually use the dollar sign naming convention, so they may be bypassed when necessary. This same convention is used when multiple implementations of string library and other performance-critical function are provided to allow Cosmopolitan to go fast on both old and newer computers.

We take an approach to configuration that relies heavily on the compiler's dead code elimination pass (libc/dce.h). Most of the code is written so that, for example, folks not wanting support for OpenBSD can flip a bit in SUPPORT_VECTOR and that code will be omitted from the build. The same is true for builds that are tuned using -march=native which effectively asks the library to not include runtime support hooks for x86 processors older than what you use.

Please note that, unlike Cygwin or MinGW, Cosmopolitan does not achieve broad support by bolting on a POSIX emulation layer. We do nothing more than (in most cases) stateless API translations that get you 90% of the way there in a fast lightweight manner. We therefore can't address some of the subtle differences, such as the nuances of absolute paths on Windows. Our approach could be compared to something more along the lines of, "the Russians just used a pencil to write in space", versus spending millions researching a pen like NASA.