basic_test.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. CPU_SET(i, &test_affinity);
  22. sched_setaffinity(0, sizeof(test_affinity),
  23. &test_affinity);
  24. assert(sched_getcpu() == i);
  25. assert(rseq_current_cpu() == i);
  26. assert(rseq_current_cpu_raw() == i);
  27. assert(rseq_cpu_start() == i);
  28. CPU_CLR(i, &test_affinity);
  29. }
  30. }
  31. sched_setaffinity(0, sizeof(affinity), &affinity);
  32. }
  33. int main(int argc, char **argv)
  34. {
  35. if (rseq_register_current_thread()) {
  36. fprintf(stderr, "Error: rseq_register_current_thread(...) failed(%d): %s\n",
  37. errno, strerror(errno));
  38. goto init_thread_error;
  39. }
  40. printf("testing current cpu\n");
  41. test_cpu_pointer();
  42. if (rseq_unregister_current_thread()) {
  43. fprintf(stderr, "Error: rseq_unregister_current_thread(...) failed(%d): %s\n",
  44. errno, strerror(errno));
  45. goto init_thread_error;
  46. }
  47. return 0;
  48. init_thread_error:
  49. return -1;
  50. }