| // SPDX-License-Identifier: LGPL-2.1 | |
| /* | |
| * Basic test coverage for critical regions and rseq_current_cpu(). | |
| */ | |
| #define _GNU_SOURCE | |
| #include <assert.h> | |
| #include <sched.h> | |
| #include <signal.h> | |
| #include <stdio.h> | |
| #include <string.h> | |
| #include <sys/time.h> | |
| #include "rseq.h" | |
| void test_cpu_pointer(void) | |
| { | |
| cpu_set_t affinity, test_affinity; | |
| int i; | |
| sched_getaffinity(0, sizeof(affinity), &affinity); | |
| CPU_ZERO(&test_affinity); | |
| for (i = 0; i < CPU_SETSIZE; i++) { | |
| if (CPU_ISSET(i, &affinity)) { | |
| CPU_SET(i, &test_affinity); | |
| sched_setaffinity(0, sizeof(test_affinity), | |
| &test_affinity); | |
| assert(sched_getcpu() == i); | |
| assert(rseq_current_cpu() == i); | |
| assert(rseq_current_cpu_raw() == i); | |
| assert(rseq_cpu_start() == i); | |
| CPU_CLR(i, &test_affinity); | |
| } | |
| } | |
| sched_setaffinity(0, sizeof(affinity), &affinity); | |
| } | |
| int main(int argc, char **argv) | |
| { | |
| if (rseq_register_current_thread()) { | |
| fprintf(stderr, "Error: rseq_register_current_thread(...) failed(%d): %s\n", | |
| errno, strerror(errno)); | |
| goto init_thread_error; | |
| } | |
| printf("testing current cpu\n"); | |
| test_cpu_pointer(); | |
| if (rseq_unregister_current_thread()) { | |
| fprintf(stderr, "Error: rseq_unregister_current_thread(...) failed(%d): %s\n", | |
| errno, strerror(errno)); | |
| goto init_thread_error; | |
| } | |
| return 0; | |
| init_thread_error: | |
| return -1; | |
| } |