# HG changeset patch # User mas01cr # Date 1195139917 0 # Node ID 7bbe5d48a7efe24ef5e90e60eb520c8b0ed28d72 # Parent c32bf13c3978650a3b363bbd93c4e8c6df854705 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. diff -r c32bf13c3978 -r 7bbe5d48a7ef audioDB.cpp --- 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); } } diff -r c32bf13c3978 -r 7bbe5d48a7ef audioDB.h --- 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), \