summaryrefslogtreecommitdiffstats
path: root/src/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util.c')
-rw-r--r--src/util.c28
1 files changed, 21 insertions, 7 deletions
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);
}
}
}