annotate l2norm.cpp @ 601:82d23418d867

Fix some fd leaks in the command-line binary Strictly speaking, they're not really leaks, because the only codepath that suffers from these leaks exits immediately afterwards. On the other hand, this fix makes valgrind on e.g. tests/0025 happier, going from 5 errors to none.
author mas01cr
date Fri, 14 Aug 2009 16:39:32 +0000
parents 70acfcb5010a
children
rev   line source
mas01cr@498 1 extern "C" {
mas01cr@498 2 #include "audioDB_API.h"
mas01cr@509 3 }
mas01cr@498 4 #include "audioDB-internals.h"
mas01cr@498 5
mas01cr@498 6 static int audiodb_l2norm_existing(adb_t *adb) {
mas01cr@593 7 double *data_buffer = 0, *l2norm_buffer = 0;
mas01cr@593 8 size_t data_buffer_size = align_page_up(adb->header->length);
mas01cr@593 9 size_t nvectors = adb->header->length / (sizeof(double) * adb->header->dim);
mas01cr@593 10 /* FIXME: this allocation of the vector data buffer will lose if we
mas01cr@593 11 * ever turn the l2norm flag on when we have already inserted a
mas01cr@593 12 * large number of vectors, as the malloc() will fail. "Don't do
mas01cr@593 13 * that, then" is one possible answer. */
mas01cr@593 14 data_buffer = (double *) malloc(data_buffer_size);
mas01cr@593 15 if (!data_buffer) {
mas01cr@593 16 goto error;
mas01cr@593 17 }
mas01cr@593 18 lseek_set_or_goto_error(adb->fd, adb->header->dataOffset);
mas01cr@593 19 read_or_goto_error(adb->fd, data_buffer, data_buffer_size);
mas01cr@593 20
mas01cr@498 21 l2norm_buffer = (double *) malloc(nvectors * sizeof(double));
mas01cr@498 22 if(!l2norm_buffer) {
mas01cr@498 23 goto error;
mas01cr@498 24 }
mas01cr@593 25 audiodb_l2norm_buffer(data_buffer, adb->header->dim, nvectors, l2norm_buffer);
mas01cr@593 26 lseek_set_or_goto_error(adb->fd, adb->header->l2normTableOffset);
mas01cr@498 27 write_or_goto_error(adb->fd, l2norm_buffer, nvectors * sizeof(double));
mas01cr@498 28
mas01cr@498 29 free(l2norm_buffer);
mas01cr@593 30 free(data_buffer);
mas01cr@498 31
mas01cr@498 32 return 0;
mas01cr@498 33
mas01cr@498 34 error:
mas01cr@593 35 if(data_buffer) {
mas01cr@593 36 free(data_buffer);
mas01cr@593 37 }
mas01cr@498 38 if(l2norm_buffer) {
mas01cr@498 39 free(l2norm_buffer);
mas01cr@498 40 }
mas01cr@498 41 return 1;
mas01cr@498 42 }
mas01cr@498 43
mas01cr@498 44 int audiodb_l2norm(adb_t *adb) {
mas01cr@498 45 if(!(adb->flags & O_RDWR)) {
mas01cr@498 46 return 1;
mas01cr@498 47 }
mas01cr@593 48 if(adb->header->flags & ADB_HEADER_FLAG_L2NORM) {
mas01cr@498 49 /* non-error code for forthcoming backwards-compatibility
mas01cr@498 50 * reasons */
mas01cr@498 51 return 0;
mas01cr@498 52 }
mas01cr@593 53 if((!(adb->header->flags & ADB_HEADER_FLAG_REFERENCES)) &&
mas01cr@593 54 (adb->header->length > 0)) {
mas01cr@498 55 if(audiodb_l2norm_existing(adb)) {
mas01cr@498 56 goto error;
mas01cr@498 57 }
mas01cr@498 58 }
mas01cr@509 59 adb->header->flags |= ADB_HEADER_FLAG_L2NORM;
mas01cr@498 60 return audiodb_sync_header(adb);
mas01cr@498 61
mas01cr@498 62 error:
mas01cr@498 63 return 1;
mas01cr@498 64 }