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