comparison audioDB.cpp @ 178:7bbe5d48a7ef no-big-mmap

munmap() the separate mappings properly New slots ("member variables" I think they're called in C++) to store how much memory we've mapped at each address.
author mas01cr
date Thu, 15 Nov 2007 15:18:37 +0000
parents c32bf13c3978
children 71c24d0df2c4
comparison
equal deleted inserted replaced
177:c32bf13c3978 178:7bbe5d48a7ef
110 if(indata) 110 if(indata)
111 munmap(indata,statbuf.st_size); 111 munmap(indata,statbuf.st_size);
112 if(db) 112 if(db)
113 munmap(db,getpagesize()); 113 munmap(db,getpagesize());
114 if(fileTable) 114 if(fileTable)
115 munmap(fileTable, dbH->trackTableOffset - dbH->fileTableOffset); 115 munmap(fileTable, fileTableLength);
116 if(trackTable) 116 if(trackTable)
117 munmap(trackTable, dbH->dataOffset - dbH->trackTableOffset); 117 munmap(trackTable, trackTableLength);
118 if(dataBuf) 118 if(dataBuf)
119 munmap(dataBuf, dbH->timesTableOffset - dbH->dataOffset); 119 munmap(dataBuf, dataBufLength);
120 if(timesTable) 120 if(timesTable)
121 munmap(dataBuf, dbH->l2normTableOffset - dbH->timesTableOffset); 121 munmap(dataBuf, timesTableLength);
122 if(l2normTable) 122 if(l2normTable)
123 munmap(l2normTable, dbH->dbSize - dbH->l2normTableOffset); 123 munmap(l2normTable, l2normTableLength);
124 124
125 if(dbfid>0) 125 if(dbfid>0)
126 close(dbfid); 126 close(dbfid);
127 if(infid>0) 127 if(infid>0)
128 close(infid); 128 close(infid);
465 if(dbH->dbSize == 0) { 465 if(dbH->dbSize == 0) {
466 dbH->dbSize = O2_DEFAULTDBSIZE; 466 dbH->dbSize = O2_DEFAULTDBSIZE;
467 } 467 }
468 468
469 // Make some handy tables with correct types 469 // Make some handy tables with correct types
470 #define CHECKED_MMAP(type, var, start, end) \ 470 #define CHECKED_MMAP(type, var, start, length) \
471 { void *tmp = mmap(0, ((end) - (start)), (PROT_READ | (forWrite ? PROT_WRITE : 0)), MAP_SHARED, dbfid, (start)); \ 471 { void *tmp = mmap(0, length, (PROT_READ | (forWrite ? PROT_WRITE : 0)), MAP_SHARED, dbfid, (start)); \
472 if(tmp == (void *) -1) { \ 472 if(tmp == (void *) -1) { \
473 error("mmap error for db table", #var, "mmap"); \ 473 error("mmap error for db table", #var, "mmap"); \
474 } \ 474 } \
475 var = (type) tmp; \ 475 var = (type) tmp; \
476 } 476 }
477 477
478 CHECKED_MMAP(char *, db, 0, getpagesize()); 478 CHECKED_MMAP(char *, db, 0, getpagesize());
479 479
480 if(forWrite) { 480 if(forWrite || (dbH->length > 0)) {
481 CHECKED_MMAP(char *, fileTable, dbH->fileTableOffset, dbH->trackTableOffset); 481 if(forWrite) {
482 482 fileTableLength = dbH->trackTableOffset - dbH->fileTableOffset;
483 CHECKED_MMAP(unsigned *, trackTable, dbH->trackTableOffset, dbH->dataOffset); 483 trackTableLength = dbH->dataOffset - dbH->trackTableOffset;
484 CHECKED_MMAP(double *, dataBuf, dbH->dataOffset, dbH->timesTableOffset); 484 dataBufLength = dbH->timesTableOffset - dbH->dataOffset;
485 CHECKED_MMAP(double *, timesTable, dbH->timesTableOffset, dbH->l2normTableOffset); 485 timesTableLength = dbH->l2normTableOffset - dbH->timesTableOffset;
486 CHECKED_MMAP(double *, l2normTable, dbH->l2normTableOffset, dbH->dbSize); 486 l2normTableLength = dbH->dbSize - dbH->l2normTableOffset;
487 } else { 487 } else {
488 if(dbH->length > 0) { 488 fileTableLength = ALIGN_PAGE_UP(dbH->numFiles * O2_FILETABLESIZE);
489 CHECKED_MMAP(char *, fileTable, dbH->fileTableOffset, dbH->fileTableOffset + ALIGN_PAGE_UP(dbH->numFiles * O2_FILETABLESIZE)); 489 trackTableLength = ALIGN_PAGE_UP(dbH->numFiles * O2_TRACKTABLESIZE);
490 CHECKED_MMAP(unsigned *, trackTable, dbH->trackTableOffset, dbH->trackTableOffset + ALIGN_PAGE_UP(dbH->numFiles * O2_TRACKTABLESIZE)); 490 dataBufLength = ALIGN_PAGE_UP(dbH->length);
491 CHECKED_MMAP(double *, dataBuf, dbH->dataOffset, dbH->dataOffset + ALIGN_PAGE_UP(dbH->length)); 491 timesTableLength = ALIGN_PAGE_UP(dbH->length / dbH->dim);
492 CHECKED_MMAP(double *, timesTable, dbH->timesTableOffset, dbH->timesTableOffset + ALIGN_PAGE_UP(dbH->length / dbH->dim)); 492 l2normTableLength = ALIGN_PAGE_UP(dbH->length / dbH->dim);
493 CHECKED_MMAP(double *, l2normTable, dbH->l2normTableOffset, dbH->l2normTableOffset + ALIGN_PAGE_UP(dbH->length / dbH->dim)); 493 }
494 } 494 CHECKED_MMAP(char *, fileTable, dbH->fileTableOffset, fileTableLength);
495 CHECKED_MMAP(unsigned *, trackTable, dbH->trackTableOffset, trackTableLength);
496 CHECKED_MMAP(double *, dataBuf, dbH->dataOffset, dataBufLength);
497 CHECKED_MMAP(double *, timesTable, dbH->timesTableOffset, timesTableLength);
498 CHECKED_MMAP(double *, l2normTable, dbH->l2normTableOffset, l2normTableLength);
495 } 499 }
496 } 500 }
497 501
498 void audioDB::initInputFile (const char *inFile) { 502 void audioDB::initInputFile (const char *inFile) {
499 if (inFile) { 503 if (inFile) {