summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2004-03-22 13:26:54 +0000
committerLennart Poettering <lennart@poettering.net>2004-03-22 13:26:54 +0000
commit579cae885dbeae7e25e60096c7342ebb0e86aa99 (patch)
tree853b69e907fc22135b3e3ca9af51ae982aff84ce /src
parent975c6f9f7779d2d2d92280c19661c868fd05ca19 (diff)
prepare release 0.4:
use madvise() fix mmap() copy bug update for libd 4.2 git-svn-id: file:///home/lennart/svn/public/syrep/trunk@53 07ea20a6-d2c5-0310-9e02-9ef735347d72
Diffstat (limited to 'src')
-rw-r--r--src/syrep.c9
-rw-r--r--src/util.c28
2 files changed, 28 insertions, 9 deletions
diff --git a/src/syrep.c b/src/syrep.c
index 059dde0..17e6427 100644
--- a/src/syrep.c
+++ b/src/syrep.c
@@ -545,12 +545,17 @@ static int version(const char *argv0) {
"Compiled with %i Bit off_t.\n"
"Compiled with zlib %s, linked to zlib %s.\n"
"Compiled with libdb %i.%i.%i, linked to libdb %i.%i.%i\n"
- "SVN Revision "SVN_REVISION"\n",
+ "SVN Revision "SVN_REVISION"\n"
+#ifdef USE_SENDFILE
+ "Using sendfile(): yes\n",
+#else
+ "Using sendfile(): no\n",
+#endif
argv0,
sizeof(off_t)*8,
ZLIB_VERSION, zlibVersion(),
DB_VERSION_MAJOR, DB_VERSION_MINOR, DB_VERSION_PATCH,
- major, minor, patch);
+ major, minor, patch );
return 0;
}
diff --git a/src/util.c b/src/util.c
index 5361e70..97e470f 100644
--- a/src/util.c
+++ b/src/util.c
@@ -263,18 +263,20 @@ int copy_fd(int sfd, int dfd, off_t l) {
return -1;
}
- msfo = (sfo/psize)*psize;
+ msfo = (off_t) (sfo/psize)*psize;
sm = m+(sfo-msfo);
- sp = mmap(NULL, sm, PROT_READ, MAP_SHARED, sfd, msfo);
+ if ((sp = mmap(NULL, sm, PROT_READ, MAP_SHARED, sfd, msfo)) != MAP_FAILED)
+ madvise(sp, sm, MADV_SEQUENTIAL);
}
if ((dfo = lseek(dfd, 0, SEEK_CUR)) != (off_t) -1) {
if (expand_file(dfd, dfo+l) < 0)
return -1;
- mdfo = (dfo/psize)*psize;
+ mdfo = (off_t) (dfo/psize)*psize;
dm = m+(dfo-mdfo);
- dp = mmap(NULL, dm, PROT_READ|PROT_WRITE, MAP_SHARED, dfd, mdfo);
+ if ((dp = mmap(NULL, dm, PROT_READ|PROT_WRITE, MAP_SHARED, dfd, mdfo)) != MAP_FAILED)
+ madvise(dp, dm, MADV_SEQUENTIAL);
}
}
@@ -346,6 +348,8 @@ int copy_fd(int sfd, int dfd, off_t l) {
return 0;
}
+
+ m = (size_t) (l < MMAPSIZE ? l : MMAPSIZE);
mdfo = (dfo/psize)*psize;
dm = m+(dfo-mdfo);
@@ -353,6 +357,7 @@ int copy_fd(int sfd, int dfd, off_t l) {
fprintf(stderr, "mmap(): %s\n", strerror(errno));
return -1;
}
+ madvise(dp, dm, MADV_SEQUENTIAL);
}
} else if (dp == MAP_FAILED) { /* copy mmap to fd */
@@ -382,6 +387,8 @@ int copy_fd(int sfd, int dfd, off_t l) {
return 0;
}
+
+ m = (size_t) (l < MMAPSIZE ? l : MMAPSIZE);
msfo = (sfo/psize)*psize;
sm = m+(sfo-msfo);
@@ -389,10 +396,13 @@ int copy_fd(int sfd, int dfd, off_t l) {
fprintf(stderr, "mmap(): %s\n", strerror(errno));
return -1;
}
+ madvise(sp, sm, MADV_SEQUENTIAL);
}
} else { /* copy mmap to mmap */
+ assert(sp != MAP_FAILED && dp != MAP_FAILED);
+
for (;;) {
memcpy(dp+(dfo-mdfo), sp+(sfo-msfo), m);
@@ -415,20 +425,24 @@ int copy_fd(int sfd, int dfd, off_t l) {
return 0;
}
- msfo = (sfo/psize)*psize;
+ m = (size_t) (l < MMAPSIZE ? l : MMAPSIZE);
+
+ msfo = (off_t) (sfo/psize)*psize;
sm = m+(sfo-msfo);
if ((sp = mmap(NULL, sm, PROT_READ, MAP_SHARED, sfd, msfo)) == MAP_FAILED) {
fprintf(stderr, "mmap(): %s\n", strerror(errno));
return -1;
}
-
- mdfo = (dfo/psize)*psize;
+ mdfo = (off_t) (dfo/psize)*psize;
dm = m+(dfo-mdfo);
if ((dp = mmap(NULL, dm, PROT_READ|PROT_WRITE, MAP_SHARED, dfd, mdfo)) == MAP_FAILED) {
munmap(sp, sm);
fprintf(stderr, "mmap(): %s\n", strerror(errno));
return -1;
}
+
+ madvise(sp, sm, MADV_SEQUENTIAL);
+ madvise(dp, dm, MADV_SEQUENTIAL);
}
}
}