comparison 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
comparison
equal deleted inserted replaced
173:42585bd03636 174:2826339b4e92
377 void audioDB::create(const char* dbName){ 377 void audioDB::create(const char* dbName){
378 if ((dbfid = open (dbName, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) 378 if ((dbfid = open (dbName, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0)
379 error("Can't create database file", dbName, "open"); 379 error("Can't create database file", dbName, "open");
380 get_lock(dbfid, 1); 380 get_lock(dbfid, 1);
381 381
382 // mmap the output file
383 if(verbosity) { 382 if(verbosity) {
384 cerr << "header size:" << O2_HEADERSIZE << endl; 383 cerr << "header size:" << O2_HEADERSIZE << endl;
385 } 384 }
386 385
387 dbH = new dbTableHeaderT(); 386 dbH = new dbTableHeaderT();
394 dbH->version = O2_FORMAT_VERSION; 393 dbH->version = O2_FORMAT_VERSION;
395 dbH->numFiles = 0; 394 dbH->numFiles = 0;
396 dbH->dim = 0; 395 dbH->dim = 0;
397 dbH->flags = 0; 396 dbH->flags = 0;
398 dbH->length = 0; 397 dbH->length = 0;
399 dbH->fileTableOffset = ALIGN_UP(O2_HEADERSIZE, 8); 398 dbH->fileTableOffset = ALIGN_PAGE_UP(O2_HEADERSIZE, 8);
400 dbH->trackTableOffset = ALIGN_UP(dbH->fileTableOffset + O2_FILETABLESIZE*maxfiles, 8); 399 dbH->trackTableOffset = ALIGN_PAGE_UP(dbH->fileTableOffset + O2_FILETABLESIZE*maxfiles, 8);
401 dbH->dataOffset = ALIGN_UP(dbH->trackTableOffset + O2_TRACKTABLESIZE*maxfiles, 8); 400 dbH->dataOffset = ALIGN_PAGE_UP(dbH->trackTableOffset + O2_TRACKTABLESIZE*maxfiles, 8);
402 dbH->l2normTableOffset = ALIGN_DOWN(size - maxfiles*O2_MEANNUMVECTORS*sizeof(double), 8); 401 dbH->l2normTableOffset = ALIGN_PAGE_DOWN(size - maxfiles*O2_MEANNUMVECTORS*sizeof(double), 8);
403 dbH->timesTableOffset = ALIGN_DOWN(dbH->l2normTableOffset - maxfiles*O2_MEANNUMVECTORS*sizeof(double), 8); 402 dbH->timesTableOffset = ALIGN_PAGE_DOWN(dbH->l2normTableOffset - maxfiles*O2_MEANNUMVECTORS*sizeof(double), 8);
404 dbH->dbSize = size; 403 dbH->dbSize = size;
405 404
406 write(dbfid, dbH, O2_HEADERSIZE); 405 write(dbfid, dbH, O2_HEADERSIZE);
407 406
408 // go to the location corresponding to the last byte 407 // go to the location corresponding to the last byte
415 414
416 if(verbosity) { 415 if(verbosity) {
417 cerr << COM_CREATE << " " << dbName << endl; 416 cerr << COM_CREATE << " " << dbName << endl;
418 } 417 }
419 } 418 }
420
421 419
422 void audioDB::drop(){ 420 void audioDB::drop(){
423 // FIXME: drop something? Should we even allow this? 421 // FIXME: drop something? Should we even allow this?
424 } 422 }
425 423
461 if ((db = (char*) mmap(0, dbH->dbSize, PROT_READ | (forWrite ? PROT_WRITE : 0), 459 if ((db = (char*) mmap(0, dbH->dbSize, PROT_READ | (forWrite ? PROT_WRITE : 0),
462 MAP_SHARED, dbfid, 0)) == (caddr_t) -1) 460 MAP_SHARED, dbfid, 0)) == (caddr_t) -1)
463 error("mmap error for initting tables of database", "", "mmap"); 461 error("mmap error for initting tables of database", "", "mmap");
464 462
465 // Make some handy tables with correct types 463 // Make some handy tables with correct types
466 fileTable = (char *) (db + dbH->fileTableOffset); 464 #define CHECKED_MMAP(type, var, start, end) \
467 trackTable = (unsigned *) (db + dbH->trackTableOffset); 465 { void *tmp = mmap(0, ((end) - (start)), (PROT_READ | (forWrite ? PROT_WRITE : 0)), MAP_SHARED, dbfid, (start)); \
468 dataBuf = (double *) (db + dbH->dataOffset); 466 if(tmp == (void *) -1) { \
469 l2normTable = (double *) (db + dbH->l2normTableOffset); 467 error("mmap error for db table", #var, "mmap"); \
470 timesTable = (double *) (db + dbH->timesTableOffset); 468 } \
469 var = (type) tmp; \
470 }
471
472 CHECKED_MMAP(char *, fileTable, dbH->fileTableOffset, dbH->trackTableOffset);
473 CHECKED_MMAP(unsigned *, trackTable, dbH->trackTableOffset, dbH->dataOffset);
474 CHECKED_MMAP(double *, dataBuf, dbH->dataOffset, dbH->timesTableOffset);
475 CHECKED_MMAP(double *, timesTable, dbH->timesTableOffset, dbH->l2normTableOffset);
476 CHECKED_MMAP(double *, l2normTable, dbH->l2normTableOffset, dbH->dbSize);
471 } 477 }
472 478
473 void audioDB::initInputFile (const char *inFile) { 479 void audioDB::initInputFile (const char *inFile) {
474 if (inFile) { 480 if (inFile) {
475 if ((infid = open(inFile, O_RDONLY)) < 0) { 481 if ((infid = open(inFile, O_RDONLY)) < 0) {