diff 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
line wrap: on
line diff
--- a/audioDB.cpp	Thu Nov 15 14:58:16 2007 +0000
+++ b/audioDB.cpp	Thu Nov 15 15:18:37 2007 +0000
@@ -112,15 +112,15 @@
   if(db)
     munmap(db,getpagesize());
   if(fileTable)
-    munmap(fileTable, dbH->trackTableOffset - dbH->fileTableOffset);
+    munmap(fileTable, fileTableLength);
   if(trackTable)
-    munmap(trackTable, dbH->dataOffset - dbH->trackTableOffset);
+    munmap(trackTable, trackTableLength);
   if(dataBuf)
-    munmap(dataBuf, dbH->timesTableOffset - dbH->dataOffset);
+    munmap(dataBuf, dataBufLength);
   if(timesTable)
-    munmap(dataBuf, dbH->l2normTableOffset - dbH->timesTableOffset);
+    munmap(dataBuf, timesTableLength);
   if(l2normTable)
-    munmap(l2normTable, dbH->dbSize - dbH->l2normTableOffset);
+    munmap(l2normTable, l2normTableLength);
 
   if(dbfid>0)
     close(dbfid);
@@ -467,8 +467,8 @@
   }
 
   // Make some handy tables with correct types
-#define CHECKED_MMAP(type, var, start, end) \
-  { void *tmp = mmap(0, ((end) - (start)), (PROT_READ | (forWrite ? PROT_WRITE : 0)), MAP_SHARED, dbfid, (start)); \
+#define CHECKED_MMAP(type, var, start, length) \
+  { void *tmp = mmap(0, length, (PROT_READ | (forWrite ? PROT_WRITE : 0)), MAP_SHARED, dbfid, (start)); \
     if(tmp == (void *) -1) { \
       error("mmap error for db table", #var, "mmap"); \
     } \
@@ -477,21 +477,25 @@
 
   CHECKED_MMAP(char *, db, 0, getpagesize());
 
-  if(forWrite) {
-    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);
-  } else {
-    if(dbH->length > 0) {
-      CHECKED_MMAP(char *, fileTable, dbH->fileTableOffset, dbH->fileTableOffset + ALIGN_PAGE_UP(dbH->numFiles * O2_FILETABLESIZE));
-      CHECKED_MMAP(unsigned *, trackTable, dbH->trackTableOffset, dbH->trackTableOffset + ALIGN_PAGE_UP(dbH->numFiles * O2_TRACKTABLESIZE));
-      CHECKED_MMAP(double *, dataBuf, dbH->dataOffset, dbH->dataOffset + ALIGN_PAGE_UP(dbH->length));
-      CHECKED_MMAP(double *, timesTable, dbH->timesTableOffset, dbH->timesTableOffset + ALIGN_PAGE_UP(dbH->length / dbH->dim));
-      CHECKED_MMAP(double *, l2normTable, dbH->l2normTableOffset, dbH->l2normTableOffset + ALIGN_PAGE_UP(dbH->length / dbH->dim));
+  if(forWrite || (dbH->length > 0)) {
+    if(forWrite) {
+      fileTableLength = dbH->trackTableOffset - dbH->fileTableOffset;
+      trackTableLength = dbH->dataOffset - dbH->trackTableOffset;
+      dataBufLength = dbH->timesTableOffset - dbH->dataOffset;
+      timesTableLength = dbH->l2normTableOffset - dbH->timesTableOffset;
+      l2normTableLength = dbH->dbSize - dbH->l2normTableOffset;
+    } else {
+      fileTableLength = ALIGN_PAGE_UP(dbH->numFiles * O2_FILETABLESIZE);
+      trackTableLength = ALIGN_PAGE_UP(dbH->numFiles * O2_TRACKTABLESIZE);
+      dataBufLength = ALIGN_PAGE_UP(dbH->length);
+      timesTableLength = ALIGN_PAGE_UP(dbH->length / dbH->dim);
+      l2normTableLength = ALIGN_PAGE_UP(dbH->length / dbH->dim);
     }
+    CHECKED_MMAP(char *, fileTable, dbH->fileTableOffset, fileTableLength);
+    CHECKED_MMAP(unsigned *, trackTable, dbH->trackTableOffset, trackTableLength);
+    CHECKED_MMAP(double *, dataBuf, dbH->dataOffset, dataBufLength);
+    CHECKED_MMAP(double *, timesTable, dbH->timesTableOffset, timesTableLength);
+    CHECKED_MMAP(double *, l2normTable, dbH->l2normTableOffset, l2normTableLength);
   }
 }