mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-14 06:59:10 +00:00
Fix more things
- Update a couple unicode data files - Disable strace during logger calls - SQLite now uses pread() / pwrite() - pread() past EOF on NT now returns 0 - Make the NT mmap() and fork() code elegant - Give NT a big performance boost with memory - Add many more mmap() tests to prove it works
This commit is contained in:
parent
b90fa996b4
commit
98909b1391
36 changed files with 1034 additions and 318 deletions
|
@ -34,6 +34,7 @@
|
|||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/sock/ipclassify.internal.h"
|
||||
#include "libc/sock/sock.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/sysv/consts/af.h"
|
||||
#include "libc/sysv/consts/ex.h"
|
||||
|
@ -54,6 +55,9 @@
|
|||
#include "tool/build/lib/psk.h"
|
||||
#include "tool/build/runit.h"
|
||||
|
||||
#define MAX_WAIT_CONNECT_SECONDS 30
|
||||
#define INITIAL_CONNECT_TIMEOUT 100000
|
||||
|
||||
/**
|
||||
* @fileoverview Remote test runner.
|
||||
*
|
||||
|
@ -243,17 +247,10 @@ void DeployEphemeralRunItDaemonRemotelyViaSsh(struct addrinfo *ai) {
|
|||
LOGIFNEG1(close(lock));
|
||||
}
|
||||
|
||||
void SetDeadline(int micros) {
|
||||
alarmed = false;
|
||||
LOGIFNEG1(
|
||||
sigaction(SIGALRM, &(struct sigaction){.sa_handler = OnAlarm}, NULL));
|
||||
LOGIFNEG1(setitimer(ITIMER_REAL,
|
||||
&(const struct itimerval){{0, 0}, {0, micros}}, NULL));
|
||||
}
|
||||
|
||||
void Connect(void) {
|
||||
const char *ip4;
|
||||
int rc, err, expo;
|
||||
long double t1, t2;
|
||||
struct addrinfo *ai;
|
||||
if ((rc = getaddrinfo(g_hostname, gc(xasprintf("%hu", g_runitdport)),
|
||||
&kResolvHints, &ai)) != 0) {
|
||||
|
@ -267,24 +264,46 @@ void Connect(void) {
|
|||
g_hostname, ip4[0], ip4[1], ip4[2], ip4[3]);
|
||||
unreachable;
|
||||
}
|
||||
DEBUGF("connecting to %d.%d.%d.%d port %d", ip4[0], ip4[1], ip4[2], ip4[3],
|
||||
ntohs(ai->ai_addr4->sin_port));
|
||||
CHECK_NE(-1,
|
||||
(g_sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol)));
|
||||
expo = 1;
|
||||
expo = INITIAL_CONNECT_TIMEOUT;
|
||||
t1 = nowl();
|
||||
LOGIFNEG1(sigaction(SIGALRM, &(struct sigaction){.sa_handler = OnAlarm}, 0));
|
||||
Reconnect:
|
||||
DEBUGF("connecting to %s (%hhu.%hhu.%hhu.%hhu) to run %s", g_hostname, ip4[0],
|
||||
ip4[1], ip4[2], ip4[3], g_prog);
|
||||
SetDeadline(100000);
|
||||
TryAgain:
|
||||
alarmed = false;
|
||||
LOGIFNEG1(setitimer(
|
||||
ITIMER_REAL,
|
||||
&(const struct itimerval){{0, 0}, {expo / 1000000, expo % 1000000}},
|
||||
NULL));
|
||||
rc = connect(g_sock, ai->ai_addr, ai->ai_addrlen);
|
||||
err = errno;
|
||||
SetDeadline(0);
|
||||
t2 = nowl();
|
||||
if (rc == -1) {
|
||||
if (err == EINTR) goto TryAgain;
|
||||
if (err == EINTR) {
|
||||
expo *= 1.5;
|
||||
if (t2 > t1 + MAX_WAIT_CONNECT_SECONDS) {
|
||||
FATALF("timeout connecting to %s (%hhu.%hhu.%hhu.%hhu:%d)", g_hostname,
|
||||
ip4[0], ip4[1], ip4[2], ip4[3], ntohs(ai->ai_addr4->sin_port));
|
||||
unreachable;
|
||||
}
|
||||
goto TryAgain;
|
||||
}
|
||||
if (err == ECONNREFUSED || err == EHOSTUNREACH || err == ECONNRESET) {
|
||||
DEBUGF("got %s from %s (%hhu.%hhu.%hhu.%hhu)", strerror(err), g_hostname,
|
||||
ip4[0], ip4[1], ip4[2], ip4[3]);
|
||||
usleep((expo *= 2));
|
||||
setitimer(ITIMER_REAL, &(const struct itimerval){0}, 0);
|
||||
DeployEphemeralRunItDaemonRemotelyViaSsh(ai);
|
||||
if (t2 > t1 + MAX_WAIT_CONNECT_SECONDS) {
|
||||
FATALF("timeout connecting to %s (%hhu.%hhu.%hhu.%hhu:%d)", g_hostname,
|
||||
ip4[0], ip4[1], ip4[2], ip4[3], ntohs(ai->ai_addr4->sin_port));
|
||||
unreachable;
|
||||
}
|
||||
usleep((expo *= 2));
|
||||
goto Reconnect;
|
||||
} else {
|
||||
FATALF("%s(%s:%hu): %s", "connect", g_hostname, g_runitdport,
|
||||
|
@ -294,6 +313,7 @@ TryAgain:
|
|||
} else {
|
||||
DEBUGF("connected to %s", g_hostname);
|
||||
}
|
||||
setitimer(ITIMER_REAL, &(const struct itimerval){0}, 0);
|
||||
freeaddrinfo(ai);
|
||||
}
|
||||
|
||||
|
@ -401,6 +421,7 @@ int RunOnHost(char *spec) {
|
|||
CHECK_GE(sscanf(spec, "%100s %hu %hu", g_hostname, &g_runitdport, &g_sshport),
|
||||
1);
|
||||
if (!strchr(g_hostname, '.')) strcat(g_hostname, ".test.");
|
||||
DEBUGF("connecting to %s port %d", g_hostname, g_runitdport);
|
||||
do {
|
||||
for (;;) {
|
||||
Connect();
|
||||
|
@ -441,8 +462,6 @@ int SpawnSubprocesses(int argc, char *argv[]) {
|
|||
LOGIFNEG1(sigprocmask(SIG_BLOCK, &chldmask, &savemask));
|
||||
for (i = 0; i < argc; ++i) {
|
||||
args[3] = argv[i];
|
||||
fprintf(stderr, "spawning %s %s %s %s\n", args[0], args[1], args[2],
|
||||
args[3]);
|
||||
CHECK_NE(-1, (pids[i] = vfork()));
|
||||
if (!pids[i]) {
|
||||
xsigaction(SIGINT, SIG_DFL, 0, 0, 0);
|
||||
|
@ -483,7 +502,9 @@ int SpawnSubprocesses(int argc, char *argv[]) {
|
|||
|
||||
int main(int argc, char *argv[]) {
|
||||
ShowCrashReports();
|
||||
__log_level = kLogDebug;
|
||||
if (getenv("DEBUG")) {
|
||||
__log_level = kLogDebug;
|
||||
}
|
||||
if (argc > 1 &&
|
||||
(strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0)) {
|
||||
ShowUsage(stdout, 0);
|
||||
|
|
|
@ -87,7 +87,7 @@
|
|||
* - 1 byte exit status
|
||||
*/
|
||||
|
||||
#define DEATH_CLOCK_SECONDS 32
|
||||
#define DEATH_CLOCK_SECONDS 128
|
||||
|
||||
#define kLogFile "o/runitd.log"
|
||||
#define kLogMaxBytes (2 * 1000 * 1000)
|
||||
|
@ -191,7 +191,6 @@ void StartTcpServer(void) {
|
|||
g_servfd = 10;
|
||||
|
||||
LOGIFNEG1(setsockopt(g_servfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)));
|
||||
LOGIFNEG1(setsockopt(g_servfd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes)));
|
||||
if (bind(g_servfd, &g_servaddr, sizeof(g_servaddr)) == -1) {
|
||||
if (g_servaddr.sin_port != 0) {
|
||||
g_servaddr.sin_port = 0;
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
|
||||
struct BitaBuilder {
|
||||
size_t i, n;
|
||||
unsigned *p;
|
||||
uint32_t *p;
|
||||
};
|
||||
|
||||
struct BitaBuilder *bitabuilder_new(void) {
|
||||
|
@ -66,7 +66,7 @@ bool bitabuilder_setbit(struct BitaBuilder *bb, size_t bit) {
|
|||
}
|
||||
}
|
||||
bb->i = i;
|
||||
bts(bb->p, bit);
|
||||
bb->p[bit / 32] |= 1u << (bit % 32);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -175,15 +175,15 @@
|
|||
(cond ((eq arg 9) "-x")
|
||||
(t "")))
|
||||
|
||||
(defun cosmo--compile-command (this root kind mode suffix objdumpflags)
|
||||
(defun cosmo--compile-command (this root kind mode suffix objdumpflags runsuffix)
|
||||
(let* ((ext (file-name-extension this)) ;; e.g. "c"
|
||||
(dir (file-name-directory this)) ;; e.g. "/home/jart/daisy/libc/"
|
||||
(dots (file-relative-name root dir)) ;; e.g. "../"
|
||||
(file (file-relative-name this root)) ;; e.g. "libc/crc32c.c"
|
||||
(name (file-name-sans-extension file)) ;; e.g. "libc/crc32c"
|
||||
(buddy (format "test/%s_test.c" name))
|
||||
(runs (format "o/$m/%s.com.runs V=5 TESTARGS=-b" name))
|
||||
(buns (format "o/$m/test/%s_test.com.runs V=5 TESTARGS=-b" name)))
|
||||
(runs (format "o/$m/%s.com%s V=5 TESTARGS=-b" name runsuffix))
|
||||
(buns (format "o/$m/test/%s_test.com%s V=5 TESTARGS=-b" name runsuffix)))
|
||||
(cond ((not (member ext '("c" "cc" "s" "S" "rl" "f")))
|
||||
(format "m=%s; make -j8 -O MODE=$m o/$m/%s"
|
||||
mode
|
||||
|
@ -191,6 +191,15 @@
|
|||
(or (file-name-directory
|
||||
(file-relative-name this root))
|
||||
""))))
|
||||
((eq kind 'run-win7)
|
||||
(format
|
||||
(cosmo-join
|
||||
" && "
|
||||
`("m=%s; f=o/$m/%s.com"
|
||||
,(concat "make -j8 -O $f MODE=$m")
|
||||
"scp $f $f.dbg win7:"
|
||||
"ssh win7 ./%s.com"))
|
||||
mode name (file-name-nondirectory name)))
|
||||
((and (equal suffix "")
|
||||
(cosmo-contains "_test." (buffer-file-name)))
|
||||
(format "m=%s; make -j8 -O MODE=$m %s"
|
||||
|
@ -214,24 +223,8 @@
|
|||
,(concat "make -j8 -O $f MODE=$m")
|
||||
"./$f"))
|
||||
mode name))
|
||||
((eq kind 'run-win7)
|
||||
(format
|
||||
(cosmo-join
|
||||
" && "
|
||||
`("m=%s; f=o/$m/%s.com"
|
||||
,(concat "make -j8 -O $f MODE=$m")
|
||||
"scp $f $f.dbg win7:"
|
||||
"ssh win7 ./%s.com"))
|
||||
mode name (file-name-nondirectory name)))
|
||||
((eq kind 'run-win10)
|
||||
(format
|
||||
(cosmo-join
|
||||
" && "
|
||||
`("m=%s; f=o/$m/%s.com"
|
||||
,(concat "make -j8 -O $f MODE=$m")
|
||||
"scp $f $f.dbg win10:"
|
||||
"ssh win10 ./%s.com"))
|
||||
mode name (file-name-nondirectory name)))
|
||||
((eq kind 'test)
|
||||
(format `"m=%s; f=o/$m/%s.com.ok && make -j8 -O $f MODE=$m" mode name))
|
||||
((and (file-regular-p this)
|
||||
(file-executable-p this))
|
||||
(format "./%s" file))
|
||||
|
@ -257,7 +250,7 @@
|
|||
(objdumpflags (cosmo--make-objdump-flags arg))
|
||||
(compilation-scroll-output nil)
|
||||
(default-directory root)
|
||||
(compile-command (cosmo--compile-command this root nil mode suffix objdumpflags)))
|
||||
(compile-command (cosmo--compile-command this root nil mode suffix objdumpflags ".runs")))
|
||||
(compile compile-command)))))
|
||||
|
||||
(defun cosmo-compile-hook ()
|
||||
|
@ -600,7 +593,7 @@
|
|||
(format "./%s" file))))
|
||||
((memq major-mode '(c-mode c++-mode asm-mode fortran-mode))
|
||||
(let* ((mode (cosmo--make-mode arg))
|
||||
(compile-command (cosmo--compile-command this root 'run mode "" "")))
|
||||
(compile-command (cosmo--compile-command this root 'run mode "" "" ".runs")))
|
||||
(compile compile-command)))
|
||||
((eq major-mode 'sh-mode)
|
||||
(compile (format "sh %s" file)))
|
||||
|
@ -614,6 +607,22 @@
|
|||
('t
|
||||
(error "cosmo-run: unknown major mode")))))))
|
||||
|
||||
(defun cosmo-run-test (arg)
|
||||
(interactive "P")
|
||||
(let* ((this (or (buffer-file-name) dired-directory))
|
||||
(proj (locate-dominating-file this "Makefile"))
|
||||
(root (or proj default-directory))
|
||||
(file (file-relative-name this root)))
|
||||
(when root
|
||||
(let ((default-directory root))
|
||||
(save-buffer)
|
||||
(cond ((memq major-mode '(c-mode c++-mode asm-mode fortran-mode))
|
||||
(let* ((mode (cosmo--make-mode arg ""))
|
||||
(compile-command (cosmo--compile-command this root 'test mode "" "" ".ok")))
|
||||
(compile compile-command)))
|
||||
('t
|
||||
(error "cosmo-run: unknown major mode")))))))
|
||||
|
||||
(defun cosmo-run-win7 (arg)
|
||||
(interactive "P")
|
||||
(let* ((this (or (buffer-file-name) dired-directory))
|
||||
|
@ -624,24 +633,8 @@
|
|||
(let ((default-directory root))
|
||||
(save-buffer)
|
||||
(cond ((memq major-mode '(c-mode c++-mode asm-mode fortran-mode))
|
||||
(let* ((mode (cosmo--make-mode arg))
|
||||
(compile-command (cosmo--compile-command this root 'run-win7 mode "" "")))
|
||||
(compile compile-command)))
|
||||
('t
|
||||
(error "cosmo-run: unknown major mode")))))))
|
||||
|
||||
(defun cosmo-run-win10 (arg)
|
||||
(interactive "P")
|
||||
(let* ((this (or (buffer-file-name) dired-directory))
|
||||
(proj (locate-dominating-file this "Makefile"))
|
||||
(root (or proj default-directory))
|
||||
(file (file-relative-name this root)))
|
||||
(when root
|
||||
(let ((default-directory root))
|
||||
(save-buffer)
|
||||
(cond ((memq major-mode '(c-mode c++-mode asm-mode fortran-mode))
|
||||
(let* ((mode (cosmo--make-mode arg))
|
||||
(compile-command (cosmo--compile-command this root 'run-win10 mode "" "")))
|
||||
(let* ((mode (cosmo--make-mode arg ""))
|
||||
(compile-command (cosmo--compile-command this root 'run-win7 mode "" "" "")))
|
||||
(compile compile-command)))
|
||||
('t
|
||||
(error "cosmo-run: unknown major mode")))))))
|
||||
|
@ -652,8 +645,8 @@
|
|||
(define-key fortran-mode-map (kbd "C-c C-r") 'cosmo-run)
|
||||
(define-key sh-mode-map (kbd "C-c C-r") 'cosmo-run)
|
||||
(define-key python-mode-map (kbd "C-c C-r") 'cosmo-run)
|
||||
(define-key c-mode-map (kbd "C-c C-s") 'cosmo-run-win7)
|
||||
(define-key c-mode-map (kbd "C-c C-_") 'cosmo-run-win10))
|
||||
(define-key c-mode-map (kbd "C-c C-s") 'cosmo-run-test)
|
||||
(define-key c-mode-map (kbd "C-c C-_") 'cosmo-run-win7))
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
@ -675,7 +668,7 @@
|
|||
(next (file-name-sans-extension name))
|
||||
(exec (format "o/%s/%s.com.dbg" mode next))
|
||||
(default-directory root)
|
||||
(compile-command (cosmo--compile-command this root nil mode "" "")))
|
||||
(compile-command (cosmo--compile-command this root nil mode "" "" ".runs")))
|
||||
(compile compile-command)
|
||||
(gdb (format "gdb -q -nh -i=mi %s -ex run" exec))))))
|
||||
|
||||
|
@ -875,6 +868,36 @@
|
|||
|
||||
(add-hook 'before-save-hook 'cosmo-before-save)
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Cosmopolitan Logger Integration
|
||||
|
||||
;; Cosmopolitan logger
|
||||
;;
|
||||
;; W2022-03-23T15:58:19.102930:tool/build/runit.c:274:runit:20719] hello
|
||||
;; warn date time micros file line prog pid message
|
||||
;;
|
||||
;; I2022-03-23T15:58:19.+00033:tool/build/runit.c:274:runit:20719] there
|
||||
;; info date time delta file line prog pid message
|
||||
;;
|
||||
|
||||
(defvar cosmo-compilation-regexps
|
||||
(list (cosmo-join
|
||||
""
|
||||
'("^[FEWIVDNT]" ;; level
|
||||
"[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" ;; date
|
||||
"T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]" ;; time
|
||||
"[+.][0-9][0-9][0-9][0-9][0-9][0-9]" ;; micros
|
||||
":\\([^:]+\\)" ;; file
|
||||
":\\([0-9]+\\)")) ;; line
|
||||
1 2))
|
||||
|
||||
(eval-after-load 'compile
|
||||
'(progn
|
||||
(add-to-list 'compilation-error-regexp-alist-alist
|
||||
(cons 'cosmo cosmo-compilation-regexps))
|
||||
(add-to-list 'compilation-error-regexp-alist 'cosmo)))
|
||||
|
||||
(provide 'cosmo-stuff)
|
||||
|
||||
;;; cosmo-stuff.el ends here
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue