#include #include #include #include #include #include #include #include #include #include #include #include unsigned step; void do_backtrace(void) { static void *buffer[200]; int levels = backtrace(buffer, sizeof(buffer)/sizeof(void *)); backtrace_symbols_fd(buffer, levels, STDOUT_FILENO); } void mode_switch(int sig) { printf("mode switch at step %d, test failed!\n", step); do_backtrace(); exit(EXIT_FAILURE); } int main(void) { RT_TASK task; RTIME time; pid_t pid; int rc; if ((SIG_ERR == signal(SIGXCPU, &mode_switch))) { perror("signal"); exit(EXIT_FAILURE); } pid = fork(); if (pid < 0) { perror("fork"); exit(EXIT_FAILURE); } if (pid > 0) { int status; if (waitpid(pid, &status, 0) == -1) { perror("waitpid"); exit(EXIT_FAILURE); } status = WEXITSTATUS(status); if (status == EXIT_SUCCESS) fprintf(stderr, "Test passed\n"); _exit(status); } if (mlockall(MCL_CURRENT | MCL_FUTURE)) { perror("mlockall"); exit(EXIT_FAILURE); } step = 1; if ((rc = rt_task_shadow(&task, "test_vm1", 1, 0))) { fprintf(stderr, "rt_task_shadow: %s\n", strerror(-rc)); exit(EXIT_FAILURE); } step = 2; if ((rc = rt_task_set_mode(0, T_WARNSW, NULL))) { fprintf(stderr, "rt_task_set_mode_np: %s\n", strerror(-rc)); exit(EXIT_FAILURE); } step = 3; time = rt_timer_read(); step = 4; if ((rc = rt_task_set_mode(T_PRIMARY, 0, NULL))) { fprintf(stderr, "rt_task_set_mode_np: %s\n", strerror(-rc)); exit(EXIT_FAILURE); } pid = fork(); if (pid < 0) { perror("fork"); exit(EXIT_FAILURE); } if (pid > 0) { int status; step = 5; time = rt_timer_read(); if ((rc = rt_task_set_mode(T_PRIMARY, 0, NULL))) { fprintf(stderr, "rt_task_set_mode_np: %s\n", strerror(-rc)); exit(EXIT_FAILURE); } if (waitpid(pid, &status, 0) == -1) { perror("waitpid"); exit(EXIT_FAILURE); } _exit(WEXITSTATUS(status)); } if (mlockall(MCL_CURRENT | MCL_FUTURE)) { perror("mlockall"); exit(EXIT_FAILURE); } step = 6; if ((rc = rt_task_shadow(&task, "test_vm2", 1, 0))) { fprintf(stderr, "rt_task_shadow: %s\n", strerror(-rc)); exit(EXIT_FAILURE); } step = 7; if ((rc = rt_task_set_mode(0, T_WARNSW, NULL))) { fprintf(stderr, "rt_task_set_mode_np: %s\n", strerror(-rc)); exit(EXIT_FAILURE); } step = 8; time = rt_timer_read(); if ((rc = rt_task_set_mode(T_PRIMARY, 0, NULL))) { fprintf(stderr, "rt_task_set_mode_np: %s\n", strerror(-rc)); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); }