Mercurial > hg > audiodb
diff audioDB.cpp @ 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 |
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) {