Make some improvements of little consequence

This commit is contained in:
Justine Tunney 2024-07-27 08:20:18 -07:00
parent 690d3df66e
commit 18a620cc1a
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
11 changed files with 92 additions and 14 deletions

View file

@ -6,14 +6,14 @@ if [ -n "$OBJDUMP" ]; then
fi fi
find_objdump() { find_objdump() {
if [ -x .cosmocc/3.3.5/bin/$1-linux-cosmo-objdump ]; then if [ -x .cosmocc/3.6.0/bin/$1-linux-cosmo-objdump ]; then
OBJDUMP=.cosmocc/3.3.5/bin/$1-linux-cosmo-objdump OBJDUMP=.cosmocc/3.6.0/bin/$1-linux-cosmo-objdump
elif [ -x .cosmocc/3.3.5/bin/$1-linux-musl-objdump ]; then elif [ -x .cosmocc/3.6.0/bin/$1-linux-musl-objdump ]; then
OBJDUMP=.cosmocc/3.3.5/bin/$1-linux-musl-objdump OBJDUMP=.cosmocc/3.6.0/bin/$1-linux-musl-objdump
elif [ -x "$COSMO/.cosmocc/3.3.5/bin/$1-linux-cosmo-objdump" ]; then elif [ -x "$COSMO/.cosmocc/3.6.0/bin/$1-linux-cosmo-objdump" ]; then
OBJDUMP="$COSMO/.cosmocc/3.3.5/bin/$1-linux-cosmo-objdump" OBJDUMP="$COSMO/.cosmocc/3.6.0/bin/$1-linux-cosmo-objdump"
elif [ -x "$COSMO/.cosmocc/3.3.5/bin/$1-linux-musl-objdump" ]; then elif [ -x "$COSMO/.cosmocc/3.6.0/bin/$1-linux-musl-objdump" ]; then
OBJDUMP="$COSMO/.cosmocc/3.3.5/bin/$1-linux-musl-objdump" OBJDUMP="$COSMO/.cosmocc/3.6.0/bin/$1-linux-musl-objdump"
else else
echo "error: toolchain not found (try running 'cosmocc --update' or 'make' in the cosmo monorepo)" >&2 echo "error: toolchain not found (try running 'cosmocc --update' or 'make' in the cosmo monorepo)" >&2
exit 1 exit 1

View file

@ -34,6 +34,63 @@
/** /**
* Returns information about filesystem. * Returns information about filesystem.
* *
* The `struct statfs` returned has the following fields:
*
* - `f_fstypename` holds a NUL-terminated string identifying the file
* system type. On Linux, this will usually be "nfs". On FreeBSD, it
* will usually be "zfs". On OpenBSD and NetBSD, it's usually "ffs".
* On MacOS it's usually "apfs", and on Windows it's usually "NTFS".
*
* - `f_bsize` is the optimal transfer block size. This may be used to
* appropriately chunk your i/o operations. On local file systems it
* will usually be somewhere between 4096 and 131072 bytes. With NFS
* it may be as high as 512kb.
*
* - `f_frsize` is the fragment size of the file system. This could be
* anywhere between 512 and 4096 bytes for local filesystems usually
* although it could go higher. It should less than, or equal to the
* `f_bsize`. This fragment size is what you want to use to multiply
* other fields that count blocks into a byte count.
*
* - `f_bfree` is the number of free blocks in the filesystem. You can
* multiply this number by `f_frsize` to obtain the free byte count.
*
* - `f_bavail` is the number of free blocks in the filesystem you can
* access from userspace. It's less than or equal to `f_bfree` which
* generally has some blocks reserved for root in a pinch. You could
* multiply this by `f_frsize` to convert this number to bytes.
*
* - `f_files` is the total number of file nodes. Not every OS has it.
* On Windows for instance it's currently always `INT64_MAX`. It has
* an unspecified meaning. It should be seen as informative.
*
* - `f_fsid` is an opaque data structure that uniquely identifies the
* filesystem. We're not yet certain how reliable this is across the
* various OSes and filesystem types.
*
* - `f_namelen` is basically the same as `NAME_MAX` which seems to be
* 255 on all the OSes we've evaluated. It's the maximum length when
* it comes to individual components in a filesystem path.
*
* - `f_type` is an OS-specific file system type ID. This is just some
* magic number. No defines are provided by Cosmopolitan Libc for it
*
* - `f_flags` specifies the options used when a filesystem is mounted
* and the numbers vary across OSes. Cosmopolitan Libc polyfills the
* magic numbers somewhat consistently. If `IsWindows()` is set then
* the constants defined by Microsoft (e.g. `FILE_READ_ONLY_VOLUME`)
* should be used. Otherwise on any other UNIX system, the following
* constants are provided. You should check each constant at runtime
* before using them, to determine if they're non-zero, for support.
*
* - `ST_RDONLY` if mounted in read-only mode (works UNIX + Windows)
* - `ST_NOSUID` if setuid binaries are forbidden (all UNIX support)
* - `ST_NODEV` when device file access forbidden (all UNIX support)
* - `ST_NOEXEC` when a file executions forbidden (all UNIX support)
* - `ST_SYNCHRONOUS`, if `O_SYNC` always happens (all UNIX support)
* - `ST_NOATIME` if access timestamps aren't set (all UNIX support)
* - `ST_RELATIME` if relative acces time is used (all UNIX support)
*
* @return 0 on success, or -1 w/ errno * @return 0 on success, or -1 w/ errno
* @raise ECANCELED if thread was cancelled in masked mode * @raise ECANCELED if thread was cancelled in masked mode
* @raise EINTR if signal was delivered * @raise EINTR if signal was delivered

View file

@ -16,6 +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/assert.h"
#include "libc/stdio/fflush.internal.h" #include "libc/stdio/fflush.internal.h"
#include "libc/stdio/internal.h" #include "libc/stdio/internal.h"
#include "libc/stdio/stdio.h" #include "libc/stdio/stdio.h"
@ -26,6 +27,7 @@
* Acquires reentrant lock on stdio object, blocking if needed. * Acquires reentrant lock on stdio object, blocking if needed.
*/ */
void flockfile(FILE *f) { void flockfile(FILE *f) {
unassert(f != NULL);
pthread_mutex_lock(&f->lock); pthread_mutex_lock(&f->lock);
} }

View file

@ -41,7 +41,7 @@ int fileno(FILE *) libcesque paramsnonnull() nosideeffect;
int fputc(int, FILE *) libcesque paramsnonnull(); int fputc(int, FILE *) libcesque paramsnonnull();
int fputs(const char *, FILE *) libcesque paramsnonnull(); int fputs(const char *, FILE *) libcesque paramsnonnull();
int fputws(const wchar_t *, FILE *) libcesque paramsnonnull(); int fputws(const wchar_t *, FILE *) libcesque paramsnonnull();
void flockfile(FILE *) libcesque paramsnonnull(); void flockfile(FILE *) libcesque;
void funlockfile(FILE *) libcesque paramsnonnull(); void funlockfile(FILE *) libcesque paramsnonnull();
int ftrylockfile(FILE *) libcesque paramsnonnull(); int ftrylockfile(FILE *) libcesque paramsnonnull();
char *fgets(char *, int, FILE *) libcesque paramsnonnull(); char *fgets(char *, int, FILE *) libcesque paramsnonnull();

View file

@ -34,6 +34,8 @@
* @see pthread_attr_setschedpolicy() * @see pthread_attr_setschedpolicy()
* @see pthread_attr_setinheritsched() * @see pthread_attr_setinheritsched()
* @see pthread_attr_setscope() * @see pthread_attr_setscope()
* @see pthread_attr_setsigaltstack_np()
* @see pthread_attr_setsigaltstacksize_np()
*/ */
errno_t pthread_attr_init(pthread_attr_t *attr) { errno_t pthread_attr_init(pthread_attr_t *attr) {
*attr = (pthread_attr_t){ *attr = (pthread_attr_t){

View file

@ -354,6 +354,7 @@ static errno_t _pthread_cancel_everyone(void) {
*/ */
errno_t pthread_cancel(pthread_t thread) { errno_t pthread_cancel(pthread_t thread) {
struct PosixThread *arg; struct PosixThread *arg;
unassert(thread);
if ((arg = (struct PosixThread *)thread)) { if ((arg = (struct PosixThread *)thread)) {
return _pthread_cancel_single(arg); return _pthread_cancel_single(arg);
} else { } else {

View file

@ -62,6 +62,7 @@ static errno_t pthread_detach_impl(struct PosixThread *pt) {
* @returnserrno * @returnserrno
*/ */
errno_t pthread_detach(pthread_t thread) { errno_t pthread_detach(pthread_t thread) {
unassert(thread);
struct PosixThread *pt = (struct PosixThread *)thread; struct PosixThread *pt = (struct PosixThread *)thread;
errno_t err = pthread_detach_impl(pt); errno_t err = pthread_detach_impl(pt);
STRACE("pthread_detach(%d) → %s", _pthread_tid(pt), DescribeErrno(err)); STRACE("pthread_detach(%d) → %s", _pthread_tid(pt), DescribeErrno(err));

View file

@ -16,6 +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/assert.h"
#include "libc/calls/sched-sysv.internal.h" #include "libc/calls/sched-sysv.internal.h"
#include "libc/calls/struct/cpuset.h" #include "libc/calls/struct/cpuset.h"
#include "libc/dce.h" #include "libc/dce.h"
@ -39,6 +40,8 @@
errno_t pthread_getaffinity_np(pthread_t thread, size_t size, errno_t pthread_getaffinity_np(pthread_t thread, size_t size,
cpu_set_t *bitset) { cpu_set_t *bitset) {
int rc, tid; int rc, tid;
unassert(thread);
unassert(bitset);
tid = _pthread_tid((struct PosixThread *)thread); tid = _pthread_tid((struct PosixThread *)thread);
if (size != sizeof(cpu_set_t)) { if (size != sizeof(cpu_set_t)) {

View file

@ -16,6 +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/assert.h"
#include "libc/calls/sched-sysv.internal.h" #include "libc/calls/sched-sysv.internal.h"
#include "libc/calls/struct/cpuset.h" #include "libc/calls/struct/cpuset.h"
#include "libc/calls/syscall_support-nt.internal.h" #include "libc/calls/syscall_support-nt.internal.h"
@ -54,6 +55,8 @@ errno_t pthread_setaffinity_np(pthread_t thread, size_t size,
int e, rc, tid; int e, rc, tid;
cpu_set_t bs = {0}; cpu_set_t bs = {0};
struct PosixThread *pt; struct PosixThread *pt;
unassert(thread);
unassert(bitset);
e = errno; e = errno;
if (size < sizeof(cpu_set_t)) { if (size < sizeof(cpu_set_t)) {
memcpy(&bs, bitset, size); memcpy(&bs, bitset, size);

View file

@ -118,6 +118,7 @@ errno_t pthread_timedjoin_np(pthread_t thread, void **value_ptr,
struct PosixThread *pt; struct PosixThread *pt;
enum PosixThreadStatus status; enum PosixThreadStatus status;
pt = (struct PosixThread *)thread; pt = (struct PosixThread *)thread;
unassert(thread);
// "The behavior is undefined if the value specified by the thread // "The behavior is undefined if the value specified by the thread
// argument to pthread_join() does not refer to a joinable thread." // argument to pthread_join() does not refer to a joinable thread."

View file

@ -181,11 +181,19 @@ The following supplemental flags are defined by cosmocc:
to pass `-Os` too. Please note that this mode is granted leeway to to pass `-Os` too. Please note that this mode is granted leeway to
trade away performance whenever possible. Functions like memmove() trade away performance whenever possible. Functions like memmove()
will stop using fancy vectorization which can dramatically decrease will stop using fancy vectorization which can dramatically decrease
the performance of certain use cases. malloc() will stop using cookies the performance of certain use cases. malloc() will no longer be
which add bloat but are considered important by some people for both scalable either. Cosmo malloc() will normally perform similarly to
security and reporting errors on corruption. APIs will also begin things like jemalloc. But in -mtiny mode it's protected by a GIL that
refraining from detecting usage errors that are the fault of the may cause a multithreaded C++ HTTP server that makes intense usage of
caller, so this mode isn't recommended for development. the STL may drop from 3.7 million requests per second to just 17k.
We've seen it happen. malloc() will also stop using cookies which add
bloat but are considered important by some people for both security
and reporting errors on corruption. APIs will also begin refraining
from detecting usage errors that are the fault of the caller, so this
mode isn't recommended for development. Where -mtiny truly shines is
when you're writing tiny programs. Particularly if they're ephemeral
and frequent (e.g. build tooling), because the tiny runtime needs to
do less work at process startup.
- `-moptlinux` uses the optimized Linux-only version of Cosmopolitan - `-moptlinux` uses the optimized Linux-only version of Cosmopolitan
Libc runtime libraries. Your program will only be able to run on Libc runtime libraries. Your program will only be able to run on