61 lines · c
1// SPDX-License-Identifier: LGPL-2.12/*3 * Basic test coverage for critical regions and rseq_current_cpu().4 */5 6#define _GNU_SOURCE7#include <assert.h>8#include <sched.h>9#include <signal.h>10#include <stdio.h>11#include <string.h>12#include <sys/time.h>13 14#include "rseq.h"15 16void test_cpu_pointer(void)17{18 cpu_set_t affinity, test_affinity;19 int i;20 21 sched_getaffinity(0, sizeof(affinity), &affinity);22 CPU_ZERO(&test_affinity);23 for (i = 0; i < CPU_SETSIZE; i++) {24 if (CPU_ISSET(i, &affinity)) {25 int node;26 27 CPU_SET(i, &test_affinity);28 sched_setaffinity(0, sizeof(test_affinity),29 &test_affinity);30 assert(sched_getcpu() == i);31 assert(rseq_current_cpu() == i);32 assert(rseq_current_cpu_raw() == i);33 assert(rseq_cpu_start() == i);34 node = rseq_fallback_current_node();35 assert(rseq_current_node_id() == node);36 CPU_CLR(i, &test_affinity);37 }38 }39 sched_setaffinity(0, sizeof(affinity), &affinity);40}41 42int main(int argc, char **argv)43{44 if (rseq_register_current_thread()) {45 fprintf(stderr, "Error: rseq_register_current_thread(...) failed(%d): %s\n",46 errno, strerror(errno));47 goto init_thread_error;48 }49 printf("testing current cpu\n");50 test_cpu_pointer();51 if (rseq_unregister_current_thread()) {52 fprintf(stderr, "Error: rseq_unregister_current_thread(...) failed(%d): %s\n",53 errno, strerror(errno));54 goto init_thread_error;55 }56 return 0;57 58init_thread_error:59 return -1;60}61