Mercurial > hg > audiodb
changeset 174:2826339b4e92 no-big-mmap
mmap() the various tables separately on init.
Continue mmap()ing the whole database as well, as there is still use of
it elsewhere in one or two naughty places.
mmap()ing individual tables means aligning to page boundaries; make it
so.
author | mas01cr |
---|---|
date | Wed, 14 Nov 2007 16:32:18 +0000 |
parents | 42585bd03636 |
children | 38bdbab60972 |
files | audioDB.cpp audioDB.h |
diffstat | 2 files changed, 21 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/audioDB.cpp Wed Nov 14 15:57:15 2007 +0000 +++ b/audioDB.cpp Wed Nov 14 16:32:18 2007 +0000 @@ -379,7 +379,6 @@ error("Can't create database file", dbName, "open"); get_lock(dbfid, 1); - // mmap the output file if(verbosity) { cerr << "header size:" << O2_HEADERSIZE << endl; } @@ -396,11 +395,11 @@ dbH->dim = 0; dbH->flags = 0; dbH->length = 0; - dbH->fileTableOffset = ALIGN_UP(O2_HEADERSIZE, 8); - dbH->trackTableOffset = ALIGN_UP(dbH->fileTableOffset + O2_FILETABLESIZE*maxfiles, 8); - dbH->dataOffset = ALIGN_UP(dbH->trackTableOffset + O2_TRACKTABLESIZE*maxfiles, 8); - dbH->l2normTableOffset = ALIGN_DOWN(size - maxfiles*O2_MEANNUMVECTORS*sizeof(double), 8); - dbH->timesTableOffset = ALIGN_DOWN(dbH->l2normTableOffset - maxfiles*O2_MEANNUMVECTORS*sizeof(double), 8); + dbH->fileTableOffset = ALIGN_PAGE_UP(O2_HEADERSIZE, 8); + dbH->trackTableOffset = ALIGN_PAGE_UP(dbH->fileTableOffset + O2_FILETABLESIZE*maxfiles, 8); + dbH->dataOffset = ALIGN_PAGE_UP(dbH->trackTableOffset + O2_TRACKTABLESIZE*maxfiles, 8); + dbH->l2normTableOffset = ALIGN_PAGE_DOWN(size - maxfiles*O2_MEANNUMVECTORS*sizeof(double), 8); + dbH->timesTableOffset = ALIGN_PAGE_DOWN(dbH->l2normTableOffset - maxfiles*O2_MEANNUMVECTORS*sizeof(double), 8); dbH->dbSize = size; write(dbfid, dbH, O2_HEADERSIZE); @@ -418,7 +417,6 @@ } } - void audioDB::drop(){ // FIXME: drop something? Should we even allow this? } @@ -463,11 +461,19 @@ error("mmap error for initting tables of database", "", "mmap"); // Make some handy tables with correct types - fileTable = (char *) (db + dbH->fileTableOffset); - trackTable = (unsigned *) (db + dbH->trackTableOffset); - dataBuf = (double *) (db + dbH->dataOffset); - l2normTable = (double *) (db + dbH->l2normTableOffset); - timesTable = (double *) (db + dbH->timesTableOffset); +#define CHECKED_MMAP(type, var, start, end) \ + { void *tmp = mmap(0, ((end) - (start)), (PROT_READ | (forWrite ? PROT_WRITE : 0)), MAP_SHARED, dbfid, (start)); \ + if(tmp == (void *) -1) { \ + error("mmap error for db table", #var, "mmap"); \ + } \ + var = (type) tmp; \ + } + + 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); } void audioDB::initInputFile (const char *inFile) {
--- a/audioDB.h Wed Nov 14 15:57:15 2007 +0000 +++ b/audioDB.h Wed Nov 14 16:32:18 2007 +0000 @@ -83,6 +83,9 @@ #define ALIGN_UP(x,w) ((x) + ((1<<w)-1) & ~((1<<w)-1)) #define ALIGN_DOWN(x,w) ((x) & ~((1<<w)-1)) +#define ALIGN_PAGE_UP(x,w) ((x) + (getpagesize()-1) & ~(getpagesize()-1)) +#define ALIGN_PAGE_DOWN(x,w) ((x) & ~(getpagesize()-1)) + #define ENSURE_STRING(x) ((x) ? (x) : "") using namespace std;