basic_test.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // SPDX-License-Identifier: LGPL-2.1
  2. /*
  3. * Basic test coverage for critical regions and rseq_current_cpu().
  4. */
  5. #define _GNU_SOURCE
  6. #include <assert.h>
  7. #include <sched.h>
  8. #include <signal.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <sys/time.h>
  12. #include "rseq.h"
  13. void test_cpu_pointer(void)
  14. {
  15. cpu_set_t affinity, test_affinity;
  16. int i;
  17. sched_getaffinity(0, sizeof(affinity), &affinity);
  18. CPU_ZERO(&test_affinity);
  19. for (i = 0; i < CPU_SETSIZE; i++) {
  20. if (CPU_ISSET(i, &affinity)) {
  21. int node;
  22. CPU_SET(i, &test_affinity);
  23. sched_setaffinity(0, sizeof(test_affinity),
  24. &test_affinity);
  25. assert(sched_getcpu() == i);
  26. assert(rseq_current_cpu() == i);
  27. assert(rseq_current_cpu_raw() == i);
  28. assert(rseq_cpu_start() == i);
  29. node = rseq_fallback_current_node();
  30. assert(rseq_current_node_id() == node);
  31. CPU_CLR(i, &test_affinity);
  32. }
  33. }
  34. sched_setaffinity(0, sizeof(affinity), &affinity);
  35. }
  36. int main(int argc, char **argv)
  37. {
  38. if (rseq_register_current_thread()) {
  39. fprintf(stderr, "Error: rseq_register_current_thread(...) failed(%d): %s\n",
  40. errno, strerror(errno));
  41. goto init_thread_error;
  42. }
  43. printf("testing current cpu\n");
  44. test_cpu_pointer();
  45. if (rseq_unregister_current_thread()) {
  46. fprintf(stderr, "Error: rseq_unregister_current_thread(...) failed(%d): %s\n",
  47. errno, strerror(errno));
  48. goto init_thread_error;
  49. }
  50. return 0;
  51. init_thread_error:
  52. return -1;
  53. }