changeset 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
files audioDB.cpp audioDB.h
diffstat 2 files changed, 37 insertions(+), 22 deletions(-) [+]
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);
   }
 }
 
--- a/audioDB.h	Thu Nov 15 14:58:16 2007 +0000
+++ b/audioDB.h	Thu Nov 15 15:18:37 2007 +0000
@@ -144,7 +144,13 @@
   double* l2normTable;
   double* qNorm;
   double* sNorm;
-  double* timesTable;  
+  double* timesTable;
+
+  size_t fileTableLength;
+  size_t trackTableLength;
+  size_t dataBufLength;
+  size_t timesTableLength;
+  size_t l2normTableLength;
 
   // Flags and parameters
   unsigned verbosity;   // how much do we want to know?
@@ -230,6 +236,11 @@
   l2normTable(0), \
   qNorm(0), \
   timesTable(0), \
+  fileTableLength(0), \
+  trackTableLength(0), \
+  dataBufLength(0), \
+  timesTableLength(0), \
+  l2normTableLength(0), \
   verbosity(1), \
   size(O2_DEFAULTDBSIZE), \
   queryType(O2_POINT_QUERY), \