iAdd splice speedup for geomyidae. - geomyidae - A small C-based gopherd. Err bitreich.org 70 hgit clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ URL:git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ bitreich.org 70 1Log /scm/geomyidae/log.gph bitreich.org 70 1Files /scm/geomyidae/files.gph bitreich.org 70 1Refs /scm/geomyidae/refs.gph bitreich.org 70 1Tags /scm/geomyidae/tag bitreich.org 70 1README /scm/geomyidae/file/README.gph bitreich.org 70 1LICENSE /scm/geomyidae/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 2d93b6f04f44d94cc38dd1ef666867c0ca95574f /scm/geomyidae/commit/2d93b6f04f44d94cc38dd1ef666867c0ca95574f.gph bitreich.org 70 1parent 23ce04766e993ae515483debfc2c3be1c38b2d0b /scm/geomyidae/commit/23ce04766e993ae515483debfc2c3be1c38b2d0b.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Sat, 30 Jul 2022 13:02:13 +0200 Err bitreich.org 70 i Err bitreich.org 70 iAdd splice speedup for geomyidae. Err bitreich.org 70 i Err bitreich.org 70 iThank you parayd, Evil_Bob! Err bitreich.org 70 i Err bitreich.org 70 iLive from brcon2022. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M ind.c | 49 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 49 insertions(+), 0 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/ind.c b/ind.c /scm/geomyidae/file/ind.c.gph bitreich.org 70 i@@ -3,6 +3,10 @@ Err bitreich.org 70 i * by 20h Err bitreich.org 70 i */ Err bitreich.org 70 i Err bitreich.org 70 i+#ifdef __linux__ Err bitreich.org 70 i+ #define _GNU_SOURCE Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i@@ -21,6 +25,10 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i+#define PAGE_SHIFT 12 Err bitreich.org 70 i+#define PAGE_SIZE (1UL << PAGE_SHIFT) Err bitreich.org 70 i+#define BLOCK_SIZE ((PAGE_SIZE * 16) - 1) Err bitreich.org 70 i+ Err bitreich.org 70 i #include "arg.h" Err bitreich.org 70 i #include "ind.h" Err bitreich.org 70 i #include "handlr.h" Err bitreich.org 70 i@@ -92,6 +100,43 @@ waitforpendingbytes(int sock) Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+#ifdef __linux__ Err bitreich.org 70 i+int Err bitreich.org 70 i+xsplice(int fd, int sock) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int pipefd[2], ret = 0; Err bitreich.org 70 i+ ssize_t nread, nwritten; Err bitreich.org 70 i+ off_t in_offset = 0; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (pipe(pipefd) < 0) { Err bitreich.org 70 i+ perror("pipe"); Err bitreich.org 70 i+ _exit(1); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ do { Err bitreich.org 70 i+ nread = splice(fd, &in_offset, pipefd[1], NULL, Err bitreich.org 70 i+ BLOCK_SIZE, SPLICE_F_MOVE | SPLICE_F_MORE); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (nread <= 0) { Err bitreich.org 70 i+ ret = nread < 0 ? 1 : 0; Err bitreich.org 70 i+ goto out; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ nwritten = splice(pipefd[0], NULL, sock, NULL, BLOCK_SIZE, SPLICE_F_MOVE | SPLICE_F_MORE); Err bitreich.org 70 i+ if (nwritten < 0) { Err bitreich.org 70 i+ ret = 1; Err bitreich.org 70 i+ goto out; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } while (nwritten > 0); Err bitreich.org 70 i+ Err bitreich.org 70 i+out: Err bitreich.org 70 i+ close(pipefd[0]); Err bitreich.org 70 i+ close(pipefd[1]); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return ret; Err bitreich.org 70 i+} Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ Err bitreich.org 70 i int Err bitreich.org 70 i xsendfile(int fd, int sock) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -100,6 +145,10 @@ xsendfile(int fd, int sock) Err bitreich.org 70 i size_t bufsiz = BUFSIZ; Err bitreich.org 70 i int len, sent, optval; Err bitreich.org 70 i Err bitreich.org 70 i+#ifdef splice Err bitreich.org 70 i+ return xsplice(fd, sock); Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ Err bitreich.org 70 i USED(optval); Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 .