mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-08 20:28:30 +00:00
Make signal handling work well across platforms
- Fix sigsuspend() on XNU - Fix strsignal() on non-Linux - Add unit tests for strsignal() - Add unit tests for setitimer() - Add unit tests for sigsuspend() - Rewrite setitimer() for New Technology - Rewrite nanosleep() for New Technology - Polyfill SIGALRM on the New Technology - select(0,0,0,0) on NT now calls pause() - Remove some NTDLL calls that aren't needed - Polyfill SA_NOCLDWAIT on the New Technology - Polyfill SA_RESETHAND on the New Technology - Polyfill sigprocmask() on the New Technology - Polyfill SIGCHLD+SIG_IGN on the New Technology - Polyfill SA_RESTART masking on the New Technology - Deliver console signals from main thread on New Technology - Document SA_RESTART behavior w/ @sarestartable / @norestart - System call trace in MODE=dbg now prints inherited FDs and signal mask
This commit is contained in:
parent
3b9e66ecba
commit
072e1d2910
82 changed files with 1388 additions and 450 deletions
45
libc/intrin/createthread.greg.c
Normal file
45
libc/intrin/createthread.greg.c
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2022 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/calls/internal.h"
|
||||
#include "libc/calls/strace.internal.h"
|
||||
#include "libc/nt/struct/securityattributes.h"
|
||||
#include "libc/nt/thread.h"
|
||||
|
||||
extern typeof(CreateThread) *const __imp_CreateThread __msabi;
|
||||
|
||||
/**
|
||||
* Opens file on the New Technology.
|
||||
*
|
||||
* @return thread handle, or 0 on failure
|
||||
* @note this wrapper takes care of ABI, STRACE(), and __winerr()
|
||||
*/
|
||||
textwindows int64_t CreateThread(
|
||||
struct NtSecurityAttributes *lpThreadAttributes, size_t dwStackSize,
|
||||
NtThreadStartRoutine lpStartAddress, void *lpParameter,
|
||||
uint32_t dwCreationFlags, uint32_t *opt_lpThreadId) {
|
||||
int64_t hHandle;
|
||||
hHandle = __imp_CreateThread(lpThreadAttributes, dwStackSize, lpStartAddress,
|
||||
lpParameter, dwCreationFlags, opt_lpThreadId);
|
||||
if (hHandle == -1) __winerr();
|
||||
STRACE("CreateThread(sec=%p, stack=%'zu, start=%p, param=%p, flags=%s, "
|
||||
"id=%p) → %ld% m",
|
||||
lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter,
|
||||
dwCreationFlags, opt_lpThreadId, hHandle);
|
||||
return hHandle;
|
||||
}
|
|
@ -276,37 +276,47 @@ privileged static size_t kformat(char *b, size_t n, const char *fmt, va_list va,
|
|||
switch ((c = *f++)) {
|
||||
default:
|
||||
goto EmitFormatByte;
|
||||
|
||||
case '\0':
|
||||
break;
|
||||
|
||||
case '.':
|
||||
pdot = 1;
|
||||
continue;
|
||||
|
||||
case '-':
|
||||
flip = 1;
|
||||
continue;
|
||||
|
||||
case '#':
|
||||
hash = '0';
|
||||
continue;
|
||||
|
||||
case '_':
|
||||
case ',':
|
||||
case '\'':
|
||||
quot = c;
|
||||
continue;
|
||||
|
||||
case ' ':
|
||||
case '+':
|
||||
sign = c;
|
||||
continue;
|
||||
|
||||
case 'h':
|
||||
--type;
|
||||
continue;
|
||||
|
||||
case 'j':
|
||||
case 'l':
|
||||
case 'z':
|
||||
++type;
|
||||
continue;
|
||||
|
||||
case '!':
|
||||
dang = 1;
|
||||
continue;
|
||||
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
|
@ -321,6 +331,7 @@ privileged static size_t kformat(char *b, size_t n, const char *fmt, va_list va,
|
|||
si *= 10;
|
||||
si += c - '0';
|
||||
goto UpdateCols;
|
||||
|
||||
case '*':
|
||||
si = va_arg(va, int);
|
||||
UpdateCols:
|
||||
|
@ -339,9 +350,11 @@ privileged static size_t kformat(char *b, size_t n, const char *fmt, va_list va,
|
|||
}
|
||||
}
|
||||
continue;
|
||||
|
||||
case 'T':
|
||||
x = ClocksToNanos(ts.start, ts.birth) % 86400000000000;
|
||||
goto FormatUnsigned;
|
||||
|
||||
case 'P':
|
||||
if (!__vforked) {
|
||||
x = __pid;
|
||||
|
@ -352,6 +365,7 @@ privileged static size_t kformat(char *b, size_t n, const char *fmt, va_list va,
|
|||
: "rcx", "rdx", "r11", "memory", "cc");
|
||||
}
|
||||
goto FormatUnsigned;
|
||||
|
||||
case 'u':
|
||||
case 'd':
|
||||
if (UNLIKELY(type <= -3)) {
|
||||
|
@ -416,6 +430,7 @@ privileged static size_t kformat(char *b, size_t n, const char *fmt, va_list va,
|
|||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
base = 1;
|
||||
if (hash) hash = '0' | 'b' << 8;
|
||||
|
@ -428,6 +443,7 @@ privileged static size_t kformat(char *b, size_t n, const char *fmt, va_list va,
|
|||
do z[i++ & 127] = abet[x & m];
|
||||
while ((x >>= base) || (pdot && i < prec));
|
||||
goto EmitNumber;
|
||||
|
||||
case 'X':
|
||||
abet = "0123456789ABCDEF";
|
||||
/* fallthrough */
|
||||
|
@ -435,9 +451,11 @@ privileged static size_t kformat(char *b, size_t n, const char *fmt, va_list va,
|
|||
base = 4;
|
||||
if (hash) hash = '0' | 'x' << 8;
|
||||
goto BinaryNumber;
|
||||
|
||||
case 'o':
|
||||
base = 3;
|
||||
goto BinaryNumber;
|
||||
|
||||
case 'p':
|
||||
x = va_arg(va, intptr_t);
|
||||
if (!x && pdot) pdot = 0;
|
||||
|
@ -448,10 +466,11 @@ privileged static size_t kformat(char *b, size_t n, const char *fmt, va_list va,
|
|||
hash = '0' | 'x' << 8;
|
||||
base = 4;
|
||||
goto FormatNumber;
|
||||
|
||||
case 'C':
|
||||
c = 'c';
|
||||
type = 1;
|
||||
/* fallthrough */
|
||||
// fallthrough
|
||||
case 'c':
|
||||
i = 1;
|
||||
j = 0;
|
||||
|
@ -463,9 +482,9 @@ privileged static size_t kformat(char *b, size_t n, const char *fmt, va_list va,
|
|||
quot = 1;
|
||||
hash = '\'';
|
||||
p = kemitquote(p, e, type, hash);
|
||||
if (cols && type) --cols; /* u/L */
|
||||
if (cols) --cols; /* start quote */
|
||||
if (cols) --cols; /* end quote */
|
||||
if (cols && type) --cols; // u/L
|
||||
if (cols) --cols; // start quote
|
||||
if (cols) --cols; // end quote
|
||||
}
|
||||
goto EmitChar;
|
||||
|
||||
|
@ -506,7 +525,7 @@ privileged static size_t kformat(char *b, size_t n, const char *fmt, va_list va,
|
|||
case 'S':
|
||||
c = 's';
|
||||
type = 1;
|
||||
/* fallthrough */
|
||||
// fallthrough
|
||||
case 's':
|
||||
if (!(s = va_arg(va, const void *))) {
|
||||
s = sign != ' ' ? "NULL" : "";
|
||||
|
@ -525,9 +544,9 @@ privileged static size_t kformat(char *b, size_t n, const char *fmt, va_list va,
|
|||
} else if (hash) {
|
||||
quot = 1;
|
||||
hash = '"';
|
||||
if (cols && type) --cols; /* u/L */
|
||||
if (cols) --cols; /* start quote */
|
||||
if (cols) --cols; /* end quote */
|
||||
if (cols && type) --cols; // u/L
|
||||
if (cols) --cols; // start quote
|
||||
if (cols) --cols; // end quote
|
||||
p = kemitquote(p, e, type, hash);
|
||||
}
|
||||
if (sign == ' ' && (!pdot || prec) && *s) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue