Mercurial > hg > audiodb
changeset 178:7bbe5d48a7ef no-big-mmap
munmap() the separate mappings properly
New slots ("member variables" I think they're called in C++) to store
how much memory we've mapped at each address.
author | mas01cr |
---|---|
date | Thu, 15 Nov 2007 15:18:37 +0000 |
parents | c32bf13c3978 |
children | 71c24d0df2c4 |
files | audioDB.cpp audioDB.h |
diffstat | 2 files changed, 37 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- a/audioDB.cpp Thu Nov 15 14:58:16 2007 +0000 +++ b/audioDB.cpp Thu Nov 15 15:18:37 2007 +0000 @@ -112,15 +112,15 @@ if(db) munmap(db,getpagesize()); if(fileTable) - munmap(fileTable, dbH->trackTableOffset - dbH->fileTableOffset); + munmap(fileTable, fileTableLength); if(trackTable) - munmap(trackTable, dbH->dataOffset - dbH->trackTableOffset); + munmap(trackTable, trackTableLength); if(dataBuf) - munmap(dataBuf, dbH->timesTableOffset - dbH->dataOffset); + munmap(dataBuf, dataBufLength); if(timesTable) - munmap(dataBuf, dbH->l2normTableOffset - dbH->timesTableOffset); + munmap(dataBuf, timesTableLength); if(l2normTable) - munmap(l2normTable, dbH->dbSize - dbH->l2normTableOffset); + munmap(l2normTable, l2normTableLength); if(dbfid>0) close(dbfid); @@ -467,8 +467,8 @@ } // Make some handy tables with correct types -#define CHECKED_MMAP(type, var, start, end) \ - { void *tmp = mmap(0, ((end) - (start)), (PROT_READ | (forWrite ? PROT_WRITE : 0)), MAP_SHARED, dbfid, (start)); \ +#define CHECKED_MMAP(type, var, start, length) \ + { void *tmp = mmap(0, length, (PROT_READ | (forWrite ? PROT_WRITE : 0)), MAP_SHARED, dbfid, (start)); \ if(tmp == (void *) -1) { \ error("mmap error for db table", #var, "mmap"); \ } \ @@ -477,21 +477,25 @@ CHECKED_MMAP(char *, db, 0, getpagesize()); - if(forWrite) { - CHECKED_MMAP(char *, fileTable, dbH->fileTableOffset, dbH->trackTableOffset); - - CHECKED_MMAP(unsigned *, trackTable, dbH->trackTableOffset, dbH->dataOffset); - CHECKED_MMAP(double *, dataBuf, dbH->dataOffset, dbH->timesTableOffset); - CHECKED_MMAP(double *, timesTable, dbH->timesTableOffset, dbH->l2normTableOffset); - CHECKED_MMAP(double *, l2normTable, dbH->l2normTableOffset, dbH->dbSize); - } else { - if(dbH->length > 0) { - CHECKED_MMAP(char *, fileTable, dbH->fileTableOffset, dbH->fileTableOffset + ALIGN_PAGE_UP(dbH->numFiles * O2_FILETABLESIZE)); - CHECKED_MMAP(unsigned *, trackTable, dbH->trackTableOffset, dbH->trackTableOffset + ALIGN_PAGE_UP(dbH->numFiles * O2_TRACKTABLESIZE)); - CHECKED_MMAP(double *, dataBuf, dbH->dataOffset, dbH->dataOffset + ALIGN_PAGE_UP(dbH->length)); - CHECKED_MMAP(double *, timesTable, dbH->timesTableOffset, dbH->timesTableOffset + ALIGN_PAGE_UP(dbH->length / dbH->dim)); - CHECKED_MMAP(double *, l2normTable, dbH->l2normTableOffset, dbH->l2normTableOffset + ALIGN_PAGE_UP(dbH->length / dbH->dim)); + if(forWrite || (dbH->length > 0)) { + if(forWrite) { + fileTableLength = dbH->trackTableOffset - dbH->fileTableOffset; + trackTableLength = dbH->dataOffset - dbH->trackTableOffset; + dataBufLength = dbH->timesTableOffset - dbH->dataOffset; + timesTableLength = dbH->l2normTableOffset - dbH->timesTableOffset; + l2normTableLength = dbH->dbSize - dbH->l2normTableOffset; + } else { + fileTableLength = ALIGN_PAGE_UP(dbH->numFiles * O2_FILETABLESIZE); + trackTableLength = ALIGN_PAGE_UP(dbH->numFiles * O2_TRACKTABLESIZE); + dataBufLength = ALIGN_PAGE_UP(dbH->length); + timesTableLength = ALIGN_PAGE_UP(dbH->length / dbH->dim); + l2normTableLength = ALIGN_PAGE_UP(dbH->length / dbH->dim); } + CHECKED_MMAP(char *, fileTable, dbH->fileTableOffset, fileTableLength); + CHECKED_MMAP(unsigned *, trackTable, dbH->trackTableOffset, trackTableLength); + CHECKED_MMAP(double *, dataBuf, dbH->dataOffset, dataBufLength); + CHECKED_MMAP(double *, timesTable, dbH->timesTableOffset, timesTableLength); + CHECKED_MMAP(double *, l2normTable, dbH->l2normTableOffset, l2normTableLength); } }
--- a/audioDB.h Thu Nov 15 14:58:16 2007 +0000 +++ b/audioDB.h Thu Nov 15 15:18:37 2007 +0000 @@ -144,7 +144,13 @@ double* l2normTable; double* qNorm; double* sNorm; - double* timesTable; + double* timesTable; + + size_t fileTableLength; + size_t trackTableLength; + size_t dataBufLength; + size_t timesTableLength; + size_t l2normTableLength; // Flags and parameters unsigned verbosity; // how much do we want to know? @@ -230,6 +236,11 @@ l2normTable(0), \ qNorm(0), \ timesTable(0), \ + fileTableLength(0), \ + trackTableLength(0), \ + dataBufLength(0), \ + timesTableLength(0), \ + l2normTableLength(0), \ verbosity(1), \ size(O2_DEFAULTDBSIZE), \ queryType(O2_POINT_QUERY), \