brintos

brintos / linux-shallow public Read only

0
0
Text · 1.4 KiB · 295eea1 Raw
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