# HG changeset patch # User mas01cr # Date 1195057938 0 # Node ID 2826339b4e928f8dd50ee69019d22b27d4f4bc68 # Parent 42585bd0363608b281d47528fe1c2aa7a2aa1342 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. diff -r 42585bd03636 -r 2826339b4e92 audioDB.cpp --- 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) { diff -r 42585bd03636 -r 2826339b4e92 audioDB.h --- 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<