Introduction
Introduction Statistics Contact Development Disclaimer Help
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);
/*
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.