X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb%2Ftest%2Frun-open-during-transaction.c;h=0c4934c5939e73f17ad2585e4b6a497550598fbe;hp=5119004b97fb6d2af561f83ced86fc9c4afa3af8;hb=b3804e47471640f1f8c15f5013a78bdbeb12f69d;hpb=9d045ca09a0b052d968e11d98540f63a8a0aa412 diff --git a/ccan/tdb/test/run-open-during-transaction.c b/ccan/tdb/test/run-open-during-transaction.c index 5119004b..0c4934c5 100644 --- a/ccan/tdb/test/run-open-during-transaction.c +++ b/ccan/tdb/test/run-open-during-transaction.c @@ -1,13 +1,14 @@ #define _XOPEN_SOURCE 500 #include +#include "lock-tracking.h" + static ssize_t pwrite_check(int fd, const void *buf, size_t count, off_t offset); static ssize_t write_check(int fd, const void *buf, size_t count); -static int fcntl_check(int fd, int cmd, ... /* arg */ ); static int ftruncate_check(int fd, off_t length); #define pwrite pwrite_check #define write write_check -#define fcntl fcntl_check +#define fcntl fcntl_with_lockcheck #define ftruncate ftruncate_check #include @@ -19,6 +20,7 @@ static int ftruncate_check(int fd, off_t length); #include #include #include +#include #include #include #include @@ -34,7 +36,7 @@ static bool snapshot_uptodate; static char *snapshot; static off_t snapshot_len; static bool clear_if_first; -#define TEST_DBNAME "/tmp/test7.tdb" +#define TEST_DBNAME "run-open-during-transaction.tdb" #undef write #undef pwrite @@ -80,7 +82,7 @@ static void check_for_agent(int fd, bool block) if (!external_agent_operation_check(agent, block, &res)) return; - if (res != 0) + if (res != 1) err(1, "Agent failed open"); agent_pending = false; @@ -106,6 +108,9 @@ static void check_for_agent(int fd, bool block) static void check_file_contents(int fd) { + if (!in_transaction) + return; + if (agent_pending) check_for_agent(fd, false); @@ -131,16 +136,14 @@ static ssize_t pwrite_check(int fd, { ssize_t ret; - if (in_transaction) - check_file_contents(fd); + check_file_contents(fd); snapshot_uptodate = false; ret = pwrite(fd, buf, count, offset); if (ret != count) return ret; - if (in_transaction) - check_file_contents(fd); + check_file_contents(fd); return ret; } @@ -148,8 +151,7 @@ static ssize_t write_check(int fd, const void *buf, size_t count) { ssize_t ret; - if (in_transaction) - check_file_contents(fd); + check_file_contents(fd); snapshot_uptodate = false; @@ -157,37 +159,7 @@ static ssize_t write_check(int fd, const void *buf, size_t count) if (ret != count) return ret; - if (in_transaction) - check_file_contents(fd); - return ret; -} - -/* This seems to be a macro for glibc... */ -extern int fcntl(int fd, int cmd, ... /* arg */ ); - -static int fcntl_check(int fd, int cmd, ... /* arg */ ) -{ - va_list ap; - int ret, arg3; - struct flock *fl; - - if (cmd != F_SETLK && cmd != F_SETLKW) { - /* This may be totally bogus, but we don't know in general. */ - va_start(ap, cmd); - arg3 = va_arg(ap, int); - va_end(ap); - - return fcntl(fd, cmd, arg3); - } - - va_start(ap, cmd); - fl = va_arg(ap, struct flock *); - va_end(ap); - - ret = fcntl(fd, cmd, fl); - - if (in_transaction && fl->l_type == F_UNLCK) - check_file_contents(fd); + check_file_contents(fd); return ret; } @@ -195,15 +167,13 @@ static int ftruncate_check(int fd, off_t length) { int ret; - if (in_transaction) - check_file_contents(fd); + check_file_contents(fd); snapshot_uptodate = false; ret = ftruncate(fd, length); - if (in_transaction) - check_file_contents(fd); + check_file_contents(fd); return ret; } @@ -219,6 +189,7 @@ int main(int argc, char *argv[]) TDB_DATA key, data; plan_tests(20); + unlock_callback = check_file_contents; agent = prepare_external_agent(); if (!agent) err(1, "preparing agent");