Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: LGPL-2.1
0002 /*
0003  * Basic test coverage for critical regions and rseq_current_cpu().
0004  */
0005 
0006 #define _GNU_SOURCE
0007 #include <assert.h>
0008 #include <sched.h>
0009 #include <signal.h>
0010 #include <stdio.h>
0011 #include <string.h>
0012 #include <sys/time.h>
0013 
0014 #include "rseq.h"
0015 
0016 void test_cpu_pointer(void)
0017 {
0018     cpu_set_t affinity, test_affinity;
0019     int i;
0020 
0021     sched_getaffinity(0, sizeof(affinity), &affinity);
0022     CPU_ZERO(&test_affinity);
0023     for (i = 0; i < CPU_SETSIZE; i++) {
0024         if (CPU_ISSET(i, &affinity)) {
0025             CPU_SET(i, &test_affinity);
0026             sched_setaffinity(0, sizeof(test_affinity),
0027                     &test_affinity);
0028             assert(sched_getcpu() == i);
0029             assert(rseq_current_cpu() == i);
0030             assert(rseq_current_cpu_raw() == i);
0031             assert(rseq_cpu_start() == i);
0032             CPU_CLR(i, &test_affinity);
0033         }
0034     }
0035     sched_setaffinity(0, sizeof(affinity), &affinity);
0036 }
0037 
0038 int main(int argc, char **argv)
0039 {
0040     if (rseq_register_current_thread()) {
0041         fprintf(stderr, "Error: rseq_register_current_thread(...) failed(%d): %s\n",
0042             errno, strerror(errno));
0043         goto init_thread_error;
0044     }
0045     printf("testing current cpu\n");
0046     test_cpu_pointer();
0047     if (rseq_unregister_current_thread()) {
0048         fprintf(stderr, "Error: rseq_unregister_current_thread(...) failed(%d): %s\n",
0049             errno, strerror(errno));
0050         goto init_thread_error;
0051     }
0052     return 0;
0053 
0054 init_thread_error:
0055     return -1;
0056 }