diff options
author | Lennart Poettering <lennart@poettering.net> | 2004-03-22 13:26:54 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2004-03-22 13:26:54 +0000 |
commit | 579cae885dbeae7e25e60096c7342ebb0e86aa99 (patch) | |
tree | 853b69e907fc22135b3e3ca9af51ae982aff84ce /src | |
parent | 975c6f9f7779d2d2d92280c19661c868fd05ca19 (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.c | 9 | ||||
-rw-r--r-- | src/util.c | 28 |
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; } @@ -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); } } } |