Introduce common generic header file
[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 int node;
33
34 CPU_SET(i, &test_affinity);
35
36 ret = sched_setaffinity(0, sizeof(test_affinity),
37 &test_affinity);
38 ok(ret == 0, "Set affinity mask to CPU %d exclusively", i);
39
40 ok(sched_getcpu() == i, "sched_getcpu returns CPU %d", i);
41 ok(rseq_current_cpu() == (unsigned int) i, "rseq_current_cpu returns CPU %d", i);
42 ok(rseq_current_cpu_raw() == i, "rseq_current_cpu_raw returns CPU %d", i);
43 ok(rseq_cpu_start() == (unsigned int) i, "rseq_cpu_start returns CPU %d", i);
44 node = rseq_fallback_current_node();
45 ok(rseq_fallback_current_node() == node, "rseq_fallback_current_node returns node %d", node);
46 CPU_CLR(i, &test_affinity);
47 }
48 }
49
50 ret = sched_setaffinity(0, sizeof(affinity), &affinity);
51 ok(ret == 0, "Restore current thread initial affinity mask");
52 }
53
54 int main(void)
55 {
56 /*
57 * Skip all tests if the rseq syscall is unavailable
58 */
59 if (rseq_available(RSEQ_AVAILABLE_QUERY_KERNEL)) {
60 plan_no_plan();
61 } else {
62 plan_skip_all("The rseq syscall is unavailable");
63 }
64
65 if (rseq_register_current_thread()) {
66 fail("rseq_register_current_thread(...) failed(%d): %s\n",
67 errno, strerror(errno));
68 goto end;
69 } else {
70 pass("Registered current thread with rseq");
71 }
72
73 test_cpu_pointer();
74
75 if (rseq_unregister_current_thread()) {
76 fail("rseq_unregister_current_thread(...) failed(%d): %s\n",
77 errno, strerror(errno));
78 goto end;
79 } else {
80 pass("Unregistered current thread with rseq");
81 }
82
83 end:
84 exit(exit_status());
85 }
This page took 0.046336 seconds and 4 git commands to generate.