annotate l2norm.cpp @ 507:e7fd50483311

Free bits of the datum constructed in audioDB::query. We're not quite safe: error calls between allocation of some of these bits and pieces and their use will cause failure... but not freeing things here is definitely wrong.
author mas01cr
date Tue, 13 Jan 2009 21:37:10 +0000
parents 342822c2d49a
children cc2b97d020b1
rev   line source
mas01cr@498 1 #include "audioDB.h"
mas01cr@498 2 extern "C" {
mas01cr@498 3 #include "audioDB_API.h"
mas01cr@498 4 #include "audioDB-internals.h"
mas01cr@498 5 }
mas01cr@498 6
mas01cr@498 7 static int audiodb_l2norm_existing(adb_t *adb) {
mas01cr@498 8 double *data_buffer, *l2norm_buffer;
mas01cr@498 9 adb_header_t *header = adb->header;
mas01cr@498 10 size_t data_buffer_size = ALIGN_PAGE_UP(header->length);
mas01cr@498 11 size_t nvectors = header->length / (sizeof(double) * header->dim);
mas01cr@498 12 /* FIXME: this map of the vector data will lose if we ever turn the
mas01cr@498 13 * l2norm flag on when we have already inserted a large number of
mas01cr@498 14 * vectors, as the mmap() will fail. "Don't do that, then" is one
mas01cr@498 15 * possible answer. */
mas01cr@498 16 mmap_or_goto_error(double *, data_buffer, header->dataOffset, data_buffer_size);
mas01cr@498 17 l2norm_buffer = (double *) malloc(nvectors * sizeof(double));
mas01cr@498 18 if(!l2norm_buffer) {
mas01cr@498 19 goto error;
mas01cr@498 20 }
mas01cr@498 21 audiodb_l2norm_buffer(data_buffer, header->dim, nvectors, l2norm_buffer);
mas01cr@498 22 if(lseek(adb->fd, adb->header->l2normTableOffset, SEEK_SET) == (off_t) -1) {
mas01cr@498 23 goto error;
mas01cr@498 24 }
mas01cr@498 25 write_or_goto_error(adb->fd, l2norm_buffer, nvectors * sizeof(double));
mas01cr@498 26
mas01cr@498 27 munmap(data_buffer, data_buffer_size);
mas01cr@498 28 free(l2norm_buffer);
mas01cr@498 29
mas01cr@498 30 return 0;
mas01cr@498 31
mas01cr@498 32 error:
mas01cr@498 33 maybe_munmap(data_buffer, data_buffer_size);
mas01cr@498 34 if(l2norm_buffer) {
mas01cr@498 35 free(l2norm_buffer);
mas01cr@498 36 }
mas01cr@498 37 return 1;
mas01cr@498 38 }
mas01cr@498 39
mas01cr@498 40 int audiodb_l2norm(adb_t *adb) {
mas01cr@498 41 adb_header_t *header = adb->header;
mas01cr@498 42 if(!(adb->flags & O_RDWR)) {
mas01cr@498 43 return 1;
mas01cr@498 44 }
mas01cr@498 45 if(header->flags & O2_FLAG_L2NORM) {
mas01cr@498 46 /* non-error code for forthcoming backwards-compatibility
mas01cr@498 47 * reasons */
mas01cr@498 48 return 0;
mas01cr@498 49 }
mas01cr@498 50 if((!(header->flags & O2_FLAG_LARGE_ADB)) && (header->length > 0)) {
mas01cr@498 51 if(audiodb_l2norm_existing(adb)) {
mas01cr@498 52 goto error;
mas01cr@498 53 }
mas01cr@498 54 }
mas01cr@498 55 adb->header->flags |= O2_FLAG_L2NORM;
mas01cr@498 56 return audiodb_sync_header(adb);
mas01cr@498 57
mas01cr@498 58 error:
mas01cr@498 59 return 1;
mas01cr@498 60 }