mas01cr@408
|
1 typedef struct adb_datum_internal {
|
mas01cr@408
|
2 uint32_t nvectors;
|
mas01cr@408
|
3 uint32_t dim;
|
mas01cr@408
|
4 const char *key;
|
mas01cr@408
|
5 void *data;
|
mas01cr@408
|
6 void *times;
|
mas01cr@408
|
7 void *power;
|
mas01cr@408
|
8 } adb_datum_internal_t;
|
mas01cr@408
|
9
|
mas01cr@402
|
10 struct adb {
|
mas01cr@402
|
11 char *path;
|
mas01cr@402
|
12 int fd;
|
mas01cr@402
|
13 int flags;
|
mas01cr@402
|
14 adb_header_t *header;
|
mas01cr@402
|
15 std::set<std::string> *keys;
|
mas01cr@402
|
16 };
|
mas01cr@402
|
17
|
mas01cr@416
|
18 typedef struct {
|
mas01cr@416
|
19 bool operator() (const adb_result_t &r1, const adb_result_t &r2) {
|
mas01cr@416
|
20 return strcmp(r1.key, r2.key) < 0;
|
mas01cr@416
|
21 }
|
mas01cr@416
|
22 } adb_result_key_lt;
|
mas01cr@416
|
23
|
mas01cr@416
|
24 typedef struct {
|
mas01cr@416
|
25 bool operator() (const adb_result_t &r1, const adb_result_t &r2) {
|
mas01cr@416
|
26 return r1.qpos < r2.qpos;
|
mas01cr@416
|
27 }
|
mas01cr@416
|
28 } adb_result_qpos_lt;
|
mas01cr@416
|
29
|
mas01cr@416
|
30 typedef struct {
|
mas01cr@416
|
31 bool operator() (const adb_result_t &r1, const adb_result_t &r2) {
|
mas01cr@416
|
32 return r1.dist < r2.dist;
|
mas01cr@416
|
33 }
|
mas01cr@416
|
34 } adb_result_dist_lt;
|
mas01cr@416
|
35
|
mas01cr@416
|
36 typedef struct {
|
mas01cr@416
|
37 bool operator() (const adb_result_t &r1, const adb_result_t &r2) {
|
mas01cr@416
|
38 return r1.dist > r2.dist;
|
mas01cr@416
|
39 }
|
mas01cr@416
|
40 } adb_result_dist_gt;
|
mas01cr@416
|
41
|
mas01cr@416
|
42 typedef struct {
|
mas01cr@416
|
43 bool operator() (const adb_result_t &r1, const adb_result_t &r2) {
|
mas01cr@416
|
44 return ((r1.ipos < r2.ipos) ||
|
mas01cr@416
|
45 ((r1.ipos == r2.ipos) &&
|
mas01cr@416
|
46 ((r1.qpos < r2.qpos) ||
|
mas01cr@416
|
47 ((r1.qpos == r2.qpos) && (strcmp(r1.key, r2.key) < 0)))));
|
mas01cr@416
|
48 }
|
mas01cr@416
|
49 } adb_result_triple_lt;
|
mas01cr@416
|
50
|
mas01cr@401
|
51 /* We could go gcc-specific here and use typeof() instead of passing
|
mas01cr@401
|
52 * in an explicit type. Answers on a postcard as to whether that's a
|
mas01cr@401
|
53 * good plan or not. */
|
mas01cr@401
|
54 #define mmap_or_goto_error(type, var, start, length) \
|
mas01cr@401
|
55 { void *tmp = mmap(0, length, PROT_READ, MAP_SHARED, adb->fd, (start)); \
|
mas01cr@401
|
56 if(tmp == (void *) -1) { \
|
mas01cr@401
|
57 goto error; \
|
mas01cr@401
|
58 } \
|
mas01cr@401
|
59 var = (type) tmp; \
|
mas01cr@401
|
60 }
|
mas01cr@401
|
61
|
mas01cr@401
|
62 #define maybe_munmap(table, length) \
|
mas01cr@401
|
63 { if(table) { \
|
mas01cr@401
|
64 munmap(table, length); \
|
mas01cr@401
|
65 } \
|
mas01cr@401
|
66 }
|
mas01cr@401
|
67
|
mas01cr@410
|
68 #define write_or_goto_error(fd, buffer, size) \
|
mas01cr@410
|
69 { ssize_t tmp = size; \
|
mas01cr@410
|
70 if(write(fd, buffer, size) != tmp) { \
|
mas01cr@410
|
71 goto error; \
|
mas01cr@410
|
72 } \
|
mas01cr@410
|
73 }
|
mas01cr@410
|
74
|
mas01cr@410
|
75 #define read_or_goto_error(fd, buffer, size) \
|
mas01cr@410
|
76 { ssize_t tmp = size; \
|
mas01cr@410
|
77 if(read(fd, buffer, size) != tmp) { \
|
mas01cr@410
|
78 goto error; \
|
mas01cr@410
|
79 } \
|
mas01cr@410
|
80 }
|
mas01cr@410
|
81
|
mas01cr@401
|
82 static inline int audiodb_sync_header(adb_t *adb) {
|
mas01cr@401
|
83 off_t pos;
|
mas01cr@401
|
84 pos = lseek(adb->fd, (off_t) 0, SEEK_CUR);
|
mas01cr@401
|
85 if(pos == (off_t) -1) {
|
mas01cr@401
|
86 goto error;
|
mas01cr@401
|
87 }
|
mas01cr@401
|
88 if(lseek(adb->fd, (off_t) 0, SEEK_SET) == (off_t) -1) {
|
mas01cr@401
|
89 goto error;
|
mas01cr@401
|
90 }
|
mas01cr@401
|
91 if(write(adb->fd, adb->header, O2_HEADERSIZE) != O2_HEADERSIZE) {
|
mas01cr@401
|
92 goto error;
|
mas01cr@401
|
93 }
|
mas01cr@401
|
94
|
mas01cr@401
|
95 /* can be fsync() if fdatasync() is racily exciting and new */
|
mas01cr@401
|
96 fdatasync(adb->fd);
|
mas01cr@401
|
97 if(lseek(adb->fd, pos, SEEK_SET) == (off_t) -1) {
|
mas01cr@401
|
98 goto error;
|
mas01cr@401
|
99 }
|
mas01cr@401
|
100 return 0;
|
mas01cr@401
|
101
|
mas01cr@401
|
102 error:
|
mas01cr@401
|
103 return 1;
|
mas01cr@401
|
104 }
|