Mercurial > hg > audiodb
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; }