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-trylock.tdb", 0, 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");
52 write(to
, &c
, sizeof(c
));
57 /* The code should barf on TDBs created with rwlocks. */
58 int main(int argc
, char *argv
[])
60 struct tdb_context
*tdb
;
61 unsigned int log_count
;
62 struct tdb_logging_context log_ctx
= { log_fn
, &log_count
};
64 pid_t child
, wait_ret
;
71 runtime_support
= tdb_runtime_check_for_robust_mutexes();
73 if (!runtime_support
) {
74 skip(1, "No robust mutex support");
78 key
.dsize
= strlen("hi");
79 key
.dptr
= discard_const_p(uint8_t, "hi");
80 data
.dsize
= strlen("world");
81 data
.dptr
= discard_const_p(uint8_t, "world");
86 tdb_flags
= TDB_INCOMPATIBLE_HASH
|
94 return do_child(tdb_flags
, fromchild
[1], tochild
[0]);
99 read(fromchild
[0], &c
, sizeof(c
));
101 tdb
= tdb_open_ex("mutex-trylock.tdb", 0, tdb_flags
,
102 O_RDWR
|O_CREAT
, 0755, &log_ctx
, NULL
);
103 ok(tdb
, "tdb_open_ex should succeed");
105 ret
= tdb_chainlock_nonblock(tdb
, key
);
106 ok(ret
== -1, "tdb_chainlock_nonblock should not succeed");
108 write(tochild
[1], &c
, sizeof(c
));
110 read(fromchild
[0], &c
, sizeof(c
));
112 ret
= tdb_chainlock_nonblock(tdb
, key
);
113 ok(ret
== 0, "tdb_chainlock_nonblock should succeed");
114 ret
= tdb_chainunlock(tdb
, key
);
115 ok(ret
== 0, "tdb_chainunlock should succeed");
117 wait_ret
= wait(&status
);
118 ok(wait_ret
== child
, "child should have exited correctly");
121 return exit_status();