changeset 592:cfa74bcc1249

Remove uses of mmap() from open.cpp (These are relatively easy to deal with; just replace them with an lseek()/read() pair. Of course, now we're destructively modifying the fd position; I'd have liked to use pread() but, surprise, that's not available on mingw.)
author mas01cr
date Tue, 11 Aug 2009 21:42:29 +0000
parents 0242e5d1643c
children 70acfcb5010a
files audioDB-internals.h open.cpp
diffstat 2 files changed, 25 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/audioDB-internals.h	Tue Aug 11 21:42:24 2009 +0000
+++ b/audioDB-internals.h	Tue Aug 11 21:42:29 2009 +0000
@@ -192,6 +192,11 @@
     } \
   }
 
+#define lseek_set_or_goto_error(fd, offset) \
+  { if(lseek(fd, offset, SEEK_SET) == (off_t) -1) \
+      goto error; \
+  } \
+
 static inline int audiodb_sync_header(adb_t *adb) {
   off_t pos;
   pos = lseek(adb->fd, (off_t) 0, SEEK_CUR);
--- a/open.cpp	Tue Aug 11 21:42:24 2009 +0000
+++ b/open.cpp	Tue Aug 11 21:42:29 2009 +0000
@@ -28,18 +28,25 @@
   if(adb->header->length > 0) {
     unsigned nfiles = adb->header->numFiles;
     key_table_length = align_page_up(nfiles * ADB_FILETABLE_ENTRY_SIZE);
-    mmap_or_goto_error(char *, key_table, adb->header->fileTableOffset, key_table_length);
+    key_table = (char *)malloc(key_table_length);
+    if(!key_table) {
+      goto error;
+    }
+    lseek_set_or_goto_error(adb->fd, adb->header->fileTableOffset);
+    read_or_goto_error(adb->fd, key_table, key_table_length);
     for (unsigned int k = 0; k < nfiles; k++) {
       adb->keys->push_back(key_table + k*ADB_FILETABLE_ENTRY_SIZE);
       (*adb->keymap)[(key_table + k*ADB_FILETABLE_ENTRY_SIZE)] = k;
     }
-    munmap(key_table, key_table_length);
+    free(key_table);
   }
 
   return 0;
 
  error:
-  maybe_munmap(key_table, key_table_length);
+  if(key_table) {
+    free(key_table);
+  }
   return 1;
 }
 
@@ -49,7 +56,12 @@
   if(adb->header->length > 0) {
     unsigned nfiles = adb->header->numFiles;
     track_table_length = align_page_up(nfiles * ADB_TRACKTABLE_ENTRY_SIZE);
-    mmap_or_goto_error(uint32_t *, track_table, adb->header->trackTableOffset, track_table_length);
+    track_table = (uint32_t *) malloc(track_table_length);
+    if (!track_table) {
+      goto error;
+    }
+    lseek_set_or_goto_error(adb->fd, adb->header->trackTableOffset);
+    read_or_goto_error(adb->fd, track_table, track_table_length);
     off_t offset = 0;
     for (unsigned int k = 0; k < nfiles; k++) {
       uint32_t track_length = track_table[k];
@@ -57,13 +69,15 @@
       adb->track_offsets->push_back(offset);
       offset += track_length * adb->header->dim * sizeof(double);
     }
-    munmap(track_table, track_table_length);
+    free(track_table);
   }
 
   return 0;
 
  error:
-  maybe_munmap(track_table, track_table_length);
+  if(track_table) {
+    free(track_table);
+  }
   return 1;
 }