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 }