Skip to content

Commit 01e6b3a

Browse files
committed
Reduce number of disk seeks in redbean
1 parent daa32d2 commit 01e6b3a

File tree

8 files changed

+212
-173
lines changed

8 files changed

+212
-173
lines changed

libc/calls/setitimer.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
*
5353
* Be sure to check for EINTR on your i/o calls, for best low latency.
5454
*
55+
* Timers are not inherited across fork.
56+
*
5557
* @param which can be ITIMER_REAL, ITIMER_VIRTUAL, etc.
5658
* @param newvalue specifies the interval ({0,0} means one-shot) and
5759
* duration ({0,0} means disarm) in microseconds ∈ [0,999999] and

libc/fmt/kerrornames.S

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│
2+
│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│
3+
╞══════════════════════════════════════════════════════════════════════════════╡
4+
│ Copyright 2021 Justine Alexandra Roberts Tunney │
5+
│ │
6+
│ Permission to use, copy, modify, and/or distribute this software for │
7+
│ any purpose with or without fee is hereby granted, provided that the │
8+
│ above copyright notice and this permission notice appear in all copies. │
9+
│ │
10+
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
11+
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
12+
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
13+
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
14+
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
15+
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
16+
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
17+
│ PERFORMANCE OF THIS SOFTWARE. │
18+
╚─────────────────────────────────────────────────────────────────────────────*/
19+
#include "libc/macros.internal.h"
20+
21+
.macro .e e
22+
.long \e - kErrorNames
23+
.long 1f - kErrorNames
24+
.section .rodata.str1.1
25+
1: .string "\e"
26+
.previous
27+
.endm
28+
29+
.section .rodata
30+
.align 4
31+
kErrorNames:
32+
.e ENOSYS
33+
.e EPERM
34+
.e ENOENT
35+
.e ESRCH
36+
.e EINTR
37+
.e EIO
38+
.e ENXIO
39+
.e E2BIG
40+
.e ENOEXEC
41+
.e EBADF
42+
.e ECHILD
43+
.e EAGAIN
44+
.e ENOMEM
45+
.e EACCES
46+
.e EFAULT
47+
.e ENOTBLK
48+
.e EBUSY
49+
.e EEXIST
50+
.e EXDEV
51+
.e ENODEV
52+
.e ENOTDIR
53+
.e EISDIR
54+
.e EINVAL
55+
.e ENFILE
56+
.e EMFILE
57+
.e ENOTTY
58+
.e ETXTBSY
59+
.e EFBIG
60+
.e ENOSPC
61+
.e EDQUOT
62+
.e ESPIPE
63+
.e EROFS
64+
.e EMLINK
65+
.e EPIPE
66+
.e EDOM
67+
.e ERANGE
68+
.e EDEADLK
69+
.e ENAMETOOLONG
70+
.e ENOLCK
71+
.e ENOTEMPTY
72+
.e ELOOP
73+
.e ENOMSG
74+
.e EIDRM
75+
.e ETIME
76+
.e EPROTO
77+
.e EOVERFLOW
78+
.e EILSEQ
79+
.e EUSERS
80+
.e ENOTSOCK
81+
.e EDESTADDRREQ
82+
.e EMSGSIZE
83+
.e EPROTOTYPE
84+
.e ENOPROTOOPT
85+
.e EPROTONOSUPPORT
86+
.e ESOCKTNOSUPPORT
87+
.e ENOTSUP
88+
.e EOPNOTSUPP
89+
.e EPFNOSUPPORT
90+
.e EAFNOSUPPORT
91+
.e EADDRINUSE
92+
.e EADDRNOTAVAIL
93+
.e ENETDOWN
94+
.e ENETUNREACH
95+
.e ENETRESET
96+
.e ECONNABORTED
97+
.e ECONNRESET
98+
.e ENOBUFS
99+
.e EISCONN
100+
.e ENOTCONN
101+
.e ESHUTDOWN
102+
.e ETOOMANYREFS
103+
.e ETIMEDOUT
104+
.e ECONNREFUSED
105+
.e EHOSTDOWN
106+
.e EHOSTUNREACH
107+
.e EALREADY
108+
.e EINPROGRESS
109+
.e ESTALE
110+
.e EREMOTE
111+
.e EBADMSG
112+
.e ECANCELED
113+
.e EOWNERDEAD
114+
.e ENOTRECOVERABLE
115+
.e ENONET
116+
.e ERESTART
117+
.e ECHRNG
118+
.e EL2NSYNC
119+
.e EL3HLT
120+
.e EL3RST
121+
.e ELNRNG
122+
.e EUNATCH
123+
.e ENOCSI
124+
.e EL2HLT
125+
.e EBADE
126+
.e EBADR
127+
.e EXFULL
128+
.e ENOANO
129+
.e EBADRQC
130+
.e EBADSLT
131+
.e ENOSTR
132+
.e ENODATA
133+
.e ENOSR
134+
.e ENOPKG
135+
.e ENOLINK
136+
.e EADV
137+
.e ESRMNT
138+
.e ECOMM
139+
.e EMULTIHOP
140+
.e EDOTDOT
141+
.e ENOTUNIQ
142+
.e EBADFD
143+
.e EREMCHG
144+
.e ELIBACC
145+
.e ELIBBAD
146+
.e ELIBSCN
147+
.e ELIBMAX
148+
.e ELIBEXEC
149+
.e ESTRPIPE
150+
.e EUCLEAN
151+
.e ENOTNAM
152+
.e ENAVAIL
153+
.e EISNAM
154+
.e EREMOTEIO
155+
.e ENOMEDIUM
156+
.e EMEDIUMTYPE
157+
.e ENOKEY
158+
.e EKEYEXPIRED
159+
.e EKEYREVOKED
160+
.e EKEYREJECTED
161+
.e ERFKILL
162+
.e EHWPOISON
163+
.long 0
164+
.endobj kErrorNames,globl,hidden

libc/fmt/strerror_r.c

Lines changed: 9 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -27,149 +27,17 @@
2727
#include "libc/nt/runtime.h"
2828
#include "libc/str/str.h"
2929

30-
const struct Error {
31-
const long *x;
32-
const char *s;
33-
} kErrors[] = {
34-
{&ENOSYS, "ENOSYS"},
35-
{&EPERM, "EPERM"},
36-
{&ENOENT, "ENOENT"},
37-
{&ESRCH, "ESRCH"},
38-
{&EINTR, "EINTR"},
39-
{&EIO, "EIO"},
40-
{&ENXIO, "ENXIO"},
41-
{&E2BIG, "E2BIG"},
42-
{&ENOEXEC, "ENOEXEC"},
43-
{&EBADF, "EBADF"},
44-
{&ECHILD, "ECHILD"},
45-
{&EAGAIN, "EAGAIN"},
46-
{&ENOMEM, "ENOMEM"},
47-
{&EACCES, "EACCES"},
48-
{&EFAULT, "EFAULT"},
49-
{&ENOTBLK, "ENOTBLK"},
50-
{&EBUSY, "EBUSY"},
51-
{&EEXIST, "EEXIST"},
52-
{&EXDEV, "EXDEV"},
53-
{&ENODEV, "ENODEV"},
54-
{&ENOTDIR, "ENOTDIR"},
55-
{&EISDIR, "EISDIR"},
56-
{&EINVAL, "EINVAL"},
57-
{&ENFILE, "ENFILE"},
58-
{&EMFILE, "EMFILE"},
59-
{&ENOTTY, "ENOTTY"},
60-
{&ETXTBSY, "ETXTBSY"},
61-
{&EFBIG, "EFBIG"},
62-
{&ENOSPC, "ENOSPC"},
63-
{&EDQUOT, "EDQUOT"},
64-
{&ESPIPE, "ESPIPE"},
65-
{&EROFS, "EROFS"},
66-
{&EMLINK, "EMLINK"},
67-
{&EPIPE, "EPIPE"},
68-
{&EDOM, "EDOM"},
69-
{&ERANGE, "ERANGE"},
70-
{&EDEADLK, "EDEADLK"},
71-
{&ENAMETOOLONG, "ENAMETOOLONG"},
72-
{&ENOLCK, "ENOLCK"},
73-
{&ENOTEMPTY, "ENOTEMPTY"},
74-
{&ELOOP, "ELOOP"},
75-
{&ENOMSG, "ENOMSG"},
76-
{&EIDRM, "EIDRM"},
77-
{&ETIME, "ETIME"},
78-
{&EPROTO, "EPROTO"},
79-
{&EOVERFLOW, "EOVERFLOW"},
80-
{&EILSEQ, "EILSEQ"},
81-
{&EUSERS, "EUSERS"},
82-
{&ENOTSOCK, "ENOTSOCK"},
83-
{&EDESTADDRREQ, "EDESTADDRREQ"},
84-
{&EMSGSIZE, "EMSGSIZE"},
85-
{&EPROTOTYPE, "EPROTOTYPE"},
86-
{&ENOPROTOOPT, "ENOPROTOOPT"},
87-
{&EPROTONOSUPPORT, "EPROTONOSUPPORT"},
88-
{&ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT"},
89-
{&ENOTSUP, "ENOTSUP"},
90-
{&EOPNOTSUPP, "EOPNOTSUPP"},
91-
{&EPFNOSUPPORT, "EPFNOSUPPORT"},
92-
{&EAFNOSUPPORT, "EAFNOSUPPORT"},
93-
{&EADDRINUSE, "EADDRINUSE"},
94-
{&EADDRNOTAVAIL, "EADDRNOTAVAIL"},
95-
{&ENETDOWN, "ENETDOWN"},
96-
{&ENETUNREACH, "ENETUNREACH"},
97-
{&ENETRESET, "ENETRESET"},
98-
{&ECONNABORTED, "ECONNABORTED"},
99-
{&ECONNRESET, "ECONNRESET"},
100-
{&ENOBUFS, "ENOBUFS"},
101-
{&EISCONN, "EISCONN"},
102-
{&ENOTCONN, "ENOTCONN"},
103-
{&ESHUTDOWN, "ESHUTDOWN"},
104-
{&ETOOMANYREFS, "ETOOMANYREFS"},
105-
{&ETIMEDOUT, "ETIMEDOUT"},
106-
{&ECONNREFUSED, "ECONNREFUSED"},
107-
{&EHOSTDOWN, "EHOSTDOWN"},
108-
{&EHOSTUNREACH, "EHOSTUNREACH"},
109-
{&EALREADY, "EALREADY"},
110-
{&EINPROGRESS, "EINPROGRESS"},
111-
{&ESTALE, "ESTALE"},
112-
{&EREMOTE, "EREMOTE"},
113-
{&EBADMSG, "EBADMSG"},
114-
{&ECANCELED, "ECANCELED"},
115-
{&EOWNERDEAD, "EOWNERDEAD"},
116-
{&ENOTRECOVERABLE, "ENOTRECOVERABLE"},
117-
{&ENONET, "ENONET"},
118-
{&ERESTART, "ERESTART"},
119-
{&ECHRNG, "ECHRNG"},
120-
{&EL2NSYNC, "EL2NSYNC"},
121-
{&EL3HLT, "EL3HLT"},
122-
{&EL3RST, "EL3RST"},
123-
{&ELNRNG, "ELNRNG"},
124-
{&EUNATCH, "EUNATCH"},
125-
{&ENOCSI, "ENOCSI"},
126-
{&EL2HLT, "EL2HLT"},
127-
{&EBADE, "EBADE"},
128-
{&EBADR, "EBADR"},
129-
{&EXFULL, "EXFULL"},
130-
{&ENOANO, "ENOANO"},
131-
{&EBADRQC, "EBADRQC"},
132-
{&EBADSLT, "EBADSLT"},
133-
{&ENOSTR, "ENOSTR"},
134-
{&ENODATA, "ENODATA"},
135-
{&ENOSR, "ENOSR"},
136-
{&ENOPKG, "ENOPKG"},
137-
{&ENOLINK, "ENOLINK"},
138-
{&EADV, "EADV"},
139-
{&ESRMNT, "ESRMNT"},
140-
{&ECOMM, "ECOMM"},
141-
{&EMULTIHOP, "EMULTIHOP"},
142-
{&EDOTDOT, "EDOTDOT"},
143-
{&ENOTUNIQ, "ENOTUNIQ"},
144-
{&EBADFD, "EBADFD"},
145-
{&EREMCHG, "EREMCHG"},
146-
{&ELIBACC, "ELIBACC"},
147-
{&ELIBBAD, "ELIBBAD"},
148-
{&ELIBSCN, "ELIBSCN"},
149-
{&ELIBMAX, "ELIBMAX"},
150-
{&ELIBEXEC, "ELIBEXEC"},
151-
{&ESTRPIPE, "ESTRPIPE"},
152-
{&EUCLEAN, "EUCLEAN"},
153-
{&ENOTNAM, "ENOTNAM"},
154-
{&ENAVAIL, "ENAVAIL"},
155-
{&EISNAM, "EISNAM"},
156-
{&EREMOTEIO, "EREMOTEIO"},
157-
{&ENOMEDIUM, "ENOMEDIUM"},
158-
{&EMEDIUMTYPE, "EMEDIUMTYPE"},
159-
{&ENOKEY, "ENOKEY"},
160-
{&EKEYEXPIRED, "EKEYEXPIRED"},
161-
{&EKEYREVOKED, "EKEYREVOKED"},
162-
{&EKEYREJECTED, "EKEYREJECTED"},
163-
{&ERFKILL, "ERFKILL"},
164-
{&EHWPOISON, "EHWPOISON"},
165-
};
30+
extern const struct Error {
31+
int x;
32+
int s;
33+
} kErrorNames[];
16634

167-
static const char *geterrname(long x) {
35+
static const char *GetErrorName(long x) {
16836
int i;
16937
if (x) {
170-
for (i = 0; i < ARRAYLEN(kErrors); ++i) {
171-
if (x == *kErrors[i].x) {
172-
return kErrors[i].s;
38+
for (i = 0; kErrorNames[i].x; ++i) {
39+
if (x == *(const long *)((uintptr_t)kErrorNames + kErrorNames[i].x)) {
40+
return (const char *)((uintptr_t)kErrorNames + kErrorNames[i].s);
17341
}
17442
}
17543
}
@@ -184,7 +52,7 @@ int strerror_r(int err, char *buf, size_t size) {
18452
char *p;
18553
const char *s;
18654
err &= 0xFFFF;
187-
s = geterrname(err);
55+
s = GetErrorName(err);
18856
p = buf;
18957
if (strlen(s) + 1 + 5 + 1 + 1 <= size) {
19058
p = stpcpy(p, s);

libc/runtime/peekall.S

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ _peekall:
2424
.leafprologue
2525
ezlea _base,si
2626
ezlea _end,cx
27+
add $0x1000,%rsi
2728
0: mov (%rsi),%eax
2829
add $PAGESIZE,%rsi
2930
cmp %rcx,%rsi

net/http/gethttpreason.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
#include "libc/macros.internal.h"
2121
#include "net/http/http.h"
2222

23-
static const struct HttpReason {
24-
int code;
23+
static const struct thatispacked HttpReason {
24+
short code;
2525
const char *name;
2626
} kHttpReason[] = {
2727
{100, "Continue"},

net/http/hascontrolcodes.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,14 @@
3333
ssize_t HasControlCodes(const char *p, size_t n, int f) {
3434
char t[256];
3535
wint_t x, a, b;
36-
size_t i, j, m;
36+
size_t i, j, m, g;
3737
memset(t, 0, sizeof(t));
3838
if (f & kControlC0) memset(t + 0x00, 1, 0x20 - 0x00), t[0x7F] = 1;
3939
if (f & kControlC1) memset(t + 0x80, 1, 0xA0 - 0x80);
4040
t['\t'] = t['\r'] = t['\n'] = t['\v'] = !!(f & kControlWs);
4141
if (n == -1) n = p ? strlen(p) : 0;
4242
for (i = 0; i < n;) {
43+
g = i;
4344
x = p[i++] & 0xff;
4445
if (UNLIKELY(x >= 0300)) {
4546
a = ThomPikeByte(x);
@@ -58,7 +59,7 @@ ssize_t HasControlCodes(const char *p, size_t n, int f) {
5859
}
5960
}
6061
if (x < 256 && t[x]) {
61-
return i - 1;
62+
return g;
6263
}
6364
}
6465
return -1;

0 commit comments

Comments
 (0)