mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
Make some improvements of little consequence
This commit is contained in:
parent
690d3df66e
commit
18a620cc1a
11 changed files with 92 additions and 14 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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){
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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."
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue