Add splice speedup for geomyidae. - geomyidae - a small C-based gopherd (mirror) | |
git clone git://git.codemadness.org/geomyidae | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 2d93b6f04f44d94cc38dd1ef666867c0ca95574f | |
parent 23ce04766e993ae515483debfc2c3be1c38b2d0b | |
Author: Christoph Lohmann <[email protected]> | |
Date: Sat, 30 Jul 2022 13:02:13 +0200 | |
Add splice speedup for geomyidae. | |
Thank you parayd, Evil_Bob! | |
Live from brcon2022. | |
Diffstat: | |
M ind.c | 49 +++++++++++++++++++++++++++++… | |
1 file changed, 49 insertions(+), 0 deletions(-) | |
--- | |
diff --git a/ind.c b/ind.c | |
@@ -3,6 +3,10 @@ | |
* by 20h | |
*/ | |
+#ifdef __linux__ | |
+ #define _GNU_SOURCE | |
+#endif | |
+ | |
#include <unistd.h> | |
#include <stdarg.h> | |
#include <string.h> | |
@@ -21,6 +25,10 @@ | |
#include <sys/ioctl.h> | |
#include <limits.h> | |
+#define PAGE_SHIFT 12 | |
+#define PAGE_SIZE (1UL << PAGE_SHIFT) | |
+#define BLOCK_SIZE ((PAGE_SIZE * 16) - 1) | |
+ | |
#include "arg.h" | |
#include "ind.h" | |
#include "handlr.h" | |
@@ -92,6 +100,43 @@ waitforpendingbytes(int sock) | |
} | |
} | |
+#ifdef __linux__ | |
+int | |
+xsplice(int fd, int sock) | |
+{ | |
+ int pipefd[2], ret = 0; | |
+ ssize_t nread, nwritten; | |
+ off_t in_offset = 0; | |
+ | |
+ if (pipe(pipefd) < 0) { | |
+ perror("pipe"); | |
+ _exit(1); | |
+ } | |
+ | |
+ do { | |
+ nread = splice(fd, &in_offset, pipefd[1], NULL, | |
+ BLOCK_SIZE, SPLICE_F_MOVE | SPLICE_F_MORE); | |
+ | |
+ if (nread <= 0) { | |
+ ret = nread < 0 ? 1 : 0; | |
+ goto out; | |
+ } | |
+ | |
+ nwritten = splice(pipefd[0], NULL, sock, NULL, BLOCK_SIZE, SP… | |
+ if (nwritten < 0) { | |
+ ret = 1; | |
+ goto out; | |
+ } | |
+ } while (nwritten > 0); | |
+ | |
+out: | |
+ close(pipefd[0]); | |
+ close(pipefd[1]); | |
+ | |
+ return ret; | |
+} | |
+#endif | |
+ | |
int | |
xsendfile(int fd, int sock) | |
{ | |
@@ -100,6 +145,10 @@ xsendfile(int fd, int sock) | |
size_t bufsiz = BUFSIZ; | |
int len, sent, optval; | |
+#ifdef splice | |
+ return xsplice(fd, sock); | |
+#endif | |
+ | |
USED(optval); | |
/* |