1 #include "../common/tdb_private.h"
2 #include "../common/io.c"
3 #include "../common/tdb.c"
4 #include "../common/lock.c"
5 #include "../common/freelist.c"
6 #include "../common/traverse.c"
7 #include "../common/transaction.c"
8 #include "../common/error.c"
9 #include "../common/open.c"
10 #include "../common/check.c"
11 #include "../common/hash.c"
12 #include "../common/mutex.c"
13 #include "tap-interface.h"
15 #include <sys/types.h>
19 static TDB_DATA key
, data
;
21 static void log_fn(struct tdb_context
*tdb
, enum tdb_debug_level level
,
26 vfprintf(stderr
, fmt
, ap
);
30 static int do_child(int tdb_flags
, int to
, int from
)
32 struct tdb_context
*tdb
;
33 unsigned int log_count
;
34 struct tdb_logging_context log_ctx
= { log_fn
, &log_count
};
38 tdb
= tdb_open_ex("mutex-allrecord-trylock.tdb", 3, tdb_flags
,
39 O_RDWR
|O_CREAT
, 0755, &log_ctx
, NULL
);
40 ok(tdb
, "tdb_open_ex should succeed");
42 ret
= tdb_chainlock(tdb
, key
);
43 ok(ret
== 0, "tdb_chainlock should succeed");
45 write(to
, &c
, sizeof(c
));
47 read(from
, &c
, sizeof(c
));
49 ret
= tdb_chainunlock(tdb
, key
);
50 ok(ret
== 0, "tdb_chainunlock should succeed");
55 /* The code should barf on TDBs created with rwlocks. */
56 int main(int argc
, char *argv
[])
58 struct tdb_context
*tdb
;
59 unsigned int log_count
;
60 struct tdb_logging_context log_ctx
= { log_fn
, &log_count
};
62 pid_t child
, wait_ret
;
69 runtime_support
= tdb_runtime_check_for_robust_mutexes();
71 if (!runtime_support
) {
72 skip(1, "No robust mutex support");
76 key
.dsize
= strlen("hi");
77 key
.dptr
= discard_const_p(uint8_t, "hi");
78 data
.dsize
= strlen("world");
79 data
.dptr
= discard_const_p(uint8_t, "world");
84 tdb_flags
= TDB_INCOMPATIBLE_HASH
|
92 return do_child(tdb_flags
, fromchild
[1], tochild
[0]);
97 read(fromchild
[0], &c
, sizeof(c
));
99 tdb
= tdb_open_ex("mutex-allrecord-trylock.tdb", 0, tdb_flags
,
100 O_RDWR
|O_CREAT
, 0755, &log_ctx
, NULL
);
101 ok(tdb
, "tdb_open_ex should succeed");
103 ret
= tdb_allrecord_lock(tdb
, F_WRLCK
, TDB_LOCK_NOWAIT
, false);
104 ok(ret
== -1, "tdb_allrecord_lock (nowait) should not succeed");
106 write(tochild
[1], &c
, sizeof(c
));
108 wait_ret
= wait(&status
);
109 ok(wait_ret
== child
, "child should have exited correctly");
112 return exit_status();