Mercurial > hg > audiodb
comparison create.cpp @ 392:78fed0d4c108 api-inversion
Include some necessary information in struct adb.
Now the struct adb contains a database fd, the flags used to open that
fd (so that we can later tell if it was for write or not) and a database
header pointer.
audiodb_open() is now responsible for filling in all of that
information. To do that, it needs to take an open(2) flag; that's good,
because it means that the call to open(2) is no longer invoking
undefined behaviour. (Also, the previous version of audiodb_open()
leaked an fd). Unfortunately, that means we have broken ABI and API
compatibility. (Fortunately, we have fewer than 12 users).
Use audiodb_open() in audioDB::initDBHeader().
We've temporarily(?) put acquire_lock(int, bool) in the API header; that
means we need to include <stdbool.h> and compile C files with -std=c99.
Do so.
Make audiodb_close() free resources allocated by audiodb_open().
Include a struct adb * field in the audioDB C++ object...
... which lets us actually implement memory-correctness, by
audiodb_close()ing the database in audioDB::cleanup().
[ The lock is, I think, correctly disposed of; man fcntl(2) on Linux
says that the locks are released once any file descriptor relating to
the file is closed, and we close the fd in audiodb_close(). ]
author | mas01cr |
---|---|
date | Mon, 24 Nov 2008 15:42:15 +0000 |
parents | f20571eeb9a6 |
children | a82a2d9b2451 |
comparison
equal
deleted
inserted
replaced
391:69f8bf88c0ff | 392:78fed0d4c108 |
---|---|
24 * featureTable: list of feature file names | 24 * featureTable: list of feature file names |
25 * timesTable: list of times file names | 25 * timesTable: list of times file names |
26 * powerTable: list of power file names | 26 * powerTable: list of power file names |
27 | 27 |
28 */ | 28 */ |
29 | |
30 int acquire_lock(int, bool); | |
31 | 29 |
32 extern "C" { | 30 extern "C" { |
33 adb_t *audiodb_create(const char *path, unsigned datasize, unsigned ntracks, unsigned datadim) { | 31 adb_t *audiodb_create(const char *path, unsigned datasize, unsigned ntracks, unsigned datadim) { |
34 int fd; | 32 int fd; |
35 adb_header_t *header = 0; | 33 adb_header_t *header = 0; |
118 if (write (fd, "", 1) != 1) { | 116 if (write (fd, "", 1) != 1) { |
119 goto error; | 117 goto error; |
120 } | 118 } |
121 | 119 |
122 free(header); | 120 free(header); |
123 return audiodb_open(path); | 121 return audiodb_open(path, O_RDWR); |
124 | 122 |
125 error: | 123 error: |
126 if(header) { | 124 if(header) { |
127 free(header); | 125 free(header); |
128 } | 126 } |