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