Fix: `void *` arithmetic compiler warning
[librseq.git] / tests / basic_test.c
1 // SPDX-License-Identifier: MIT
2 // SPDX-FileCopyrightText: 2020 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
3 /*
4 * Basic test coverage for critical regions and rseq_current_cpu().
5 */
6
7 #ifndef _GNU_SOURCE
8 #define _GNU_SOURCE
9 #endif
10 #include <assert.h>
11 #include <sched.h>
12 #include <signal.h>
13 #include <stdio.h>
14 #include <string.h>
15 #include <sys/time.h>
16
17 #include <rseq/rseq.h>
18
19 #include "tap.h"
20
21 static void test_cpu_pointer(void)
22 {
23 cpu_set_t affinity, test_affinity;
24 int ret, i;
25
26 ret = sched_getaffinity(0, sizeof(affinity), &affinity);
27 ok(ret == 0, "Get current thread affinity mask");
28
29 CPU_ZERO(&test_affinity);
30 for (i = 0; i < CPU_SETSIZE; i++) {
31 if (CPU_ISSET(i, &affinity)) {
32 CPU_SET(i, &test_affinity);
33
34 ret = sched_setaffinity(0, sizeof(test_affinity),
35 &test_affinity);
36 ok(ret == 0, "Set affinity mask to CPU %d exclusively", i);
37
38 ok(sched_getcpu() == i, "sched_getcpu returns CPU %d", i);
39 ok(rseq_current_cpu() == (unsigned int) i, "rseq_current_cpu returns CPU %d", i);
40 ok(rseq_current_cpu_raw() == i, "rseq_current_cpu_raw returns CPU %d", i);
41 ok(rseq_cpu_start() == (unsigned int) i, "rseq_cpu_start returns CPU %d", i);
42
43 CPU_CLR(i, &test_affinity);
44 }
45 }
46
47 ret = sched_setaffinity(0, sizeof(affinity), &affinity);
48 ok(ret == 0, "Restore current thread initial affinity mask");
49 }
50
51 int main(void)
52 {
53 /*
54 * Skip all tests if the rseq syscall is unavailable
55 */
56 if (rseq_available(RSEQ_AVAILABLE_QUERY_KERNEL)) {
57 plan_no_plan();
58 } else {
59 plan_skip_all("The rseq syscall is unavailable");
60 }
61
62 if (rseq_register_current_thread()) {
63 fail("rseq_register_current_thread(...) failed(%d): %s\n",
64 errno, strerror(errno));
65 goto end;
66 } else {
67 pass("Registered current thread with rseq");
68 }
69
70 test_cpu_pointer();
71
72 if (rseq_unregister_current_thread()) {
73 fail("rseq_unregister_current_thread(...) failed(%d): %s\n",
74 errno, strerror(errno));
75 goto end;
76 } else {
77 pass("Unregistered current thread with rseq");
78 }
79
80 end:
81 exit(exit_status());
82 }
This page took 0.038661 seconds and 4 git commands to generate.