Mercurial > hg > audiodb
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) { |