changeset 596:6ad0a6e67d4c

Take advantage of those new handy _or_goto_error macros Use them in various places where previously we either elided the error checking (various lseek() calls) or used a combination of calls (replaced by malloc_and_fill_or_goto_error()). In the process, fix what is probably a bug (or else introduce one, but I don't think so): audiodb_track_id_datum() computed the offset into the timesTable wrongly, forgetting to multiply by 2. (TODO: this should be easily testable using the API). Now all of LIBOBJS can be produced by my (Debian's) mingw32 cross-compiler, except for lshlib.o.
author mas01cr
date Tue, 11 Aug 2009 21:42:49 +0000
parents 31a1556fc2d6
children fac63f65753e
files Makefile create.cpp dump.cpp insert.cpp open.cpp query.cpp
diffstat 6 files changed, 44 insertions(+), 99 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Tue Aug 11 21:42:44 2009 +0000
+++ b/Makefile	Tue Aug 11 21:42:49 2009 +0000
@@ -8,7 +8,7 @@
 
 SHARED_LIB_FLAGS=-shared -Wl,-soname,
 
-LIBOBJS=lock.o pointpair.o create.o open.o power.o l2norm.o insert.o status.o query.o dump.o close.o lshlib.o index-utils.o query-indexed.o liszt.o retrieve.o
+LIBOBJS=lock.o pointpair.o create.o open.o power.o l2norm.o insert.o status.o query.o dump.o close.o index-utils.o query-indexed.o liszt.o retrieve.o lshlib.o
 OBJS=$(LIBOBJS) index.o soap.o sample.o cmdline.o audioDB.o common.o
 
 EXECUTABLE=audioDB
--- a/create.cpp	Tue Aug 11 21:42:44 2009 +0000
+++ b/create.cpp	Tue Aug 11 21:42:49 2009 +0000
@@ -88,20 +88,15 @@
 
   write_or_goto_error(fd, header, ADB_HEADER_SIZE);
 
-  // go to the location corresponding to the last byte
-  if (lseek (fd, header->dbSize - 1, SEEK_SET) == -1) {
-    goto error;
-  }
-
-  // write a dummy byte at the last location
+  // go to the location corresponding to the last byte of the database
+  // file, and write a byte there.
+  lseek_set_or_goto_error(fd, header->dbSize - 1);
   write_or_goto_error(fd, "", 1);
 
   free(header);
   return audiodb_open(path, O_RDWR);
 
  error:
-  if(header) {
-    free(header);
-  }
+  maybe_free(header);
   return NULL;
 }
--- a/dump.cpp	Tue Aug 11 21:42:44 2009 +0000
+++ b/dump.cpp	Tue Aug 11 21:42:49 2009 +0000
@@ -99,7 +99,7 @@
   }
   kLFile = fdopen(kLfd, "w");
 
-  lseek(adb->fd, adb->header->dataOffset, SEEK_SET);
+  lseek_set_or_goto_error(adb->fd, adb->header->dataOffset);
 
   for(unsigned k = 0; k < nfiles; k++) {
     fprintf(kLFile, "%s\n", fileTable + k*ADB_FILETABLE_ENTRY_SIZE);
--- a/insert.cpp	Tue Aug 11 21:42:44 2009 +0000
+++ b/insert.cpp	Tue Aug 11 21:42:49 2009 +0000
@@ -134,9 +134,9 @@
   nfiles = adb->header->numFiles;
 
   /* FIXME: checking for all these lseek()s */
-  lseek(adb->fd, adb->header->fileTableOffset + nfiles * ADB_FILETABLE_ENTRY_SIZE, SEEK_SET);
+  lseek_set_or_goto_error(adb->fd, adb->header->fileTableOffset + nfiles * ADB_FILETABLE_ENTRY_SIZE);
   write_or_goto_error(adb->fd, datum->key, strlen(datum->key)+1);
-  lseek(adb->fd, adb->header->trackTableOffset + nfiles * ADB_TRACKTABLE_ENTRY_SIZE, SEEK_SET);
+  lseek_set_or_goto_error(adb->fd, adb->header->trackTableOffset + nfiles * ADB_TRACKTABLE_ENTRY_SIZE);
   write_or_goto_error(adb->fd, &datum->nvectors, ADB_TRACKTABLE_ENTRY_SIZE);
   if(adb->header->flags & ADB_HEADER_FLAG_REFERENCES) {
     char cwd[PATH_MAX];
@@ -145,14 +145,14 @@
     if(!getcwd(cwd, PATH_MAX)) {
       goto error;
     }
-    lseek(adb->fd, adb->header->dataOffset + nfiles * ADB_FILETABLE_ENTRY_SIZE, SEEK_SET);
+    lseek_set_or_goto_error(adb->fd, adb->header->dataOffset + nfiles * ADB_FILETABLE_ENTRY_SIZE);
     if(*((char *) datum->data) != '/') {
       write_or_goto_error(adb->fd, cwd, strlen(cwd));
       write_or_goto_error(adb->fd, &slash, 1);
     }
     write_or_goto_error(adb->fd, datum->data, strlen((const char *) datum->data)+1);
     if(datum->power) {
-      lseek(adb->fd, adb->header->powerTableOffset + nfiles * ADB_FILETABLE_ENTRY_SIZE, SEEK_SET);
+      lseek_set_or_goto_error(adb->fd, adb->header->powerTableOffset + nfiles * ADB_FILETABLE_ENTRY_SIZE);
       if(*((char *) datum->power) != '/') {
         write_or_goto_error(adb->fd, cwd, strlen(cwd));
         write_or_goto_error(adb->fd, &slash, 1);
@@ -160,7 +160,7 @@
       write_or_goto_error(adb->fd, datum->power, strlen((const char *) datum->power)+1);
     }
     if(datum->times) {
-      lseek(adb->fd, adb->header->timesTableOffset + nfiles * ADB_FILETABLE_ENTRY_SIZE, SEEK_SET);
+      lseek_set_or_goto_error(adb->fd, adb->header->timesTableOffset + nfiles * ADB_FILETABLE_ENTRY_SIZE);
       if(*((char *) datum->times) != '/') {
         write_or_goto_error(adb->fd, cwd, strlen(cwd));
         write_or_goto_error(adb->fd, &slash, 1);
@@ -168,14 +168,14 @@
       write_or_goto_error(adb->fd, datum->times, strlen((const char *) datum->times)+1);
     }
   } else {
-    lseek(adb->fd, adb->header->dataOffset + offset, SEEK_SET);
+    lseek_set_or_goto_error(adb->fd, adb->header->dataOffset + offset);
     write_or_goto_error(adb->fd, datum->data, sizeof(double) * datum->nvectors * datum->dim);
     if(datum->power) {
-      lseek(adb->fd, adb->header->powerTableOffset + offset / datum->dim, SEEK_SET);
+      lseek_set_or_goto_error(adb->fd, adb->header->powerTableOffset + offset / datum->dim);
       write_or_goto_error(adb->fd, datum->power, sizeof(double) * datum->nvectors);
     }
     if(datum->times) {
-      lseek(adb->fd, adb->header->timesTableOffset + offset / datum->dim * 2, SEEK_SET);
+      lseek_set_or_goto_error(adb->fd, adb->header->timesTableOffset + offset / datum->dim * 2);
       write_or_goto_error(adb->fd, datum->times, sizeof(double) * datum->nvectors * 2);
     }
   }
@@ -188,7 +188,7 @@
     l2norm_buffer = (double *) malloc(datum->nvectors * sizeof(double));
     
     audiodb_l2norm_buffer((double *) datum->data, datum->dim, datum->nvectors, l2norm_buffer);
-    lseek(adb->fd, adb->header->l2normTableOffset + offset / datum->dim, SEEK_SET);
+    lseek_set_or_goto_error(adb->fd, adb->header->l2normTableOffset + offset / datum->dim);
     write_or_goto_error(adb->fd, l2norm_buffer, sizeof(double) * datum->nvectors);
     free(l2norm_buffer);
     l2norm_buffer = NULL;
@@ -208,9 +208,7 @@
   return audiodb_sync_header(adb);
 
  error:
-  if(l2norm_buffer) {
-    free(l2norm_buffer);
-  }
+  maybe_free(l2norm_buffer);
   return 1;
 }
 
--- a/open.cpp	Tue Aug 11 21:42:44 2009 +0000
+++ b/open.cpp	Tue Aug 11 21:42:49 2009 +0000
@@ -28,12 +28,7 @@
   if(adb->header->length > 0) {
     unsigned nfiles = adb->header->numFiles;
     key_table_length = align_page_up(nfiles * ADB_FILETABLE_ENTRY_SIZE);
-    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);
+    malloc_and_fill_or_goto_error(char *, key_table, adb->header->fileTableOffset, 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;
@@ -44,9 +39,7 @@
   return 0;
 
  error:
-  if(key_table) {
-    free(key_table);
-  }
+  maybe_free(key_table);
   return 1;
 }
 
@@ -56,12 +49,7 @@
   if(adb->header->length > 0) {
     unsigned nfiles = adb->header->numFiles;
     track_table_length = align_page_up(nfiles * ADB_TRACKTABLE_ENTRY_SIZE);
-    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);
+    malloc_and_fill_or_goto_error(uint32_t *, track_table, adb->header->trackTableOffset, track_table_length);
     off_t offset = 0;
     for (unsigned int k = 0; k < nfiles; k++) {
       uint32_t track_length = track_table[k];
@@ -75,9 +63,7 @@
   return 0;
 
  error:
-  if(track_table) {
-    free(track_table);
-  }
+  maybe_free(track_table);
   return 1;
 }
 
@@ -146,12 +132,8 @@
 
  error:
   if(adb) {
-    if(adb->header) {
-      free(adb->header);
-    }
-    if(adb->path) {
-      free(adb->path);
-    }
+    maybe_free(adb->header);
+    maybe_free(adb->path);
     if(adb->keys) {
       delete adb->keys;
     }
--- a/query.cpp	Tue Aug 11 21:42:44 2009 +0000
+++ b/query.cpp	Tue Aug 11 21:42:49 2009 +0000
@@ -203,16 +203,16 @@
     /* create a reference/insert, then use adb_insert_create_datum() */
     adb_reference_t reference = {0};
     char features[ADB_MAXSTR], power[ADB_MAXSTR], times[ADB_MAXSTR];
-    lseek(adb->fd, adb->header->dataOffset + track_id * ADB_FILETABLE_ENTRY_SIZE, SEEK_SET);
+    lseek_set_or_goto_error(adb->fd, adb->header->dataOffset + track_id * ADB_FILETABLE_ENTRY_SIZE);
     read_or_goto_error(adb->fd, features, ADB_MAXSTR);
     reference.features = features;
     if(adb->header->flags & ADB_HEADER_FLAG_POWER) {
-      lseek(adb->fd, adb->header->powerTableOffset + track_id * ADB_FILETABLE_ENTRY_SIZE, SEEK_SET);
+      lseek_set_or_goto_error(adb->fd, adb->header->powerTableOffset + track_id * ADB_FILETABLE_ENTRY_SIZE);
       read_or_goto_error(adb->fd, power, ADB_MAXSTR);
       reference.power = power;
     }
     if(adb->header->flags & ADB_HEADER_FLAG_TIMES) {
-      lseek(adb->fd, adb->header->timesTableOffset + track_id * ADB_FILETABLE_ENTRY_SIZE, SEEK_SET);
+      lseek_set_or_goto_error(adb->fd, adb->header->timesTableOffset + track_id * ADB_FILETABLE_ENTRY_SIZE);
       read_or_goto_error(adb->fd, times, ADB_MAXSTR);
       reference.times = times;
     }
@@ -223,18 +223,12 @@
     d->dim = adb->header->dim;
     d->key = (*adb->keys)[track_id].c_str();
     /* read out stuff from the database tables */
-    d->data = (double *) malloc(d->nvectors * d->dim * sizeof(double));
-    lseek(adb->fd, adb->header->dataOffset + track_offset, SEEK_SET);
-    read_or_goto_error(adb->fd, d->data, d->nvectors * d->dim * sizeof(double));
+    malloc_and_fill_or_goto_error(double *, d->data, adb->header->dataOffset + track_offset, d->nvectors * d->dim * sizeof(double));
     if(adb->header->flags & ADB_HEADER_FLAG_POWER) {
-      d->power = (double *) malloc(d->nvectors * sizeof(double));
-      lseek(adb->fd, adb->header->powerTableOffset + track_offset / d->dim, SEEK_SET);
-      read_or_goto_error(adb->fd, d->power, d->nvectors * sizeof(double));
+      malloc_and_fill_or_goto_error(double *, d->power, adb->header->powerTableOffset + track_offset / d->dim, d->nvectors * sizeof(double));
     }
     if(adb->header->flags & ADB_HEADER_FLAG_TIMES) {
-      d->times = (double *) malloc(2 * d->nvectors * sizeof(double));
-      lseek(adb->fd, adb->header->timesTableOffset + track_offset / d->dim, SEEK_SET);
-      read_or_goto_error(adb->fd, d->times, 2 * d->nvectors * sizeof(double));
+      malloc_and_fill_or_goto_error(double *, d->times, adb->header->timesTableOffset + 2 * track_offset / d->dim, 2 * d->nvectors * sizeof(double));
     }
     return 0;
   }
@@ -351,7 +345,7 @@
   dbpointers->l2norm_data = new double[nvectors];
 
   double *snpp = dbpointers->l2norm_data, *sppp = 0;
-  lseek(adb->fd, adb->header->l2normTableOffset, SEEK_SET);
+  lseek_set_or_goto_error(adb->fd, adb->header->l2normTableOffset);
   read_or_goto_error(adb->fd, dbpointers->l2norm_data, nvectors * sizeof(double));
 
   if (using_power) {
@@ -360,7 +354,7 @@
     }
     dbpointers->power_data = new double[nvectors];
     sppp = dbpointers->power_data;
-    lseek(adb->fd, adb->header->powerTableOffset, SEEK_SET);
+    lseek_set_or_goto_error(adb->fd, adb->header->powerTableOffset);
     read_or_goto_error(adb->fd, dbpointers->power_data, nvectors * sizeof(double));
   }
 
@@ -387,12 +381,7 @@
 
     dbpointers->mean_duration = new double[adb->header->numFiles];
 
-    times_table = (double *) malloc(2 * nvectors * sizeof(double));
-    if(!times_table) {
-      goto error;
-    }
-    lseek(adb->fd, adb->header->timesTableOffset, SEEK_SET);
-    read_or_goto_error(adb->fd, times_table, 2 * nvectors * sizeof(double));
+    malloc_and_fill_or_goto_error(double *, times_table, adb->header->timesTableOffset, 2 * nvectors * sizeof(double));
     for(unsigned int k = 0; k < adb->header->numFiles; k++) {
       size_t track_length = (*adb->track_lengths)[k];
       unsigned int j;
@@ -412,18 +401,10 @@
   return 0;
 
  error:
-  if(dbpointers->l2norm_data) {
-    delete [] dbpointers->l2norm_data;
-  }
-  if(dbpointers->power_data) {
-    delete [] dbpointers->power_data;
-  }
-  if(dbpointers->mean_duration) {
-    delete [] dbpointers->mean_duration;
-  }
-  if(times_table) {
-    free(times_table);
-  }
+  maybe_delete_array(dbpointers->l2norm_data);
+  maybe_delete_array(dbpointers->power_data);
+  maybe_delete_array(dbpointers->mean_duration);
+  maybe_free(times_table);
   return 1;
   
 }
@@ -613,26 +594,15 @@
  loop_finish:
 
   free(data_buffer);
-
-  // Clean up
-  if(query_data)
-    delete[] query_data;
-  if(qpointers.l2norm_data)
-    delete[] qpointers.l2norm_data;
-  if(qpointers.power_data)
-    delete[] qpointers.power_data;
-  if(qpointers.mean_duration)
-    delete[] qpointers.mean_duration;
-  if(dbpointers.power_data)
-    delete[] dbpointers.power_data;
-  if(dbpointers.l2norm_data)
-    delete[] dbpointers.l2norm_data;
-  if(D)
-    delete[] D;
-  if(DD)
-    delete[] DD;
-  if(dbpointers.mean_duration)
-    delete[] dbpointers.mean_duration;
+  maybe_delete_array(query_data);
+  maybe_delete_array(qpointers.power_data);
+  maybe_delete_array(qpointers.l2norm_data);
+  maybe_delete_array(qpointers.mean_duration);
+  maybe_delete_array(dbpointers.power_data);
+  maybe_delete_array(dbpointers.l2norm_data);
+  maybe_delete_array(dbpointers.mean_duration);
+  maybe_delete_array(D);
+  maybe_delete_array(DD);
 
   return 0;
 }