Introduce common generic header file
[librseq.git] / tests / basic_test.c
CommitLineData
90702366 1// SPDX-License-Identifier: MIT
f2d7b530 2// SPDX-FileCopyrightText: 2020 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
93da3184
MD
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
544cdc88
MJ
19#include "tap.h"
20
6e284b80 21static void test_cpu_pointer(void)
93da3184
MD
22{
23 cpu_set_t affinity, test_affinity;
544cdc88
MJ
24 int ret, i;
25
544cdc88
MJ
26 ret = sched_getaffinity(0, sizeof(affinity), &affinity);
27 ok(ret == 0, "Get current thread affinity mask");
93da3184 28
93da3184
MD
29 CPU_ZERO(&test_affinity);
30 for (i = 0; i < CPU_SETSIZE; i++) {
31 if (CPU_ISSET(i, &affinity)) {
77a5b13a
MD
32 int node;
33
93da3184 34 CPU_SET(i, &test_affinity);
544cdc88
MJ
35
36 ret = sched_setaffinity(0, sizeof(test_affinity),
93da3184 37 &test_affinity);
544cdc88
MJ
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);
77a5b13a
MD
44 node = rseq_fallback_current_node();
45 ok(rseq_fallback_current_node() == node, "rseq_fallback_current_node returns node %d", node);
93da3184
MD
46 CPU_CLR(i, &test_affinity);
47 }
48 }
544cdc88
MJ
49
50 ret = sched_setaffinity(0, sizeof(affinity), &affinity);
51 ok(ret == 0, "Restore current thread initial affinity mask");
93da3184
MD
52}
53
54int main(void)
55{
d1cdec98
MJ
56 /*
57 * Skip all tests if the rseq syscall is unavailable
58 */
8b34114a 59 if (rseq_available(RSEQ_AVAILABLE_QUERY_KERNEL)) {
d1cdec98
MJ
60 plan_no_plan();
61 } else {
62 plan_skip_all("The rseq syscall is unavailable");
63 }
544cdc88 64
93da3184 65 if (rseq_register_current_thread()) {
d1cdec98 66 fail("rseq_register_current_thread(...) failed(%d): %s\n",
93da3184 67 errno, strerror(errno));
d1cdec98
MJ
68 goto end;
69 } else {
70 pass("Registered current thread with rseq");
93da3184 71 }
544cdc88 72
93da3184 73 test_cpu_pointer();
544cdc88 74
93da3184 75 if (rseq_unregister_current_thread()) {
d1cdec98 76 fail("rseq_unregister_current_thread(...) failed(%d): %s\n",
93da3184 77 errno, strerror(errno));
d1cdec98
MJ
78 goto end;
79 } else {
80 pass("Unregistered current thread with rseq");
93da3184 81 }
544cdc88 82
d1cdec98
MJ
83end:
84 exit(exit_status());
93da3184 85}
This page took 0.026026 seconds and 4 git commands to generate.