run-lock.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include <ccan/antithread/antithread.c>
  2. #include <assert.h>
  3. #include <unistd.h>
  4. #include <ccan/tap/tap.h>
  5. #define NUM_RUNS 100
  6. static void *test(struct at_pool *atp, int *val)
  7. {
  8. unsigned int i;
  9. if (at_read_parent(atp) != test) {
  10. diag("Woah, at_read said bad");
  11. return NULL;
  12. }
  13. /* We increment val, then sleep a little. */
  14. for (i = 0; i < NUM_RUNS; i++) {
  15. at_lock(val);
  16. (*(volatile int *)val)++;
  17. usleep(i * 100);
  18. at_unlock(val);
  19. usleep(i * 100);
  20. }
  21. return val;
  22. };
  23. int main(int argc, char *argv[])
  24. {
  25. struct at_pool *atp;
  26. struct athread *at;
  27. int *val, i;
  28. plan_tests(3);
  29. atp = at_pool(1*1024*1024);
  30. assert(atp);
  31. val = talloc_zero(at_pool_ctx(atp), int);
  32. at = at_run(atp, test, val);
  33. assert(at);
  34. ok1(*val == 0);
  35. at_tell(at, test);
  36. /* We increment val, then sleep a little. */
  37. for (i = 0; i < NUM_RUNS; i++) {
  38. at_lock(val);
  39. (*(volatile int *)val)++;
  40. usleep(i * 100);
  41. at_unlock(val);
  42. usleep(i * 100);
  43. }
  44. ok1(at_read(at) == val);
  45. talloc_free(at);
  46. ok1(*val == NUM_RUNS*2);
  47. return exit_status();
  48. }