run-lockall.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include <ccan/tdb2/private.h>
  2. #include <unistd.h>
  3. #include "lock-tracking.h"
  4. #define fcntl fcntl_with_lockcheck
  5. #include "tdb2-source.h"
  6. #include <ccan/tap/tap.h>
  7. #include <stdlib.h>
  8. #include <stdbool.h>
  9. #include <stdarg.h>
  10. #include <err.h>
  11. #include "external-agent.h"
  12. #include "logging.h"
  13. #define TEST_DBNAME "run-lockall.tdb"
  14. #undef fcntl
  15. int main(int argc, char *argv[])
  16. {
  17. struct agent *agent;
  18. const int flags[] = { TDB_DEFAULT,
  19. TDB_NOMMAP,
  20. TDB_CONVERT,
  21. TDB_CONVERT | TDB_NOMMAP };
  22. int i;
  23. plan_tests(13 * sizeof(flags)/sizeof(flags[0]) + 1);
  24. agent = prepare_external_agent();
  25. if (!agent)
  26. err(1, "preparing agent");
  27. for (i = 0; i < sizeof(flags)/sizeof(flags[0]); i++) {
  28. enum agent_return ret;
  29. struct tdb_context *tdb;
  30. tdb = tdb_open(TEST_DBNAME, flags[i],
  31. O_RDWR|O_CREAT|O_TRUNC, 0600, &tap_log_attr);
  32. ok1(tdb);
  33. ret = external_agent_operation(agent, OPEN, TEST_DBNAME);
  34. ok1(ret == SUCCESS);
  35. ok1(tdb_lockall(tdb) == TDB_SUCCESS);
  36. ok1(external_agent_operation(agent, STORE, "key")
  37. == WOULD_HAVE_BLOCKED);
  38. ok1(external_agent_operation(agent, FETCH, "key")
  39. == WOULD_HAVE_BLOCKED);
  40. /* Test nesting. */
  41. ok1(tdb_lockall(tdb) == TDB_SUCCESS);
  42. tdb_unlockall(tdb);
  43. tdb_unlockall(tdb);
  44. ok1(external_agent_operation(agent, STORE, "key") == SUCCESS);
  45. ok1(tdb_lockall_read(tdb) == TDB_SUCCESS);
  46. ok1(external_agent_operation(agent, STORE, "key")
  47. == WOULD_HAVE_BLOCKED);
  48. ok1(external_agent_operation(agent, FETCH, "key") == SUCCESS);
  49. ok1(tdb_lockall_read(tdb) == TDB_SUCCESS);
  50. tdb_unlockall_read(tdb);
  51. tdb_unlockall_read(tdb);
  52. ok1(external_agent_operation(agent, STORE, "key") == SUCCESS);
  53. ok1(external_agent_operation(agent, CLOSE, NULL) == SUCCESS);
  54. tdb_close(tdb);
  55. }
  56. free_external_agent(agent);
  57. ok1(tap_log_messages == 0);
  58. return exit_status();
  59. }